log4j这个开源的组件用于日志输出非常方便,下面我们来测试使用下。
一、环境准备
新建一个maven项目,添加如下依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
项目结构如下图
二、log4j.properties配置文件
# priority :debug<info<warn<error
#第一位为日志输出级别 后面的跟下面每种日志输出方案相对应
log4j.rootLogger=debug,stdout,info,debug,warn,error
#console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern= [%d{yyyy-MM-dd HH:mm:ss a}]:%p %l%m%n
#info log
log4j.logger.info=info
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.File=logs/info.log
log4j.appender.info.Append=true
log4j.appender.info.Threshold=INFO
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n
#debug log
log4j.logger.debug=debug
log4j.appender.debug=org.apache.log4j.DailyRollingFileAppender
log4j.appender.debug.File=logs/debug.log
log4j.appender.debug.Append=true
log4j.appender.debug.Threshold=DEBUG
log4j.appender.debug.layout=org.apache.log4j.PatternLayout
log4j.appender.debug.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n
#warn log
log4j.logger.warn=warn
log4j.appender.warn=org.apache.log4j.DailyRollingFileAppender
log4j.appender.warn.File=logs/warn.log
log4j.appender.warn.Append=true
log4j.appender.warn.Threshold=WARN
log4j.appender.warn.layout=org.apache.log4j.PatternLayout
log4j.appender.warn.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n
#error
log4j.logger.error=error
log4j.appender.error = org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.File = logs/error.log
log4j.appender.error.Append = true
log4j.appender.error.Threshold = ERROR
log4j.appender.error.layout = org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n
上面日志输出级别为debug,那么将会输出debug、info、warn、error的日志,如果配置的是error,就只会输出error的日志。
三、Log4jTest
package com.suibibk;
import org.apache.log4j.Logger;
public class Log4jTest {
private static Logger log = Logger.getLogger("Log4jTest");
public static void main(String[] args) {
log.debug("这个是debug日志");
log.info("这个是info日志");
log.warn("这个是警告日志");
log.error("这个是错误日志");
}
}
四、测试
运行案例,因为我们的日志都配置输出在logs目录下,打开logs目录可以看到日下是个文件:
打开info.log会看到如下内容
2019-11-19 09:06:28 上午 [Thread: main][ Class:Log4jTest >> Method: com.suibibk.Log4jTest.main(Log4jTest.java:9) ]
INFO:这个是info日志
2019-11-19 09:06:28 上午 [Thread: main][ Class:Log4jTest >> Method: com.suibibk.Log4jTest.main(Log4jTest.java:10) ]
WARN:这个是警告日志
2019-11-19 09:06:28 上午 [Thread: main][ Class:Log4jTest >> Method: com.suibibk.Log4jTest.main(Log4jTest.java:11) ]
ERROR:这个是错误日志
打开error.log会看到如下内容
2019-11-19 09:06:28 上午 [Thread: main][ Class:Log4jTest >> Method: com.suibibk.Log4jTest.main(Log4jTest.java:11) ]
ERROR:这个是错误日志
五、配置文件解析
1.配置根Logger,其语法为:
log4j.rootLogger = [ level ] , appenderName, appenderName, …
其中,level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别,优 先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定 义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。 appenderName就是指B日志信息输出到哪个地方。您可以同时指定多个输出目的地。
这里配置的为:
log4j.rootLogger=debug,stdout,info,debug,warn,error
表明日志级别level对应的是debug(大小写都可以),然后appenderName有五个地方,对应下面的五个配置,分别是控制台,info日志,debug日志,warn日志和错误日志的输出地方,当然这里不一定叫做info,可以取任何名字,只要跟下面对应就可以了。
2、配置日志信息输出目的地Appender,其语法为:
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.option = valueN
其中,Log4j提供的appender有以下几种:
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
比如我上面配置的stdout和info的appender
#console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
...
#info log
log4j.logger.info=info
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
...
3、配置日志信息的格式(布局),其语法为:
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.option = valueN
其中,Log4j提供的layout有以e几种:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
我这里采用的是PatternLayout
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n
Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下: %m 输出代码中指定的消息
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
4、配置输出日志文件
log4j.appender.info.File=logs/info.log
这个是我上面info日志的文件位置,在logs下面的info.log文件
结束!