• 转 c++开源日志库log4cplus 封装


    1. 简介
    log4cplus是C++编写的开源的日志系统,The purpose of this project is to port the excellentLog for Java(log4j)logging library to C++
    log4cplus具有灵活、强大、使用简单、多线程安全的特点,实在是杂牌军、游击队的福音。

    2. 安装使用(Linux)
    log4cplus安装使用非常简单,从其官网:http://log4cplus.sourceforge.net/ 下载最新版本
    运行:
    tar xvzf log4cplus-x.x.x.tar.gz
    cd log4cplus-x.x.x
    ./configure --prefix=/where/to/install
    make
    make install
    在安装目录下生成include和lib两个文件夹,分别为头文件和库文件
    使用:
    g++ -o server   /mnt/hgfs/work_vm/project/work_project/server/obj/main.o   -Lhttp://www.cnblogs.com//third/log4cplus/lib/ -Lhttp://www.cnblogs.com//third/boost/lib/-llog4cplus -lpthread -I/mnt/hgfs/work_vm/project/work_project/server/include -Ihttp://www.cnblogs.com//third/log4cplus/include/-Ihttp://www.cnblogs.com//third/boost/include/
    编译参数:
    -Lhttp://www.cnblogs.com//third/log4cplus/lib/
    -llog4cplus 
    -lpthread
    -Ihttp://www.cnblogs.com//third/log4cplus/include/

    3. 使用
    log4cplus主要包括layout、appender、loglevel等内容,可以参考:
    http://masterdog.bokee.com/153892.html
    写的非常nice

    4. 包装
    logcplus包装下用起来非常方便,以下是我的包装,供参考
    Log.h

    1. // Log.h: interface for the Log class.  
    2. //  
    3. //////////////////////////////////////////////////////////////////////  
    4.   
    5. #if !defined(AFX_LOG_H__B87F71E3_FFAE_4CFA_A528_3F4F2FF7D69E__INCLUDED_)  
    6. #define AFX_LOG_H__B87F71E3_FFAE_4CFA_A528_3F4F2FF7D69E__INCLUDED_  
    7.   
    8. #include "log4cplus/loglevel.h"  
    9. #include "log4cplus/ndc.h"   
    10. #include "log4cplus/logger.h"  
    11. #include "log4cplus/configurator.h"  
    12. #include "iomanip"  
    13. #include "log4cplus/fileappender.h"  
    14. #include "log4cplus/layout.h"  
    15.   
    16. #include "const.h"  
    17. #include "common.h"  
    18. #include "Main_config.h"  
    19.   
    20. using namespace log4cplus;  
    21. using namespace log4cplus::helpers;  
    22.   
    23. //日志封装  
    24. #define TRACE(p) LOG4CPLUS_TRACE(Log::_logger, p)  
    25. #define DEBUG(p) LOG4CPLUS_DEBUG(Log::_logger, p)  
    26. #define NOTICE(p) LOG4CPLUS_INFO(Log::_logger, p)  
    27. #define WARNING(p) LOG4CPLUS_WARN(Log::_logger, p)  
    28. #define FATAL(p) LOG4CPLUS_ERROR(Log::_logger, p)  
    29.   
    30. // 日志控制类,全局共用一个日志  
    31. class Log  
    32. {  
    33. public:  
    34.     // 打开日志  
    35.     bool open_log();  
    36.   
    37.     // 获得日志实例  
    38.     static Log& instance();  
    39.       
    40.     static Logger _logger;  
    41.   
    42. private:  
    43.     Log();  
    44.   
    45.     virtual ~Log();  
    46.   
    47.     //log文件路径及名称  
    48.     char _log_path[PATH_SIZE];  
    49.     char _log_name[PATH_SIZE];  
    50. };  
    51.   
    52. #endif // !defined(AFX_LOG_H__B87F71E3_FFAE_4CFA_A528_3F4F2FF7D69E__INCLUDED_)  


    Log.cpp:

    1. // Log.cpp: implementation of the Log class.  
    2. //  
    3. //////////////////////////////////////////////////////////////////////  
    4.   
    5. #include "Log.h"  
    6.   
    7. //////////////////////////////////////////////////////////////////////  
    8. // Construction/Destruction  
    9. //////////////////////////////////////////////////////////////////////  
    10.   
    11. Logger Log::_logger = log4cplus::Logger::getInstance("main_log");  
    12.   
    13. Log::Log()  
    14. {  
    15.     snprintf(_log_path, sizeof(_log_path), "%s""../log");  
    16.     snprintf(_log_name, sizeof(_log_name), "%s/%s.%s", _log_path, execname, "log");  
    17. }  
    18.   
    19. Log::~Log()  
    20. {  
    21. }  
    22.   
    23. Log& Log::instance()  
    24. {  
    25.     static Log log;  
    26.     return log;  
    27. }  
    28.   
    29. bool Log::open_log()  
    30. {  
    31.       
    32.     int Log_level = Main_config::instance().get_config().Read("LOG_LEVEL", 0);    
    33.   
    34.     /* step 1: Instantiate an appender object */  
    35.     SharedAppenderPtr _append(new FileAppender(_log_name));  
    36.     _append->setName("file log test");  
    37.   
    38.     /* step 2: Instantiate a layout object */  
    39.     std::string pattern = "[%p] [%d{%m/%d/%y %H:%M:%S}] [%t] - %m %n";  
    40.     std::auto_ptr<Layout> _layout(new PatternLayout(pattern));  
    41.   
    42.     /* step 3: Attach the layout object to the appender */  
    43.     _append->setLayout(_layout);  
    44.   
    45.     /* step 4: Instantiate a logger object */  
    46.   
    47.     /* step 5: Attach the appender object to the logger  */  
    48.     Log::_logger.addAppender(_append);  
    49.   
    50.     /* step 6: Set a priority for the logger  */  
    51.     Log::_logger.setLogLevel(Log_level);  
    52.   
    53.     return true;  
    54. }  

    int Log_level = Main_config::instance().get_config().Read("LOG_LEVEL", 0); 

    Main_config是我自己包装的一个配置类(参考:http://blog.csdn.net/yfkiss/article/details/6802451),通过读取配置设置log level。

    使用:
    #inlucde "Log.h"
    程序初始化的时候:
        // 打开日志
        if (!Log::instance().open_log())
        {
            std::cout << "Log::open_log() failed" << std::endl;
            return false;
        }
    然后使用NOTICE、FATAL等就可以打印日志到文件。

    1. #include "Log.h"  
    2. ....  
    3.     // 打开日志  
    4.     if (!Log::instance().open_log())  
    5.     {  
    6.         std::cout << "Log::open_log() failed" << std::endl;  
    7.         return false;  
    8.     }  
    9. .....  
    10. NOTICE("Server init succ");  
    11. FATAL("Server run failed");  
  • 相关阅读:
    交叉熵的数学原理及应用——pytorch中的CrossEntropyLoss()函数
    pytorch中如何使用DataLoader对数据集进行批处理
    Pytorch中的自动求导函数backward()所需参数含义
    Pytorch中的torch.cat()函数
    Pytorch中的squeeze()和unsqueeze()函数
    UBUNTU18.04安装网易云音乐并直接图标启动
    UBUNTU18.4环境下使用更好用的搜索引擎(无奈,只能起这样的标题)
    Ubuntu 18.04换国内源 中科大源 阿里源 163源 清华源
    共享栈
    C++(十七) — 宏代码、内联函数
  • 原文地址:https://www.cnblogs.com/rosesmall/p/2469819.html
Copyright © 2020-2023  润新知