log4cpp简介
log4cpp有三个组件:Category、Appender、Layout。
- Category:控制日志输出级别 (或许不准确,但暂时这么理解吧… O(∩_∩)O哈哈~)
- Appender:挂接器,与布局器紧密配合,将特定格式的消息输出到所挂接的设备终端(如控制台、文件、服务器等)。
- Layout:布局器,控制输出消息的格式。log4cplus提供了三种类型的Layouts,
分别是SimpleLayout、PatternLayout、和TTCCLayout。
使用步骤
- 首先创建一个Category根:
log4cpp::Category* root;
、root = &log4cpp::Category::getRoot();
- 创建一个挂接器appender:
fileAppender = new log4cpp::FileAppender("fileAppender", logFileName);
- 创建一个布局器PatternLayout:
filePtnLyt = new log4cpp::PatternLayout();
并设置日志格式:filePtnLyt->setConversionPattern("[%-6p][%d]: %m%n");
- 将布局器layout绑定到appender对象上:
fileAppender->setLayout(filePtnLyt);
- 将appender对象附加到Category根上:
root->addAppender(osAppender);
- 设置日志级别:
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)