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

 

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值