Log4j 日志框架使用详解

这篇大概是在几年之前就写好的,今天在整理文档的时候整理出来了,所以在这里记一下。记得最开始学编程的时候,听说他们用log4j记录日志,感觉是一件很神奇的事情,日志信息竟然可以发到指定的邮箱,还可以生成HTML,也因此对log4j充满着向往。我自己学习log4j的路是挺艰辛的,虽然很简单,但那个时候也不会看文档,只会去网上找些资料来看,费了很大的劲,最终才慢慢理解。所以看文档还是很重要的一个能力。废话不多说了,下面是一点总结。

什么是日志框架?

我们在系统中对于记录日志的需求并不单纯。首先,我们希望日志要能持久化到磁盘,最基本的就是要能够保存到文件中;其次,我们希望在开发和生产环境中记录的日志并不相同,明显开发环境的日志记录会更多方便调试,但放到生产环境下大量的日志很容易会撑爆服务器,因此在生产环境我们希望只记录重要信息。

基于不单纯的目的,System.out.println是直接不能满足我们的要求,因此抛弃它,选择功能更强的日志框架。而log4j是apache下一款著名的开源日志框架,log4j满足上面的一切需求。

集成log4j到系统

log4j的使用也是非常简单的,一个jar包,一个配置文件(log4j.properties)就可以了。当然,配置文件看上去很唬人,虽然看上去像个狼,实际上是个哈士奇。把jar包和配置文件都放到classpath下就可以了。那么配置文件都写些什么,一会再说,这是一个重点。

log4j的日志级别

早就听说有日志级别这么回事,日志级别到底是个什么鬼?刚才提到了两个需求,一个是保存日志到不同的地方,另一个是开发和生产环境打印不同的日志,那么如何在不同的环境打印不同的日志,就是由日志级别来实现的。

日志一般分5个等级,从低到高分别是 DEBUG INFO WARN ERROR FATAL。对应中文的意思就是 调试信息 一般信息 警告信息 错误信息 严重错误信息。在记录日志的时候,就可以根据不同的日志级别来进行记录。比如,你要监控一下用户提交上来的注册信息,我们认为这是在开发环境才需要的,因此可以使用DEBUG级别记录。再比如一个支付场景,系统抛出了一个未知的异常,这肯定是一个非常严重的问题了,那么可以用FATAL或者ERROR来记录。

了解清楚等级划分之后,再来控制生成环境和开发环境输出的信息不同就很简单了,我可以配置一个最低的日志输出级别,在开发环境我设置为DEBUG,也就是所有的日志信息都能输出。在生产环境我可以设置为WARN,也就是只有WARN及以上级别的日志才会被输出,这样是不是就可以在不同的环境控制不同的日志输出了。

对于开发者,学习如何记录各等级的日志非常简单,日志框架一般都提供了非常人性化的API。比如记录debug信息就是 logger.debug(String msg) 记录 info信息就是 logger.info(String msg) 等等,logger是实例化的日志对象。复杂的在于什么场景下使用哪一个级别的日志信息,关于这个问题,在阿里的《java开发手册》的日志规约部分写的非常好,有兴趣的朋友可以参考一下。文档地址在《Java开发手册》

log4j的appender

Appender是log4j的另一大优势,解决的就是日志输出目的地的问题。我们可以自己实现Appender来决定让日志输出到哪里。当然框架默认给我们已经提供了一些常用的Appender,比如输出到控制台的org.apache.log4j.ConsoleAppender,输出到文件的org.apache.log4j.DailyRollingFileAppender等。系统提供的Appender如下

log4j的配置

了解了log4j的两大核心,一个是日志级别,一个是Appender 之后,我们开始看看配置文件到底是什么样子的,下面一个截图,介绍了关于配置的大部分常用内容


注意,这里有一个日志的格式,也就是 ConversionPattern,那么这个值到底该如何配置呢?

%p:输出日志信息的优先级,即DEBUG,INFO,WARN,ERROR,FATAL。
%d:输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,如:%d{yyyy/MM/dd HH:mm:ss,SSS}。
%r:输出自应用程序启动到输出该log信息耗费的毫秒数。
%t:输出产生该日志事件的线程名。
%l:输出日志事件的发生位置,相当于%c.%M(%F:%L)的组合,包括类全名、方法、文件名以及在代码中的行数。例如:test.TestLog4j.main(TestLog4j.java:10)。
%c:输出日志信息所属的类目,通常就是所在类的全名。
%M:输出产生日志信息的方法名。
%F:输出日志消息产生时所在的文件名称。
%L::输出代码中的行号。
%m::输出代码中指定的具体日志信息。
%n:输出一个回车换行符,Windows平台为"/r/n",Unix平台为"/n"。
%x:输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
%%:输出一个"%"字符。
另外,还可以在%与格式字符之间加上修饰符来控制其最小长度、最大长度、和文本的对齐方式。如:
%20c:指定输出category的名称,最小的长度是20,如果category的名称长度小于20的话,默认的情况下右对齐。
%-20c:"-"号表示左对齐。
%.30c:指定输出category的名称,最大的长度是30,如果category的名称长度大于30的话,就会将左边多出的字符截掉,但小于30的话也不会补空格。

到这里,log4j的配置就完成了。

自定义Appender

上面看到虽然系统给我们提供了大量的Appender的实现,但有些时候我们还是会有些特殊的需求来自定义Appender,如何自定义Appender呢?非常简单,定义一个类,实现Appender接口就可以了。Appender接口中定义了一系列记录日志的方法,按照自己的规则实现这些方法即可。

Slf4j

Slf4j是一款日志记录框架,我们的项目中可能会用到很多的日志,比如commons-logging,又或者是log4j等等,那么不同的日志工具提供了不同的日志接口,我们的项目如果想换一个日志框架,可能需要改动许多的代码,这样slf4j就给我们提供了一种便捷的方式。它提供了一种对日志工具更高一层的抽象,只要导入slf4j的包和slf4j和采用日志工具整合的包,我们就可以使用slf4j来记录日志了,不用去考虑具体的日志工具的接口。那么以后如果要改变日志工具,我们就可以直接将要使用日志工具加到我们的项目中,而不需要改动代码。

猜你喜欢

转载自blog.csdn.net/king_kgh/article/details/80430002