日志框架--log4j入门

对于一个系统来说,日志是其极其重要的一部分。在java的众多日志框架中,log4j是java比较重要的一个日志框架,其提供了多样化的日志服务。

下面介绍一下Maven项目使用log4j日志服务的步骤

引入log4j日志框架依赖

在项目使用log4j的日志服务之前,需要引入log4j日志服务的依赖

1
2
3
4
5
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>

配置log4j服务

引入log4j服务相关依赖后,我们还需要配置log4j服务,具体配置如下

src/main/resources目录下新建一个配置文件log4j.properties

对于log4j来说,需要先配置rootLogger

其语法如下

1
2
# 设置rootLogger,相当于全局配置
log4j.rootLogger = [level],appenderName,appenderName

其语法含义是:将指定级别及以上级别的日志信息输出到指定的一个或多个位置。下面将逐一介绍levelappender的含义

指定log4j日志级别

有些时候,我们只想知道程序运行时产生的一些特定信息,这时候,就需要有针对性地输出一些特定级别的日志,指定日志级别可以解决这个问题。

log4j根据日志信息的重要程度,将日志分为下面7个级别,分别是

OFFFATALERRORWARNINFODEBUGALL

但是,log4j官方建议实际使用以下四个级别,它们的优先级从高到低分别是:

ERRORWARNINFODEBUG

在上面的rootLogger配置中就可以指定level的值为日志级别中的这些值

1
2
#rootLogger配置
log4j.rootLogger = DEBUG

指定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实现呢?

  1. 一般来说,输出到控制台是必须的

  2. 假如日志数据量不是很大,我们可以追加使用DailyRollingFileAppender每天产生一个日志,方便查看

  3. 假如日志数据量很大,我们一般用RollingFileAppender,限制单个日志文件的大小。可以使用MaxFileSize属性指定单个日志文件最大的大小,单位为KB,当文件大小超出指定大小时,就会产生一个新的文件 。

  4. 对于服务器来说,存储空间是毕竟是有限的,在一定条件下需要删除或覆盖一些早前的日志文件。因此,可以使用日志的MaxBackupIndex属性指定日志文件的个数,当日志文件数量超过该上限时,则覆盖旧的日志文件

至此,日志配置发展到下面的形式,可以根据实际情况选用合适实现

示例如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
log4j.rootLogger=DEBUG, Console ,File ,DailyRollingFile ,RollingFile
# 新增配置,指定rootLogger输出的具体实现
#Console 输出日志到控制台
log4j.appender.Console=org.apache.log4j.ConsoleAppender
#File 输出日志到文件
log4j.appender.File = org.apache.log4j.FileAppender
log4j.appender.File.File = C://log2.log
#DailyRollingFile 每天生成一个日志文件
log4j.appender.DailyRollingFile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.DailyRollingFile.File = C://log3.log
#RollingFile 指定单个日志文件最大大小,达到上限自动生成新文件;指定日志文件最大数量,达到上限,覆盖旧文件
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 输出日志事件的发生位置,及在代码中的行数

示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
log4j.rootLogger=DEBUG, Console ,File ,DailyRollingFile ,RollingFile
#Console
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
#File
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
#DailyRollingFile
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
#RollingFile
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来输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 注意到这里增加的两个DFile ,EFILE和下面配置的对应
log4j.rootLogger=DEBUG, Console ,DFile ,EFILE
#DEBUGFile
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
#新增
#下面这一行是设置DFILE的日志级别,将DEBUG级别的日志单独输入到该文件
log4j.appender.DFile.Threshold = DEBUG
#ERRORFile
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
#新增
#下面这一行是设置EFILE的日志级别,将ERROR级别的日志单独输入到该文件
log4j.appender.EFILE.Threshold = ERROR
指定是否追加内容

log4j默认是不断的把日志内容追加到日志文件中的,可以通过设置属性Append值来控制是否追加内容到日志文件中。

  • Append设置为true,则表示追加内容到日志文件
  • Append设置为false,则表示不追加内容到日志文件,直接覆盖前面的内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
log4j.rootLogger=DEBUG, Console ,DFile ,EFILE
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.TTCCLayout
#DEBUGFile
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
#新增
#这里设置是否在文件中追加日志信息,默认为true,代表追加日志,反之false
log4j.appender.DFile.Append = false
#ERRORFile
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类中增加该代码,该代码引入了一个日志对象,可以使用该日志对象的方法输出信息,帮助我们更方便地查找程序错误

1
private static Logger logger=Logger.getLogger(xxx.class);

完整代码示例

  • pom.xml文件(文件头忽略)
1
2
3
4
5
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
  • log4.properties文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
log4j.rootLogger=DEBUG, Console ,DFile ,EFILE
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.TTCCLayout
#DEBUGFile
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
#这里设置是否在文件中追加日志信息,默认为true,代表追加日志,反之false
log4j.appender.DFile.Append = false
#ERRORFile
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代码文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import org.apache.log4j.Logger;
public class Test {
private static Logger logger=Logger.getLogger(Test.class); // 获取logger实例
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日志服务,需要做以下事情

  1. 首先,在pom.xml文件中引入log4j所必须的依赖
  2. 然后,在src/main/resources目录下创建log4j.properties,并依次配置rootLoggerappender,layout
  3. 在java代码中创建Logger对象,在相关代码前后使用该对象相关方法