目录
1 概述
基于easylogging++,单例封装。使用谷歌C++编码规范。easylogging++短小精悍,屡试不爽,在此不作过多介绍。
2 实现
先到
https://gitee.com/mirrors/easylogging/tree/master/src
或者
https://github.com/amrayn/easyloggingpp
下载easylogging++源码,就一个头文件和一个源文件,直接包含到工程内。
2.1 logger.h
// logger.h
// ...
//
// Created by xxx on 2021/3/28.
// Copyright 2021 xxx, Inc. All rights reserved.
//
#ifndef LOGGER_LOGGER_H_
#define LOGGER_LOGGER_H_
#include <memory>
#ifndef LOGGING
#define LOGGING Logger::self()
#endif
enum LogLevel {
L_INFO = 0,
L_DEBUG = 1,
L_ERROR = 2,
L_WARNING = 3
};
class Logger {
public:
static std::shared_ptr<Logger> self();
~Logger();
void Log(LogLevel level, const char *format, ...);
private:
Logger();
Logger(const Logger&) {}
Logger & operator=(const Logger &) {}
private:
static std::shared_ptr<Logger> self_;
};
#endif // LOGGER_LOGGER_H_
2.2 logger.cpp
// logger.cpp
// ...
//
// Created by xxx on 2021/3/28.
// Copyright 2021 xxx, Inc. All rights reserved.
//
#include "logger/logger.h"
#include "easyloggingpp/easylogging++.h"
INITIALIZE_EASYLOGGINGPP
std::shared_ptr<Logger> Logger::self_ = nullptr;
std::shared_ptr<Logger> Logger::self() {
if (self_ == nullptr) {
self_ = std::shared_ptr<Logger>(new Logger());
}
return self_;
}
Logger::Logger() {
el::Configurations conf("etc/app_log.conf");
el::Loggers::reconfigureAllLoggers(conf);
}
Logger::~Logger() {
}
void Logger::Log(LogLevel level, const char *format, ...) {
el::Logger* logger = el::Loggers::getLogger("default");
if (logger == nullptr)
return;
if (format == nullptr)
return;
int max_log_size = logger->typedConfigurations()->maxLogFileSize(
el::Level::Global);
switch (level) {
case L_INFO:
max_log_size = logger->typedConfigurations()->maxLogFileSize(
el::Level::Info);
break;
case L_DEBUG:
max_log_size = logger->typedConfigurations()->maxLogFileSize(
el::Level::Debug);
break;
case L_WARNING:
max_log_size = logger->typedConfigurations()->maxLogFileSize(
el::Level::Warning);
break;
case L_ERROR:
max_log_size = logger->typedConfigurations()->maxLogFileSize(
el::Level::Error);
break;
default:
break;
}
char *str = new char[max_log_size];
if (str == nullptr)
return;
memset(str, 0, max_log_size);
va_list ap;
va_start(ap, format);
vsnprintf(str, max_log_size, format, ap);
va_end(ap);
switch (level) {
case L_INFO:
LOG(INFO) << str;
break;
case L_DEBUG:
LOG(DEBUG) << str;
break;
case L_WARNING:
LOG(WARNING) << str;
break;
case L_ERROR:
LOG(ERROR) << str;
break;
default:
break;
}
delete[] str;
}
2.3 app_log.conf
* GLOBAL:
ENABLED = true
TO_FILE = true
TO_STANDARD_OUTPUT = true
FORMAT = "%datetime{%H:%m:%s:%g} [%level] %msg"
FILENAME = "log/%datetime{%Y-%M-%d}.log"
MILLISECONDS_WIDTH = 3
PERFORMANCE_TRACKING = false
MAX_LOG_FILE_SIZE = 1048576
LOG_FLUSH_THRESHOLD = 0
* TRACE:
FILENAME = "log/%datetime{%Y-%M-%d}.log"
* DEBUG:
FILENAME = "log/%datetime{%Y-%M-%d}.log"
* FATAL:
ENABLED = false
* ERROR:
FILENAME = "log/%datetime{%Y-%M-%d}.log"
* WARNING:
FILENAME = "log/%datetime{%Y-%M-%d}.log"
* INFO:
FILENAME = "log/%datetime{%Y-%M-%d}.log"
* VERBOSE:
ENABLED = false
3 使用示例
// main.cpp
// ...
//
// Created by xxx on 2021/3/28.
// Copyright 2021 xxx, Inc. All rights reserved.
//
#include "logger/logger.h"
int main(int argc , char *argv[]) {
LOGGING->Log(L_INFO , "application start...");
// other
LOGGING->Log(L_INFO , "application end");
return 0;
}
版权声明:本文为w1820020635原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。