log4cplus封装

1.前言

log4cplus原始用法(eg:LOG4CPLUS_DEBUG())不方便的可以进行二次封装。参考了下其他道友的然后自己封装了一个简单的类 :

说明:测试在ubuntu Qt上面测试通过,windows我没有测试如果需要自行修改也可以下方留言避免踩坑(应该可以用)

2.头文件slog.h

#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

3.slog.cpp文件


/**********************************************************************
* Copyright (C) 2018 -  - All Rights Reserved
*
* 文件名称:        slog.cpp
* 摘    要:        日志包裹类,日志模块的接口
*
* 作    者:       xuqiang918
* 修    改:       查看文件最下方.
*
***********************************************************************/

#include "slog.h"

#include <stdio.h>
#include <log4cplus/logger.h>
#include <log4cplus/loggingmacros.h>
#include <log4cplus/consoleappender.h>
#include <log4cplus/config.hxx>
#include <log4cplus/logger.h>
#include <log4cplus/configurator.h>
#include <log4cplus/helpers/loglog.h>
#include <log4cplus/helpers/stringhelper.h>
#include <log4cplus/helpers/socket.h>
#include <log4cplus/spi/loggerimpl.h>
#include <log4cplus/spi/loggingevent.h>

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.");
}

4.slog.properties文件

## 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

5.测试代码

    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);

6.测试结果

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...

猜你喜欢

转载自blog.csdn.net/xuqiang918/article/details/81232131