一、引入Log4j 2.x.jar
要在项目中使用Log4j 2.x,首先得引入Log4j 2.x所必须的jar包:
log4j-api-2.2.jarlog4j-core-2.2.jar
直接下载,解压到任意目录,找到上述两个jar包,并将它们加入到classpath中即可。也可以使用Maven管理jar包,只需要找到pom.xml文件,并将以下配置添加到依赖列表:
org.apache.logging.log4j log4j-api 2.2 org.apache.logging.log4j log4j-core 2.2
更多其它环境配置方式,参见官网:
二、配置log4j2.xml
jar包引入后,需要在classpath下加入一个配置文件,文件名称为log4j2.xml。这个名称还可以设置为log4j.jsn、log4j2.yml、log4j2-test.xml、log4j-test.jsn、log4j2-test.yml等。
如果你没有提供任何有效的配置文件,很有可能看到下面的提示:
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
由于没有找到任何有效的配置文件,log4j2将使用默认配置:只记录错误信息到控制台。Log4j2的默认配置等价于下面的配置:
这里牵扯出两个概念:
1、输出源(Appender)
输出源是日志输出的目的地,可以是控制台、文件、输出流、数据库等等。Log4j2提供了十几种输出源类型,不同的输出源又有各种配置项,可以说基本能满足项目需求。
2、日志器(Logger)
日志器负责打印日志,每个日志器都会有一个独有name属性。Log4j2有一套维护各个日志器关系的规则,这个规则类似于Java中的包(package)。举例来说,如果一个日志器的name为"com.foo.ChildLogger",而另一个日志器的名称是"com.foo",那么后者就是前者的父级,后者的配置对于前者同样适用。
从上面的默认配置可以看出,Log4j2的配置文件大致结构为以Configuration为根节点,其下有Appenders和Loggers子节点,分别用于列出输出源和日志器。每一个输出源均设置一个name属性,用于标识其唯一性,以便日志器将其设置为输出源。
三、几种常用的输出源(Appender)
1、ConsoleAppender
ConsoleAppender会通过System.out或System.err将日志输出到控制台,默认情况下使用的是System.err,可以通过设置target属性来控制使用System.out。
2、FileAppender
FileAppender是将日志输出到fileName属性所定义的文件中。默认情况,日志会被以追加的方式输出到日志文件中,但也可以通过设置append属性为false,使得每次输出日志都会先清除已有的日志内容。
3、RollingFileAppender
RollingFileAppender也是将日志输出到fileName属性所定义的文件中的输出源,与FileAppender不同的是,当满足一定的条件——以TriggeringPolicy属性设置条件,就会重新以某种规则新建一个日志文件,文件的命名规则由filePattern属性设置。
当然,任何一种输出源都会有一个name属性,这个属性可用于日志器配置输出源时使用。更多的输出源及详细的可配置属性可以参看Log4j 2.x的官网: ,这里不再一一列出。
四、日志格式化Layout
Log4j 2.x在输出日志时允许用户自定义格式,也可以在配置文件中设置以某种日志格式输出。每一个输出源都有一个日志格式的属性配置,属性名为layout,取值为指定的日志格式类。最常用的日志格式类莫过于PatternLayout,它有着相当丰富的格式符:
-
%c{n.m.~.~} 、%C{n.m.~.~} 日志器名称占位符,它是日志器类名的占位符,如果不提供层级控制({...}),默认打印全路径。指定层级的控制中,n和m分别表示该位置包名的打印长度,~表示显示成~。比如日志器名称为com.apache.logging.demo.LoggerTest,则%c{1.2.~.~}的打印结果就是c.ap.logging.~.~.LoggerTest。
-
%d{yyyy-MM-dd HH:mm:ss} 日期占位符,以指定格式输出日志打印时间点。除了可以使用所有SimpleDateFormat可以使用的占位符,还可以使用各个时区的标识,比如DEFAULT、ISO8601ISO8601_BASIC、ABSOLUTE、DATE、COMPACT、UNIX、UNIX_MILLIS等等。
-
%enc{pattern}、%encode{pattern} 对日志编码输出,参数为一个完整的日志格式,但在打印日志时,会将该日志消息中的某些特殊字符转义。比如%enc{%msg},如果要打印的是“<script></script>”,那么结果就是转义后的消息:“<script></script>”。
-
%F、%file 输出日志打印器所在的文件名,比如Log4j.java等。
-
%l、%location 输出该条日志打印发生时所在的位置,包含包名、类名、方法名、所在文件、所在行数等等。
-
%L、%line 输出该条日志打印发生时所在的行号。
-
%m、%msg、%message 输出该条日志的消息内容,也就是调用Logger.info、Logger.debug等方法时传给的第一个参数。
-
%M、%method 输出该条日志打印发生时所在的方法名。
-
%n 换行符,各个系统下换行符不一致,通过%n来输出换行符。
-
%p、%level 打印该条日志的级别,比如INFO、DEBUG、ERROR等。也可以通过参数给这些日志级别起别名,比如%p{INFO=信息, DEBUG=调试, ERROR=错误, FATAL=致命, ALL=全部}。
-
%replace{pattern}{regex}{substitution} 这个格式符就像是String的replace函数,第一个参数定义消息打印格式,第二参数是一个正则表达式,格式符将消息中符合这个正则的字符串子串替换为第三个参数,比如%replace{%d}{\d}{0},将打印消息中所有的数字替换为0。
-
%t、%thread 输出日志打印器打印时所在的线程名。
-
%% 输出一个%。
有时,我们希望日志消息能有一定的对齐方式,比如消息layout为“%p %m”,由于日志级别有ALL、INFO、DEBUG等,它们或三个字符,或四个字符,甚至五个字符。就会导致日志参差不齐。Log4j 2.x也提供了一种格式符来解决这个问题,那就是通过在%和格式符之间插入指定数字来控制该格式符结果的长度,如果长度过长则截取,过短则使用空格填充。数字可以为负数,负数表示左对齐右补空格,整数表示右对齐左补空格。比如:
%-5level %m
则打印结果很可能如下:
INFO__消息DEBUG_消息ERROR_消息
为方便查看,空格以下划线代替,可以看出INFO由于不足五个字符,在左对齐的同时,右侧补了一个空格。如果数字为整数:
%5level %m
则打印结果可能如下:
_INFO_消息DEBUG_消息ERROR_消息
即在右对齐的同时,左侧补充一个空格。
也可以设置两个数字,以点号隔开,比如%-5.10m,它表示如果不足5个字符,则右对齐左补空格;但是如果超过了10个字符,则从左边开始截取,只留剩余的右侧的10个字符。
要了解更多的格式符或是Layout,可以参看Log4j 2.x官网的这个页面:
五、日志过滤器Filter
版权声明:本文为博主原创文章,未经博主允许不得转载。