背景

想要记录程序输出到文件,方便出问题的时候复盘。

  1. 应该以配置文件为导向,具备时间、滚动、大小限制的功能。
  2. 能同时在console以及文件保存。

log4cpp

跳转:根据此网站学习
跳转:根据此网站可以查看API

实操

#1、解压
#2、配置
./configure --prefix=/opt/log4cpp-1.1.3 --with-pthreads
#3、编译和安装
make&&make install
#arm版本的编译 --host=arm-fsl-linux-gnueabi (arm-fsl-linux-gnueabi 交叉编译工具链前缀)
./configure --prefix=/opt/log4cpp-1.1.3-arm --with-pthreads --host=arm-fsl-linux-gnueabi 

安装后在安装目录生成
在这里插入图片描述

  1. 创建日志的种类,同时需要传入种类的默认优先级(DEBUG<INFO<WARN<ERROR)。我们通过’种类’直接调用来打印,比如设置了一个叫“sub1”的种类,我们就可以用sub1.debug(“message”)来打印“message”这个信息。
  2. 创建具体打印的输出器,并设置输出器的属性:
    1.输出方式。ConsoleAppender、FileAppender、RollingFileAppender
    2.输出的最低优先级。(INFO还是ERROR等)
    3.布局(输出的格式)类型。(特定的某一种布局类型(BasicLayout)。还是可以自定的布局类型(PatternLayout),然后自己来定制,比如按照“时间 [优先级] message”
    3.将设置好属性的输出器,传入’日志种类‘中去。

下面是常见的定制化输出格式的设定参数:

#Q自定义日志消息的可能格式字符是什么?(傻瓜翻译)
PatternLayout 支持以下一组格式字符:
%%- 百分比符号
%c - 类别
%d - 日期\n 日期格式:日期格式字符后跟大括号之间包含的日期格式指定器。例如,%d_%H:%M:%S,%l]%d_%d %m %Y %H:%M:%S,%l}。如果未提供日期格式指定器,则使用以下格式:"1 月 2 日星期三 02:03:55 1980"。日期格式指定器允许与 ANSI C 函数的稳稳时间相同的语法,并添加 1 个。添加的是毫秒的指定 %l,用零填充以产生 3 位数字。
%m - 消息
%n - 平台特定线路分隔符
%p - 优先级
%r - 创建此布局以来的毫秒数。
自 197011 日起的%R -%u - 进程开始以来的时钟刻度
%x - NDC
%t - 线程名称
默认情况下,模式布局的转换模式设置为"%m%n"#BasicLayout 和 SimpleLayout 都可以用 PatternLayout来代替。
#PatternLayout
const char * log4cpp::PatternLayout::DEFAULT_CONVERSION_PATTERN = "%m%n" [static]
 	
The default conversion pattern.

#BasicLayout
const char * log4cpp::PatternLayout::BASIC_CONVERSION_PATTERN = "%R %p %c %x: %m%n" [static]
 	
A conversion pattern equivalent to the BasicLayout.

#SimpleLayout
const char * log4cpp::PatternLayout::SIMPLE_CONVERSION_PATTERN = "%p - %m%n" [static]
 	
A conversion pattern equivalent to the SimpleLayout.


比如我可以创建2个输出器A1,A2,挂在到“种类sub”下,设置A1,优先级为ERROR,设置A2,优先级为INFO。那么调用sub1.INFO(“message”)。之后A1啥也不会打印,而A2才会打印。就可以定制化自己的日志需求了。

  • 示例分析
// main.cpp

#include <log4cpp/Category.hh>
#include <log4cpp/PropertyConfigurator.hh>

int main(int argc, char* argv[])
{
	std::string initFileName = "log4cpp.properties";
	log4cpp::PropertyConfigurator::configure(initFileName);

	log4cpp::Category& root = log4cpp::Category::getRoot();

	log4cpp::Category& sub1 = 
		log4cpp::Category::getInstance(std::string("sub1"));

	log4cpp::Category& sub2 = 
		log4cpp::Category::getInstance(std::string("sub1.sub2"));

	root.warn("Storm is coming");

	sub1.debug("Received storm warning");
	sub1.info("Closing all hatches");

	sub2.debug("Hiding solar panels");
	sub2.error("Solar panels are blocked");
	sub2.debug("Applying protective shield");
	sub2.warn("Unfolding protective shield");
	sub2.info("Solar panels are shielded");

	sub1.info("All hatches closed");

	root.info("Ready for storm.");

	log4cpp::Category::shutdown();

	return 0;
}
# log4cpp.properties
//设置分类
#getRoot调用,rootCategory必须得有,所有的日志都会到rootCategory的输出器中
log4cpp.rootCategory=DEBUG, rootAppender
#sub1是分类名字,"DEBUG,xx","DEBUG"表示的最低的优先级(DEBUG<INFO<WARN<ERROR),后面可以对具体输出实例,再次调整优先级。xx就是输出实例,可一个message可以挂在好几个输出实例。getInstance(std::string("sub1"))调用
log4cpp.category.sub1=DEBUG, A1, A2 
#sub1.sub2是名字。getInstance(std::string("sub1.sub2"))调用
log4cpp.category.sub1.sub2=DEBUG, A3

#对输出实例进行配置
#ConsoleAppender/FileAppender输出方式
log4cpp.appender.rootAppender=ConsoleAppender
#PatternLayout可以自定义自己的输出格式,用后面的ConversionPattern设置
log4cpp.appender.rootAppender.layout=PatternLayout
#ConversionPattern设置输出格式 %d表示打印日期,%p表示打印优先级 %m日志本体 %n 平台特定的行分隔符
log4cpp.appender.rootAppender.layout.ConversionPattern=%d [%p] %m%n 

#FileAppender方式输出
log4cpp.appender.A1=FileAppender
#fileName输出文件名
log4cpp.appender.A1.fileName=A1.log
#BasicLayout表示默认的布局
log4cpp.appender.A1.layout=BasicLayout

log4cpp.appender.A2=FileAppender
#threshold 日志等级的阈值
log4cpp.appender.A2.threshold=WARN
log4cpp.appender.A2.fileName=A2.log
log4cpp.appender.A2.layout=PatternLayout
log4cpp.appender.A2.layout.ConversionPattern=%d [%p] %m%n 

#RollingFileAppender 滚动文件的方式
log4cpp.appender.A3=RollingFileAppender
log4cpp.appender.A3.fileName=A3.log
#maxFileSize文件大小,单位Byte 超过大小会被滚动覆盖
log4cpp.appender.A3.maxFileSize=200
#maxBackupIndex 超过maxFileSize的文件在被覆盖前会备份,这个文件也是滚动覆盖的方式
log4cpp.appender.A3.maxBackupIndex=1
log4cpp.appender.A3.layout=PatternLayout
log4cpp.appender.A3.layout.ConversionPattern=%d [%p] %m%n 

自己使用的log4cpp.properties文件配置

# log4cpp.properties
log4cpp.rootCategory=DEBUG, rootAppender
log4cpp.category.ModbusRTUMaster=DEBUG,A1

log4cpp.appender.rootAppender=ConsoleAppender
log4cpp.appender.rootAppender.layout=PatternLayout
log4cpp.appender.rootAppender.layout.ConversionPattern=%d [%p] %m%n 


log4cpp.appender.A1=RollingFileAppender
log4cpp.appender.A1.threshold=DEBUG
log4cpp.appender.A1.fileName=ModbusRTUMaster.log
log4cpp.appender.A1.maxFileSize=1024000
log4cpp.appender.A1.maxBackupIndex=10
log4cpp.appender.A1.layout=PatternLayout
log4cpp.appender.A1.layout.ConversionPattern=%d [%p] %m%n 
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐