墨星写作网站,柳州网站建设招聘,咋做抽奖网站,mooc网站开发案例为什么要用log4cpp记录项目日志
在通常情况下#xff0c;Linux/UNIX 每个程序在开始运行的时刻#xff0c;都会打开 3 个已经打开的 stream. 分别用来输入#xff0c;输出#xff0c;打印错误信息。通常他们会被连接到用户终端。这 3 个句柄的类型为指向 FILE 的指针。可以…为什么要用log4cpp记录项目日志
在通常情况下Linux/UNIX 每个程序在开始运行的时刻都会打开 3 个已经打开的 stream. 分别用来输入输出打印错误信息。通常他们会被连接到用户终端。这 3 个句柄的类型为指向 FILE 的指针。可以被 fprintf、fread等函数使用他们在程序开始启动后stdin, stdout, and stderr 的文件描述符是 0, 1 和 2其它的文件描述符则排在其后。
很多时候会用 printf 打印信息来调试程序但是如果终端关掉了那怎么显示 printf 的调试信息呢log4cpp就可以解决这个问题.
1 log4cpp安装 wget https://nchc.dl.sourceforge.net/project/log4cpp/log4cpp-1.1.x%20%28ne w%29/log4cpp-1.1/log4cpp-1.1.3.tar.gztar -zxvf log4cpp-1.1.3.tar.gzcd log4cpp./configure --prefix安装路径makemake install 2确定 log4cpp 头文件库
找头文件./log4cpp/include/log4cpp 找到对应的库./log4cpp/src/.libs
3 log4cpp日志说明
3-1 设置日志信息输出方式
#include log4cpp/Category.hh
#include log4cpp/FileAppender.hh
#include log4cpp/PatternLayout.hh
#include log4cpp/OstreamAppender.hh// 以root的身份将信息输出到 std::cout
//log4cpp::Appender *appender new log4cpp::OstreamAppender(root,std::cout);// 以root的身份将信息输出到 log 文件
log4cpp::Appender *appender new log4cpp::FileAppender(root,test.log);日志信息appender方式注释log4cpp::FileAppender输出到文件log4cpp::RollingFileAppender输出到回卷文件即当文件到达某个大小后回卷log4cpp::OstreamAppender输出到一个 ostream 类log4cpp::RemoteSyslogAppender输出到远程 syslog 服务器log4cpp::StringQueueAppender内存队列log4cpp::SyslogAppender本地 sysloglog4cpp::Win32DebugAppender发送到缺省系统调试器log4cpp::NTEventLogAppender发送到 win 事件日志 日志输出到终端或者文件中实际上是很慢的会引起 IO 中断可以输出到内存里 StringQueueAppender然后从 StringQueueAppender 输出到其它地方这样线程执行效率是比较高效的。 3-2 设置日志信息输出格式
log4cpp::PatternLayout *patternLayout new log4cpp::PatternLayout();
patternLayout-setConversionPattern(%d [%p] - %m%n);
appender-setLayout(patternLayout);patternLayout-setConversionPattern( )支持以下一组格式字符
日志格式字符注释%%百分比符号%c日志类别%d日期格式日期格式字符后面可以跟一个日期格式,括在大括号之间的说明符。例如%d%\H:%M:%S%l 或 %d%S\d%M%Y%H:%\M:%S%l}。如果没有给出日期格式说明符则使用以下式“Wed Jan 02 02:03:55 1980”。%l表示毫秒。%m消息%n特定于平台的行分隔符%p优先级%r自创建此布局以来的毫秒%R自1970年1月1日起的秒数(时间戳)%u进程启动后的时钟周期%xNDC%t线程名称 默认情况下PatternLayout-ConversionPattern( )设置为“%m%n”。 3-3 设置 日志输出类别(category) 和 日志优先级priority
log4cpp::Category root log4cpp::Category::getRoot(); //设置在配置文件里
root.setPriority(log4cpp::Priority::NOTICE);
root.addAppender(appender);日志的级别总共有 NOTSET DEBUG INFO NOTICE WARN ERROR CRIT ALERT FATAL EMERG。 日志级别的意思是低于该级别的日志不会被记录。
3-4设置 日志操作的宏
#define LOG(__level)
log4cpp::Category::getRoot() log4cpp::Priority::__level __FILE__ __LINE__ : 3-5 使用 日志操作的宏 记录日志
LOG(DEBUG) i am happy.;
LOG(INFO) oh, you happy, we happy.;
LOG(NOTICE) please do not contact me. ;
LOG(WARN) i am very busy now.;
LOG(ERROR) oh, what happed?;4 使用封装log4cpp(单例)并使用Cmake编译项目
4-0 log4cpp_demo.conf
#定义 rootCategory 的属性
log4cpp.rootCategoryDEBUG, RootLog#定义 RootLog 属性
log4cpp.appender.RootLog RollingFileAppender
log4cpp.appender.RootLog.layout PatternLayout
log4cpp.appender.RootLog.layout.ConversionPattern%d{%m - %d %H:%M:%S %l} [%t][%p]%m%n
log4cpp.appender.RootLog.fileName ./log4cpp_Loger.log
log4cpp.appender.RootLog.maxFileSize 268435456 #256MB
log4cpp.appender.RootLog.fileNamePattern log4cpp_Loger%i.log
log4cpp.appender.RootLog.maxBackupIndex 2564-1 Loger.h
#ifndef DISTRIBUTED_LOGGER_H_
#define DISTRIBUTED_LOGGER_H_#include string
#include log4cpp/Category.hh#define LOG_INFO Logger::instance()-GetHandle()-info
#define LOG_DEBUG Logger::instance()-GetHandle()-debug
#define LOG_ERROR Logger::instance()-GetHandle()-error
#define LOG_WARN Logger::instance()-GetHandle()-warnclass Logger
{
public:Logger();~Logger();//初始化bool init(const std::string log_conf_file);//获取单例static Logger* instance() { return instance_; }//获取使用日志接口log4cpp::Category* GetHandle() { return category_; };protected://对象实例static Logger instance_;log4cpp::Category* category_;};#endif4-2 Loger.cpp
#include Loger.h
#include iostream
#include log4cpp/Category.hh
#include log4cpp/FileAppender.hh
#include log4cpp/PatternLayout.hh
#include log4cpp/OstreamAppender.hh
#include log4cpp/RemoteSyslogAppender.hh
#include log4cpp/PropertyConfigurator.hhLogger Logger::instance_;
Logger::Logger()
{}Logger::~Logger()
{}bool Logger::init(const std::string log_conf_file)
{try{//日志输出log4cpp::PropertyConfigurator::configure(log_conf_file);}catch (log4cpp::ConfigureFailure f){std::cerr load log config file log_conf_file.c_str() failed with result: f.what() std::endl;return false;}category_ log4cpp::Category::getRoot();return true;
}4-3 main.cpp
#include Loger.h
#include iostream
#include unistd.husing namespace std;
int main(int argc, char **argv) {if (argc ! 2)//传入参数不合法{printf(Please input format your process .conf file config !\n);return -1;}Logger* config Logger::instance();//配置文件加载信息if (!config-init(std::string(argv[1]))) //配置文件加载失败{printf(load %s failed.\n, argv[1]);return -2;}LOG_DEBUG(load %s finsh.,argv[1]);return 0;
}4-4 CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 3.5)
#工程名
PROJECT(log4cpp_demo)
#将指定的目录头文件添加到编译器的头文件搜索路径之下
INCLUDE_DIRECTORIES(./third/include)#将指定的目录库文件添加需要链接的库文件目录之下
LINK_DIRECTORIES(./third/lib/log4cpp)#内置变量:CMAKE_SOURCE_DIR 定义了顶级CMakeLists.txt 所在文件夹
#PROJECT_SOURCE_DIR定义了包含project()命令的CmakeLists.txt所在的文件夹
#搜集所有在指定路径下的源文件名,将输出结果储存在指定的变量中
aux_source_directory(${PROJECT_SOURCE_DIR} SOURCE_FILES)#使用给定的源文件,为工程引入一个可执行文件
ADD_EXECUTABLE(log4cpp_demo ${SOURCE_FILES})#用来显示的定义变量(注意:加上-pthread)
SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}-pthread -rdynamic -Wall -g3 -m64 -pipe -stdc0x -lrt -Wno-reorder -Wdeprecated-declarations -fpermissive )#该指令的作用为目标文件与库文件进行链接
#TARGET_LINK_LIBRARIES(log4cpp_demo log4cpp)
target_link_libraries(log4cpp_demo pthread)
target_link_libraries(${PROJECT_NAME} liblog4cpp.a)
#设置默认安装目录
SET(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR})#安装
INSTALL(TARGETS log4cpp_demo DESTINATION bin)
4-5 编译项目 cmake .make 4-6 执行程序