log4cplus原始用法(eg:LOG4CPLUS_DEBUG())不方便的可以进行二次封装。参考了下其他道友的然后自己封装了一个简单的类 :
说明:测试在ubuntu Qt上面测试通过,windows我没有测试如果需要自行修改也可以下方留言避免踩坑(应该可以用)
#ifndef SLOG_H
#define SLOG_H
/// 包裹类
/// @note 在程序启动的时候调用Logger::Start方法,例如:
/// Log.init("slog.properties");
/// 打日志的示例如下:
/// Log.Debug("Debug log[%d]", 100);
/// [可以自定义不同格式]
///
///
#if defined(__linux__)
#define VSPRINTF vsnprintf
#elif defined(_WIN32)
#define VSPRINTF _vsnprintf
#endif
class Slog
{
public:
Slog();
virtual ~Slog();
/// 启动日志系统
/// @param[in] properties_filename 日志系统配置文件文件名
/// log种类和属性都在配置文件中设置
void init(const char* properties_filename);
public:
void Debug(const char* pFormat, ...);
void Error(const char* pFormat, ...);
void Fatal(const char* pFormat, ...);
void Info(const char* pFormat, ...);
void Warn(const char* pFormat, ...);
void Trace(const char* pFormat, ...);
public:
static inline Slog* getSingletonPtr()
{
return &getSingleton();
}
static inline Slog& getSingleton()
{
static Slog _instance;
return _instance;
}
};
#define Log Slog::getSingleton()
#define Plog Slog::getSingleton()
//
// 断言日志
//
#define ASSERT_LOG(expr)\
if ( (expr) ) {;} else g_Logger.Error(__FILE__, __LINE__, #expr);
//
// 以下的宏只有VS2005以及之上的版本可以使用!因为VS2005之下的版本不支持可变参数宏
//
#if defined(_MSC_VER) && _MSC_VER > 1400
#define LOG_DEBUG(...) g_Logger.Debug(__VA_ARGS__);
#define LOG_ERROR(...) g_Logger.Error(__VA_ARGS__);
#define LOG_FATAL(...) g_Logger.Fatal(__VA_ARGS__);
#define LOG_INFO(...) g_Logger.Info(__VA_ARGS__);
#define LOG_WARN(...) g_Logger.Warn(__VA_ARGS__);
#define LOG_TRACE(...) g_Logger.Trace(__VA_ARGS__);
#elif defined(__linux__)
#define LOG_DEBUG(...) g_Logger.Debug(__VA_ARGS__);
#define LOG_ERROR(...) g_Logger.Error(__VA_ARGS__);
#define LOG_FATAL(...) g_Logger.Fatal(__VA_ARGS__);
#define LOG_INFO(...) g_Logger.Info(__VA_ARGS__);
#define LOG_WARN(...) g_Logger.Warn(__VA_ARGS__);
#define LOG_TRACE(...) g_Logger.Trace(__VA_ARGS__);
#endif
#endif // SLOG_H
/**********************************************************************
* Copyright (C) 2018 - - All Rights Reserved
*
* 文件名称: slog.cpp
* 摘 要: 日志包裹类,日志模块的接口
*
* 作 者: xuqiang918
* 修 改: 查看文件最下方.
*
***********************************************************************/
#include "slog.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace log4cplus;
using namespace log4cplus::helpers;
Slog::Slog()
{
}
Slog::~Slog()
{
log4cplus::Logger _logger = log4cplus::Logger::getInstance("global");
LOG4CPLUS_INFO(_logger, "Slog System Stop Finish...");
_logger.shutdown();
}
#define DO_LOGGER(logLevel, pFormat, bufSize)\
log4cplus::Logger _logger = log4cplus::Logger::getInstance("global");\
\
if(_logger.isEnabledFor(logLevel))\
{ \
va_list args; \
va_start(args, pFormat); \
char buf[bufSize] = {0}; \
VSPRINTF(buf, sizeof(buf), pFormat, args); \
va_end(args); \
_logger.forcedLog(logLevel, buf); \
}
void Slog::Debug(const char* pFormat, ...)
{
DO_LOGGER(log4cplus::DEBUG_LOG_LEVEL, pFormat, 1024);
}
void Slog::Error(const char* pFormat, ...)
{
DO_LOGGER(log4cplus::ERROR_LOG_LEVEL, pFormat, 256);
}
void Slog::Fatal(const char* pFormat, ... )
{
DO_LOGGER(log4cplus::FATAL_LOG_LEVEL, pFormat, 256);
}
void Slog::Info( const char* pFormat, ...)
{
DO_LOGGER(log4cplus::INFO_LOG_LEVEL, pFormat, 512);
}
void Slog::Warn( const char* pFormat, ...)
{
DO_LOGGER(log4cplus::WARN_LOG_LEVEL, pFormat, 256);
}
void Slog::Trace(const char* pFormat, ...)
{
DO_LOGGER(log4cplus::TRACE_LOG_LEVEL, pFormat, 1024);
}
void Slog::init( const char* properties_filename )
{
if (properties_filename==NULL) return;
log4cplus::initialize();
log4cplus::PropertyConfigurator::doConfigure(properties_filename);
log4cplus::Logger _logger = log4cplus::Logger::getInstance("global");
LOG4CPLUS_INFO(_logger, "Logger system start finish.");
}
## synchronous log properties. 同步
log4cplus.logger.global = INFO, SA
log4cplus.appender.SA=log4cplus::DailyRollingFileAppender
log4cplus.appender.SA.Schedule=HOURLY
log4cplus.appender.SA.DatePattern=%Y-%m-%d:%H
log4cplus.appender.SA.File= ./slog.log
log4cplus.appender.SA.MaxBackupIndex=100
log4cplus.appender.SA.BufferSize=131072
log4cplus.appender.SA.Append=true
log4cplus.appender.SA.layout=log4cplus::PatternLayout
log4cplus.appender.SA.layout.ConversionPattern=%D{%Y-%m-%d %H:%M:%S,%Q} [%l] %-5p %m%n
## asynchronous log properties.异步
log4cplus.logger.global = INFO, AA
log4cplus.appender.AA=log4cplus::AsyncAppender
log4cplus.appender.AA.QueueLimit=10000
log4cplus.appender.AA.Appender=log4cplus::DailyRollingFileAppender
log4cplus.appender.AA.Appender.Schedule=HOURLY
log4cplus.appender.AA.Appender.Threshold = INFO
log4cplus.appender.AA.Appender.DatePattern=%Y-%m-%d-%H
log4cplus.appender.AA.Appender.File=./logger_test.log
log4cplus.appender.AA.Appender.ImmediateFlush=false
log4cplus.appender.AA.Appender.MaxFileSize=1000MB
log4cplus.appender.AA.Appender.MaxBackupIndex=100
log4cplus.appender.AA.Appender.Append=true
log4cplus.appender.AA.Appender.layout=log4cplus::PatternLayout
log4cplus.appender.AA.Appender.layout.ConversionPattern=%D{%Y-%m-%d %H:%M:%S,%Q} [%t] %-5p %m%n
Log.init("slog.properties");
Log.Debug("Debug log[%d]", 10000);
Log.Error("Debug log[%d]", 10000);
Log.Info("Debug log[%d]", 10000);
Log.Fatal("Debug log[%d]", 10000);
2018-07-27 10:02:24,795.523 [/media/xuqiang/文档/workspace/Qt/Signals2/slog.cpp:96] INFO Logger system start finish.
2018-07-27 10:02:24,795.554 [/media/xuqiang/文档/workspace/Qt/Signals2/slog.cpp:67] ERROR Debug log[10000]
2018-07-27 10:02:24,795.560 [/media/xuqiang/文档/workspace/Qt/Signals2/slog.cpp:77] INFO Debug log[10000]
2018-07-27 10:02:24,795.563 [/media/xuqiang/文档/workspace/Qt/Signals2/slog.cpp:72] FATAL Debug log[10000]
2018-07-27 10:02:24,795.567 [/media/xuqiang/文档/workspace/Qt/Signals2/slog.cpp:41] INFO Slog System Stop Finish...