对于一个系统来说,日志是其极其重要的一部分。在java的众多日志框架中,log4j是java比较重要的一个日志框架,其提供了多样化的日志服务。
下面介绍一下Maven项目使用log4j日志服务的步骤
引入log4j日志框架依赖
在项目使用log4j的日志服务之前,需要引入log4j日志服务的依赖
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
|
配置log4j服务
引入log4j服务相关依赖后,我们还需要配置log4j服务,具体配置如下
在src/main/resources
目录下新建一个配置文件log4j.properties
对于log4j来说,需要先配置rootLogger
其语法如下
log4j.rootLogger = [level],appenderName,appenderName
|
其语法含义是:将指定级别及以上级别的日志信息输出到指定的一个或多个位置。下面将逐一介绍level和appender的含义
指定log4j日志级别
有些时候,我们只想知道程序运行时产生的一些特定信息,这时候,就需要有针对性地输出一些特定级别的日志,指定日志级别可以解决这个问题。
log4j根据日志信息的重要程度,将日志分为下面7个级别,分别是
OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL
但是,log4j官方建议实际使用以下四个级别,它们的优先级从高到低分别是:
ERROR、WARN、INFO、DEBUG
在上面的rootLogger配置中就可以指定level的值为日志级别中的这些值
指定log4j输出类型
解决了输出哪些级别的日志之后,需要解决的就是如何输出这些日志信息的问题。这就要配置log4j的输出类型了。
log4j输出类型的实现
log4j官方的appender给出了以下5种实现
org.apache.log4j.ConsoleAppender
(控制台)
org.apache.log4j.FileAppender
(文件)
org.apache.log4j.DailyRollingFileAppender
(每天产生一个日志文件)
org.apache.log4j.RollingFileAppender
(文件大小到达指定尺寸的时候产生一个新的文件)
org.apache.log4j.WriterAppender
(将日志信息以流格式发送到任意指定的地方)
log4j输出类型的选择
实际开发过程中,比较常用的是第1、第3、第4种,其它两种比较少用
那么,该怎么选择和使用这些appender实现呢?
一般来说,输出到控制台是必须的
假如日志数据量不是很大,我们可以追加使用DailyRollingFileAppender每天产生一个日志,方便查看
假如日志数据量很大,我们一般用RollingFileAppender,限制单个日志文件的大小。可以使用MaxFileSize属性指定单个日志文件最大的大小,单位为KB,当文件大小超出指定大小时,就会产生一个新的文件 。
对于服务器来说,存储空间是毕竟是有限的,在一定条件下需要删除或覆盖一些早前的日志文件。因此,可以使用日志的MaxBackupIndex属性指定日志文件的个数,当日志文件数量超过该上限时,则覆盖旧的日志文件
至此,日志配置发展到下面的形式,可以根据实际情况选用合适实现
示例如下
log4j.rootLogger=DEBUG, Console ,File ,DailyRollingFile ,RollingFile
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.File = org.apache.log4j.FileAppender log4j.appender.File.File = C://log2.log
log4j.appender.DailyRollingFile = org.apache.log4j.DailyRollingFileAppender log4j.appender.DailyRollingFile.File = C://log3.log
log4j.appender.RollingFile = org.apache.log4j.RollingFileAppender log4j.appender.RollingFile.File = C://log4.log log4j.appender.RollingFile.MaxFileSize=1KB log4j.appender.RollingFile.MaxBackupIndex=3
|
指定log4j日志信息格式
对于日志来说,我们还要指定日志输出信息的格式,在log4j中主要提供了以下实现
org.apache.log4j.HTMLLayout
(以HTML表格形式布局),
org.apache.log4j.PatternLayout
(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout
(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout
(包含日志产生的时间、线程、类别等等信息)
其中,在这些实现中,第1、3、4比较简单,log4j直接指定了日志信息格式。在实际开发中,最常用的是第2种,其有个ConversionPattern属性,通过该属性能够灵活配置输出,其可配置的属性如下
属性 |
作用 |
%m |
输出代码中指定的消息 |
%M |
输出打印该条日志的方法名 |
%p |
输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL |
%r |
输出自应用启动到输出该log信息耗费的毫秒数 |
%c |
输出所属的类目,通常就是所在类的全名 |
%t |
输出产生该日志事件的线程名 |
%n |
输出一个回车换行符,Windows平台为”rn”,Unix平台为”n”; |
%d |
输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:*%d{yyyy-MM-dd HH:mm:ss,SSS}*,输出类似:2002-10-18 22:10:28,921 |
%l |
输出日志事件的发生位置,及在代码中的行数 |
示例如下:
log4j.rootLogger=DEBUG, Console ,File ,DailyRollingFile ,RollingFile
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern= %d [%t] %-5p [%c] - %m%n
log4j.appender.File = org.apache.log4j.FileAppender log4j.appender.File.File = C://log2.log
log4j.appender.File.layout = org.apache.log4j.PatternLayout log4j.appender.File.layout.ConversionPattern = %d [%t] %-5p [%c] - %m%n
log4j.appender.DailyRollingFile = org.apache.log4j.DailyRollingFileAppender log4j.appender.DailyRollingFile.File = C://log3.log
log4j.appender.DailyRollingFile.layout = org.apache.log4j.PatternLayout log4j.appender.DailyRollingFile.layout.ConversionPattern = %d [%t] %-5p [%c] - %m%n
log4j.appender.RollingFile = org.apache.log4j.RollingFileAppender log4j.appender.RollingFile.File = C://log4.log log4j.appender.RollingFile.MaxFileSize=1KB log4j.appender.RollingFile.MaxBackupIndex=3
log4j.appender.RollingFile.layout = org.apache.log4j.PatternLayout log4j.appender.RollingFile.layout.ConversionPattern = %d [%t] %-5p [%c] - %m%n
|
指定输出日志的等级
有时候,我们需要将指定的日志级别单独输出到文件中,这时就可以使用Threshold属性指定日志级别
当然这里有个提前rootLogger里配置的level小于Threshold层级,否则无效,日志还是会按照总的rootLogger里配置的level来输出
log4j.rootLogger=DEBUG, Console ,DFile ,EFILE
log4j.appender.DFile = org.apache.log4j.FileAppender log4j.appender.DFile.File = C://DEBUG.log log4j.appender.DFile.layout = org.apache.log4j.PatternLayout log4j.appender.DFile.layout.ConversionPattern =%d [%t] %-5p [%c] - %m%n
log4j.appender.DFile.Threshold = DEBUG
log4j.appender.EFILE = org.apache.log4j.FileAppender log4j.appender.EFILE.File = C://ERROR.log log4j.appender.EFILE.layout = org.apache.log4j.PatternLayout log4j.appender.EFILE.layout.ConversionPattern =%d [%t] %-5p [%c] - %m%n
log4j.appender.EFILE.Threshold = ERROR
|
指定是否追加内容
log4j默认是不断的把日志内容追加到日志文件中的,可以通过设置属性Append值来控制是否追加内容到日志文件中。
- 若Append设置为true,则表示追加内容到日志文件
- 若Append设置为false,则表示不追加内容到日志文件,直接覆盖前面的内容
log4j.rootLogger=DEBUG, Console ,DFile ,EFILE
log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.layout=org.apache.log4j.TTCCLayout
log4j.appender.DFile = org.apache.log4j.FileAppender log4j.appender.DFile.File = C://DEBUG.log log4j.appender.DFile.layout = org.apache.log4j.PatternLayout log4j.appender.DFile.layout.ConversionPattern =%d [%t] %-5p [%c] - %m%n log4j.appender.DFile.Threshold = DEBUG
log4j.appender.DFile.Append = false
log4j.appender.EFILE = org.apache.log4j.FileAppender log4j.appender.EFILE.File = C://ERROR.log log4j.appender.EFILE.layout = org.apache.log4j.PatternLayout log4j.appender.EFILE.layout.ConversionPattern =%d [%t] %-5p [%c] - %m%n log4j.appender.EFILE.Threshold = ERROR
|
java代码中使用日志
可以在java类中增加该代码,该代码引入了一个日志对象,可以使用该日志对象的方法输出信息,帮助我们更方便地查找程序错误
private static Logger logger=Logger.getLogger(xxx.class);
|
完整代码示例
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
|
log4j.rootLogger=DEBUG, Console ,DFile ,EFILE
log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.layout=org.apache.log4j.TTCCLayout
log4j.appender.DFile = org.apache.log4j.FileAppender log4j.appender.DFile.File = C://DEBUG.log log4j.appender.DFile.layout = org.apache.log4j.PatternLayout log4j.appender.DFile.layout.ConversionPattern =%d [%t] %-5p [%c] - %m%n log4j.appender.DFile.Threshold = DEBUG
log4j.appender.DFile.Append = false
log4j.appender.EFILE = org.apache.log4j.FileAppender log4j.appender.EFILE.File = C://ERROR.log log4j.appender.EFILE.layout = org.apache.log4j.PatternLayout log4j.appender.EFILE.layout.ConversionPattern =%d [%t] %-5p [%c] - %m%n log4j.appender.EFILE.Threshold = ERROR
|
import org.apache.log4j.Logger;
public class Test {
private static Logger logger=Logger.getLogger(Test.class); public static void main(String[] args) { logger.info("普通Info信息222"); logger.debug("调试debug222信息"); logger.error("报错error信息"); logger.warn("警告warn信息"); logger.fatal("严重错误fatal信息"); logger.error("报错信息", new IllegalArgumentException("非法参数")); } }
|
总结
为了在java程序中使用log4j日志服务,需要做以下事情
- 首先,在
pom.xml
文件中引入log4j所必须的依赖
- 然后,在
src/main/resources
目录下创建log4j.properties
,并依次配置rootLogger,appender,layout
- 在java代码中创建Logger对象,在相关代码前后使用该对象相关方法