log4j的入门使用
简介
日志是程序的重要组成部分,在程序中添加日志记录,可以方便记录代码变化情况、跟踪代码运行轨迹、发掘代码错误位置并调试。log4j可以将日志信息输出到控制台和指定文件中
使用
引入jar包依赖
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
添加log4j.properties
在创建的maven项目的src/main/resources下创建log4j.properties,用于配置日志信息
配置根Logger
使用语法如下
log4j.rootLogger=[level],appenderName,appenderName……
上述语法中,level为日志级别,优先级从低到高依次为DEBUG(调试)、INFO(信息)、WARN(警告)、ERROR(错误)、FATAL(重大错误,会导致程序直接中断)、这5个级别是包含关系,定义level为INFO级别,大于等于INFO级别的日志都可以输出,小于INFO级别的DEBUG信息无法输出
appenderName为日志输出的目的地名称,如果用stdout表示输出到控制台,D表示DEBUG信息输出,E表示ERROR信息的输出
# 配置根Logger
log4j.rootLogger=debug,stdout,D,E,W
2.配置日志的输出目的地Appender,使用语法如下
log4j.appender.appenderName=fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1=value1
……
log4j.appender.appenderName.optionN=valueN
上述中,appenderName为根目录中定义的输出目的地名称,log4j提供的appender有ConsoleAppender、FileAppender、DailyRollingFileAppender、RollingFileAppender和WriterAppender
由于WriterAppender 不能直接配置使用,所以使用更多的是前面四种,
org.apache.log4j.ConsoleAppender (控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
org.apache.log4j.RollingFileAppender (文件大小达到指定尺寸的时候产生一个新的文件)
org.apache.log4j.WriterAppender (将日志信息以流格式发送到任意指定的地方)
ConsoleAppender
ConsoleAppender(控制台) 的option如下
- Threshold=DEBUG 指定日志消息的输出最低级别,默认为DEBUG
- ImmediateFlush=true 默认是true,表示所有消息都会被立即输出
- Target=System.err 使用System.err在控制台输出,默认情况下是System.out
FileAppender
FileAppender(文件)的option如下
- Threshold=DEBUG 指定日志消息的输出最低级别,默认为DEBUG
- ImmediateFlush=true 默认是true,表示所有消息都会被立即输出
- File=E:\logs.txt 指定消息输出到E盘中的logs.txt文件中
- Append=false 默认是true,以追加的方式将消息增加到指定文件中,false指将消息覆盖指定的文件内容
DailyRollingFileAppender
DailyRollingFileAppender(每天产生一个日志文件)的option如下
- Threshold=DEBUG 指定日志消息的输出最低级别,默认为DEBUG
- ImmediateFlush=true 默认是true,表示所有消息都会被立即输出
- File=E:\logs.txt 指定消息输出到E盘中的logs.txt文件中
- Append=false 默认是true,以追加的方式将消息增加到指定文件中,false指将消息覆盖指定的文件内容
- DatePattern =’.'yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。用户可以指定月、周、天、时和分滚动文件
RollingFileAppender
RollingFileAppender(文件大小达到指定尺寸的时候产生一个新的文件)的option如下
- Threshold=DEBUG 指定日志消息的输出最低级别,默认为DEBUG
- ImmediateFlush=true 默认是true,表示所有消息都会被立即输出
- File=E:\logs.txt 指定消息输出到E盘中的logs.txt文件中
- Append=false 默认是true,以追加的方式将消息增加到指定文件中,false指将消息覆盖指定的文件内容
- MaxFileSize=100KB:后缀可以时KB、MB、GB。在日志文件达到设置时会产生新的文件,即将原来的内容移动新的文件
- MaxBackupIndex=2 指定可以产生的滚动文件的最大数
配置layout
log4j提供的layout有HTMLLayout、PatternLayout、SimpleLayOut和TTCCLayout
常用的是PatternLayout
org.apache.log4j.HTMLLayout(HTML表格形式布局)
org.apache.log4j.PatternLayout(灵活地指定布局模式)
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等信息)
HTMLLayout
HTMLLayout的option包括如下
- LocationInfo=true 默认值是true,输出java文件名称和行号
- Title=Test_WARN:默认值是Log4J Log Messages ,这里是Test_WARN
PatternLayout
PatternLayout的option包括如下
- ConversionPattern=%m%n:以指定信息格式输出,格式如下
%p:输出优先级 ,即DEBUG、INFO、WARN、ERROR、FATAL
%r:输出自应用启动到输出该log信息耗费的毫秒数
%c:输出所属的类目,通常就是所在类的全名
%n 输出一个回车换行符
%d 输出日志时间点的日期或时间 默认格式为ISO8601,也可以在其后指定格式,如%d {yyyy-MM-dd HH:mm:ss,SSS}
%l:输出日志事件发生的位置,包括类目名、发生的线程、以及在代码中的行数
%t:输出产生该日志事件的线程名
测试案例
在log4j.properties中添加如下配置
# 配置根Logger
log4j.rootLogger=debug,stdout,D,E,W
# 输出信息到控制台
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%p[%d{yyyy-MM-dd HH\:mm\:ss,SSS} [%t] %C.%M(%L) | %m%n
## 输出DEBUG级别以上的日志到D://logs/log.log
log4j.appender.D=org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File=D://logs/log.html
log4j.appender.D.Append=true
log4j.appender.D.Threshold=DEBUG
log4j.appender.D.layout=org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern=%p[%d{yyyy-MM-dd HH\:mm\:ss,SSS} [%t] %C.%M(%L) | %m%n
## 输出Error级别以上的日志到D://logs/error.log
log4j.appender.E=org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File=D://logs/error.html
log4j.appender.E.Append=true
log4j.appender.E.Threshold=ERROR
log4j.appender.E.layout=org.apache.log4j.HTMLLayout
log4j.appender.E.layout.locationInfo=true
log4j.appender.E.layout.Title=Test_ERROR
## 输出Info级别以上的日志到D://logs/warn.log
log4j.appender.W=org.apache.log4j.RollingFileAppender
log4j.appender.W.File=D://logs/warn.html
log4j.appender.W.Append=true
log4j.appender.W.Threshold=WARN
log4j.appender.W.MaxFileSize=2KB
log4j.appender.W.layout=org.apache.log4j.HTMLLayout
log4j.appender.W.layout.locationInfo=true
log4j.appender.E.layout.Title=Test_WARN
测试程序
package test;
import org.apache.log4j.Logger;
public class TestCase {
static final Logger logger=Logger.getLogger(TestCase.class);
public static void main(String[] args) {
System.out.println("hello");//控制台输出
//日志信息
logger.info("hello word");
logger.debug("This is debug message");
logger.warn("This is warn message");
logger.error("This is error message");
}
}
执行测试程序后,控制台输出如下
D盘产生三个文件
error.html内容
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Test_WARN</title>
<style type="text/css">
<!--
body, table {font-family: arial,sans-serif; font-size: x-small;}
th {background: #336699; color: #FFFFFF; text-align: left;}
-->
</style>
</head>
<body bgcolor="#FFFFFF" topmargin="6" leftmargin="6">
<hr size="1" noshade>
Log session start time Fri Oct 09 21:02:24 CST 2020<br>
<br>
<table cellspacing="0" cellpadding="4" border="1" bordercolor="#224466" width="100%">
<tr>
<th>Time</th>
<th>Thread</th>
<th>Level</th>
<th>Category</th>
<th>File:Line</th>
<th>Message</th>
</tr>
<tr>
<td>3</td>
<td title="main thread">main</td>
<td title="Level"><font color="#993300"><strong>ERROR</strong></font></td>
<td title="test.TestCase category">test.TestCase</td>
<td>TestCase.java:13</td>
<td title="Message">This is error message</td>
</tr>
log.html内容:
由于log4j.appender.D.layout.ConversionPattern与控制台中的信息是相同的,所以日志信息如下展示
INFO[2020-10-09 21:02:24,588 [main] test.TestCase.main(10) | hello word
DEBUG[2020-10-09 21:02:24,589 [main] test.TestCase.main(11) | This is debug message
WARN[2020-10-09 21:02:24,589 [main] test.TestCase.main(12) | This is warn message
ERROR[2020-10-09 21:02:24,591 [main] test.TestCase.main(13) | This is error message
warn.html内容
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Log4J Log Messages</title>
<style type="text/css">
<!--
body, table {font-family: arial,sans-serif; font-size: x-small;}
th {background: #336699; color: #FFFFFF; text-align: left;}
-->
</style>
</head>
<body bgcolor="#FFFFFF" topmargin="6" leftmargin="6">
<hr size="1" noshade>
Log session start time Fri Oct 09 21:02:24 CST 2020<br>
<br>
<table cellspacing="0" cellpadding="4" border="1" bordercolor="#224466" width="100%">
<tr>
<th>Time</th>
<th>Thread</th>
<th>Level</th>
<th>Category</th>
<th>File:Line</th>
<th>Message</th>
</tr>
<tr>
<td>1</td>
<td title="main thread">main</td>
<td title="Level"><font color="#993300"><strong>WARN</strong></font></td>
<td title="test.TestCase category">test.TestCase</td>
<td>TestCase.java:12</td>
<td title="Message">This is warn message</td>
</tr>
<tr>
<td>3</td>
<td title="main thread">main</td>
<td title="Level"><font color="#993300"><strong>ERROR</strong></font></td>
<td title="test.TestCase category">test.TestCase</td>
<td>TestCase.java:13</td>
<td title="Message">This is error message</td>
</tr>