C++ log4cpp简单封装

log4cpp简介

log4cpp有三个组件:Category、Appender、Layout。

  1. Category:控制日志输出级别 (或许不准确,但暂时这么理解吧… O(∩_∩)O哈哈~)
  2. Appender:挂接器,与布局器紧密配合,将特定格式的消息输出到所挂接的设备终端(如控制台、文件、服务器等)。
  3. Layout:布局器,控制输出消息的格式。log4cplus提供了三种类型的Layouts,
    分别是SimpleLayout、PatternLayout、和TTCCLayout。

使用步骤

  1. 首先创建一个Category根:log4cpp::Category* root; root = &log4cpp::Category::getRoot();
  2. 创建一个挂接器appender:fileAppender = new log4cpp::FileAppender("fileAppender", logFileName);
  3. 创建一个布局器PatternLayout:filePtnLyt = new log4cpp::PatternLayout(); 并设置日志格式:filePtnLyt->setConversionPattern("[%-6p][%d]: %m%n");
  4. 将布局器layout绑定到appender对象上:fileAppender->setLayout(filePtnLyt);
  5. 将appender对象附加到Category根上:root->addAppender(osAppender);
  6. 设置日志级别:root->setPriority(log4cpp::Priority::DEBUG);

示例

/* log4cpp_demo.h */
#include <iostream>
#include <iomanip>
#include <log4cpp/Category.hh>
#include <log4cpp/BasicLayout.hh>
#include <log4cpp/PatternLayout.hh>
#include <log4cpp/OstreamAppender.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/RollingFileAppender.hh>
#include <log4cpp/SimpleLayout.hh>

class TLogger{
public:
    TLogger(const std::string& name);
    ~TLogger();
    void logDebug(const std::string& msg);
    void logInfo(const std::string& msg);
    void logWarn(const std::string& msg);
    void logError(const std::string& msg);
    void logCrit(const std::string& msg);
    void logAlert(const std::string& msg);
    void logEmerg(const std::string& msg);
    void logNotice(const std::string& msg);

    void shutdown();

private:
    const std::string logFileName = "test.log";
    log4cpp::Category* root;
    log4cpp::PatternLayout* filePtnLyt;
    log4cpp::PatternLayout* consolePtnLyt;
    log4cpp::FileAppender* fileAppender;
    log4cpp::OstreamAppender* osAppender;
    log4cpp::RollingFileAppender* rollingAppender;
    log4cpp::PatternLayout* rollingPtnLyt;

    void _debug(const std::string& msg);
    void _info(const std::string& msg);
    void _warn(const std::string& msg);
    void _error(const std::string& msg);
    void _crit(const std::string& msg);
    void _alert(const std::string& msg);
    void _emerg(const std::string& msg);
    void _notice(const std::string& msg);
};
/* log4cpp_demo.cpp */
#include "log4cpp_demo.h"

TLogger::TLogger(const std::string& name){
    root = &log4cpp::Category::getRoot();
    // 日志输出到文件
    fileAppender = new log4cpp::FileAppender("fileAppender", logFileName);
    filePtnLyt = new log4cpp::PatternLayout();
    filePtnLyt->setConversionPattern("[%-6p][%d]: %m%n");
    fileAppender->setLayout(filePtnLyt);
    root->addAppender(fileAppender);
        
    /*
    以下是一些常用的转换说明符:
    - `%c`:输出日志信息所属的类别,也就是logger的名字。
    - `%d`:这是用来输出日志时间的,可以在其后面指定日期时间格式,比如`%d{HH:mm:ss,SSS}`,输出类似:“10:28:38,899”。
    - `%m`:输出代码中指定的消息,这就是我们常说的日志信息。
    - `%n`:输出一个回车换行符,Windows平台为“\r\n”,Unix/Linux平台为“\n”。
    - `%p`:输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。
    - `%r`:输出自应用启动到输出该log信息耗费的毫秒数。
    - `%t`:输出产生该日志事件的线程的名称。
    - `%%`:输出一个“%”字符。
    - `%x`:输出和当前线程相关联的NDC(嵌套诊断环境),尚不清楚怎么使用。
    - `%X`:输出和当前线程关联的MDC(映射诊断环境),尚不清楚怎么使用。
    */
    // 日志输出到控制台
    osAppender = new log4cpp::OstreamAppender("console", &std::cout);
    consolePtnLyt = new log4cpp::PatternLayout();
    consolePtnLyt->setConversionPattern("[%-6p][%d]: %m%n");
    osAppender->setLayout(consolePtnLyt);
    root->addAppender(osAppender);
    
    // rollingAppender = new log4cpp::RollingFileAppender("rollingFileAppender", "ModuleTest.log", 5 * 1024, 1);
    // rollingPtnLyt = new log4cpp::PatternLayout();
    // rollingPtnLyt->setConversionPattern("[%-6p][%d]: %m%n");
    // rollingAppender->setLayout(PtnLyt);
    // root->addAppender(rollingAppender);

    root->setPriority(log4cpp::Priority::DEBUG);
}

TLogger::~TLogger(){
    // root->shutdown();
}

void TLogger::logDebug(const std::string& message){
    TLogger::_debug(message);
}

void TLogger::logInfo(const std::string& message){
    TLogger::_info(message);
}

void TLogger::logWarn(const std::string& message){
    TLogger::_warn(message);
}

void TLogger::logError(const std::string& message){
    TLogger::_error(message);
}

void TLogger::logCrit(const std::string& message){
    TLogger::_crit(message);
}

void TLogger::logAlert(const std::string& message){
    TLogger::_alert(message);
}

void TLogger::logEmerg(const std::string& message){
    TLogger::_emerg(message);
}

void TLogger::logNotice(const std::string& message){
    TLogger::_notice(message);
}

void TLogger::_debug(const std::string& message){
    root->debug(message);
}

void TLogger::_info(const std::string& message){
    root->info(message);
}

void TLogger::_warn(const std::string& message){
    root->warn(message);
}

void TLogger::_error(const std::string& message){
    root->error(message);
}

void TLogger::_crit(const std::string& message){
    root->crit(message);
}

void TLogger::_alert(const std::string& message){
    root->alert(message);
}

void TLogger::_emerg(const std::string& message){
    root->emerg(message);
}

void TLogger::_notice(const std::string& message){
    root->notice(message);
}

// int main(){
//     TLogger logger("TLog");
//     logger.logDebug("Hello, log4cpp!");
//     logger.logInfo("Hello, cpp!"); 
// }

CMakeLists.txt

#写log4cppp的cmake文件
cmake_minimum_required(VERSION 3.10)
project(log4cpp_demo)
set(CMAKE_CXX_STANDARD 11)
#设置log4cpp的安装路径
set(CMAKE_INSTALL_PREFIX /usr/local)
#添加头文件搜索路径
include_directories(${CMAKE_INSTALL_PREFIX}/include)
#添加库文件搜索路径
link_directories(${CMAKE_INSTALL_PREFIX}/lib)
set(SOURCE_FILES TLog.cpp)
#添加可执行文件
add_executable(log4cpp_demo ${SOURCE_FILES})
#添加链接库
target_link_libraries(log4cpp_demo log4cpp pthread)
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值