log4j官方文档 log4j 1.2的配置和使用
- 1. Loggers, Appenders and Layouts
- 1.1 Loggers
- 1.2 Appenders和Layouts
- 1.2.1 Appender
- 1.2.2 Layout
- 2 使用配置文件。
1. Loggers, Appenders and Layouts
Log4j有三个主要的组件:
loggers: 负责捕获日志信息
appenders: 负责输出信息到不同的目的地
layouts: 负责使用不同的样式输出日志
1.1 Loggers
logger的命名大小写敏感,同时支持层级也就是继承的关系,父级和子logger使用.分隔。
比如com.foo就是com的子集。
Logger的等级分为:
ALL,
TRACE,
DEBUG,
INFO,
WARN,
ERROR and
FATAL,
OFF
他们定义在org.apache.log4j.Level中,我们可以通过继承Level来自定义自己的level。如果一个logger没有指定level,那么他将会继承他父级Logger的level。当Logger的打印级别大于或等于他指定的level的时候,才会打印log日志。
对于我们上面预置的级别来说,级别关系如下:
ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
举个例子:
@Test
public void testLogLevel() {
Logger logger = Logger.getLogger(LoggerTest.class);
logger.setLevel(Level.WARN);
logger.debug("this is debug");
logger.info("this is info");
logger.warn("this is warn");
logger.error("this is error");
logger.fatal("this is fatal");
}
指定打印级别为WARN,输出日志如下:
2019-08-19 09:21:02 [WARN][com.test.LoggerTest] - this is warn
2019-08-19 09:21:02 [ERROR][com.test.LoggerTest] - this is error
2019-08-19 09:21:02 [FATAL][com.test.LoggerTest] - this is fatal
通过getLogger获取的Logger对象,根据后面的参数区别。也就是说相同的class参数获取的是同一个logger对象。
1.2 Appenders和Layouts
appenders用来指定日志的输出目的地,目前,支持的有Console, 文件,GUI,remote socket,JMS等等。
一个Logger可以有多个Appender,所有的日志打印都会输出到这个Logger的所有appenders以及他的父级Logger的appenders。比如:如果rootLogger指定了一个Console的appender,那么所有的日志打印都会至少打印到console中。
我们可以通过指定appender的layout来指定日志的输出格式。
1.2.1 Appender
上图是Appender的api,可以看到有很多的实现类。具体可以在线查看log4j的在线文档:http://logging.apache.org/log4j/1.2/apidocs/index.html我们看下几个常用的实现类:
ConsoleAppender: 使用System.out(默认)或者System.error来输出日志到控制台。通过target属性来设置目的地,只能选择System.out和System.error,其他的值会被忽略。
如果我们是写在xml中,需要写log4j.appender.appender名字.Target=System.out(默认)
RollingFileAppender: 允许log文件达到一定大小后被备份,后续日志写到一个新的日志文件中。
通过File属性设置输出日志到哪个文件,通过MaxBackupIndex设置最大备份的文件数,
通过MaxFileSize设置日志文件最大允许的大小,当达到这个size就会备份并写道一个新的日志文件中,可以使用KB,MB,GB来描述大小。DailyRollingFileAppender: 和RollingFileAppender类似,都继承自FileAppender,不同的是他是按时间进行备份。
通过继承父类FileAppender的setFile来使用File属性指定输出的文件。
通过DatePattern属性来控制按照什么日期规则进行备份。
通过官方的介绍,我们使用和simpleDateformate一样的规则来定义DatePattern。注意:后面的日期规则不要加单引号,单引号是用来表示log文件备份的时候和这个日期链接用的字符串。比如设置
log4j.appender.appender名字.DatePattern=’_‘yyyy-MM-dd’.log’就会备份成xxx_2019-08-18.log上面两个appender都是继承自FileAppdener的,也就是具有父类的属性:
可以通过设置Threshold设置这个appender的日志打印级别。
可以通过设置Encoding设置日志打印的编码。
更多的属性可以查看官方文档的api。
1.2.2 Layout
所有的appender都可以通过layout来设置日志的输出格式。
我们主要看下常用的:
PatternLayout是比较常用的layout,通过上面的api描述可以知道这是一个灵活的使用一个规则的字符串来配置日志输出格式的。他的规则依赖于conversion pattern。conversion pattern和C语言的打印规则很相似。
conversion pattern的组成如下:
Conversion Char | Effect |
%d | 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy-MM-dd HH:mm:ss,SSS},输出类似:2011-10-18 22:10:28,921 |
%r | 输出自应用启动到输出该log信息耗费的毫秒数 |
%c | 输出日志信息所属的类目,通常就是所在类的全名 |
%t | 输出产生该日志事件的线程名 |
%l | 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。 |
%x | 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。 |
%% | 输出一个"%"字符 |
%F | 输出日志消息产生时所在的文件名称 |
%L | 输出代码中的行号 |
%m | 输出代码中指定的消息,产生的日志具体信息 |
%n | 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"输出日志信息换行 |
%p | 输出日志的级别 |
可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。
3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉
比如配置如下:
log4j.appender.A.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p][%c] - %m%n
设置A这个appender的ConversionPattern为 年月日时分秒 【日志级别】【日志输出的类】- 日志内容(然后换行)
2 使用配置文件。
我们在resources目录下面添加一个log4j.properties文件。
示例一:
#设置rootLogger的level为debug,他的唯一appender为A1
log4j.rootLogger=DEBUG, A1 #等级后面是我们添加的appender的名字
#设置A1的appender类型为ConsoleAppender。
log4j.appender.A1=org.apache.log4j.ConsoleAppender
#设置A1的appender的layout和格式
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
假如我们不想打印com.foo下面的log,那么我们需要指定com.foo的level,不继承rootLogger的debug。
# 设置rootLogger的level为debug,他的唯一appender为A1
log4j.rootLogger=DEBUG, A1 #等级后面是我们添加的appender的名字
# 设置A1的appender类型为ConsoleAppender。
log4j.appender.A1=org.apache.log4j.ConsoleAppender
# 设置A1的appender的layout和格式
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
#设置com.foo的logger的打印级别为OFF,也就是不打印
log4j.logger.com.foo=OFF
下面是多个appender的示例:
#指定rootLogger的level是debug和appender为stdout
log4j.rootLogger=debug, stdout
#设置org.springframework的logger不打印
log4j.logger.org.springframework=OFF
#设置com.foo的打印级别为INFO,appender为R
log4j.logger.com.foo=INFO,R
#设置com.test的打印级别为INFO,appender为A
log4j.logger.com.test=INFO,A
#指定stdout的appender类型和layout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
#指定R的appender类型和layout
log4j.appender.R=org.apache.log4j.RollingFileAppender
#指定RollingFileAppender的属性,这些属性都可以在RollingFileAppender中找到相应的set方法。
log4j.appender.R.File=example.log
log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
#指定DailyRollingFileAppender属性。
log4j.appender.A=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A.File=${catalina.base}/logs/all.log
log4j.appender.A.Append=true
log4j.appender.A.Threshold=INFO
log4j.appender.A.layout=org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p][%c] - %m%n
log4j.appender.A.DatePattern='_'yyyy-MM-dd'.log'
上面指定了控制台打印之外还指定了两个文件的日志输出,一个的文件名字为example.log。当文件达到100KB的时候,文件会滚动,老example.log文件会改为example.log.1,同时生成一个新的example.log来记录新的日志,最大备份文件数量为1。
最后一个文件名字为all.log,备份规则为每天,日志打印级别为INFO,备份的文件名为all.log_2019-08-19.log。注意这里面可以使用变量,我们通过${catalina.base}获取tomcat目录。
所有的日志都继承之rootLogger,所有都会打印到控制台中。
但是org.springframework设置了级别为OFF,所以他下面的logger都不会打印,
com.foo下的日志会打印到example.log中,
com.test下的日志会打印到all.log中。