log4j配置使用详解与实例

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: log4j配置使用详解与实例

在实际应用中,要使Log4j在系统中运行须事先设定配置文件。配置文件事实上也就是对Logger、Appender及Layout进行相应设定。


Log4j支持两种配置文件格式,一种是XML格式的文件,一种是properties属性文件。


下面以properties属性文件为例介绍log4j.properties的配置。


【1】配置使用详解

① 配置根Logger:

语法格式如下:

log4j.rootLogger = [ level ] , appenderName1, appenderName2, …

log4j.additivity.org.apache=false:表示Logger不会在父Logger的appender里输出,默认为true。


level :设定日志记录的最低级别。


appenderName:就是指定日志信息要输出到哪里。可以同时指定多个输出目的地,用逗号隔开。示例如下:

log4j.rootLogger=info,Console,File


② 配置日志信息输出目的地(appender)

语法格式如下:

log4j.appender.appenderName = className

appenderName:自定义appderName,在log4j.rootLogger设置中使用;

className:可设值如下:

(1)org.apache.log4j.ConsoleAppender(控制台)
(2)org.apache.log4j.FileAppender(文件)
(3)org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
(4)org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
(5)org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)



(1)ConsoleAppender选项:

Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。

ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。

Target=System.err:默认值是System.out。


示例如下:

log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Threshold=DEBUG
log4j.appender.Console.Target=System.out
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c]%m%n

(2)FileAppender选项:


Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。


ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。


Append=false:true表示消息增加到指定文件中,false则将消息覆盖指定的文件内容,默认值是true。


File=${catalina.base}/mylog/appsys.log:指定当前消息输出到appsys.log文件中。示例如下:

log4j.appender.logFile=org.apache.log4j.FileAppender 
log4j.appender.logFile.Threshold=DEBUG 
log4j.appender.logFile.ImmediateFlush=true 
log4j.appender.logFile.Append=true 
log4j.appender.logFile.File=D:/logs/log.log4j 
log4j.appender.logFile.layout=org.apache.log4j.PatternLayout 
log4j.appender.logFile.layout.ConversionPattern=[%-5p] %d(%r) –> [%t] %l: %m %x %n

(3)RollingFileAppender选项:


Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。


ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。


Append=false:true表示消息增加到指定文件中,false则将消息覆盖指定的文件内容,默认值是true。


File=${catalina.base}/logs/appsys.log:指定消息输出到appsys.log文件中。


MaxFileSize=100KB:后缀可以是KB, MB 或者GB。在日志文件到达该大小时,将会自动滚动,即将原来的内容移到logging.log4j.1文件中。


MaxBackupIndex=2:指定可以产生的滚动文件的最大数。


例如,设为2则可以产生logging.log4j.1,logging.log4j.2两个滚动文件和一个logging.log4j文件。当第二个日志文件达到最大值,第一个日志文件将被删除,之后所有的日志信息将被回滚到第一个日志文件。

示例如下:

log4j.appender.R.File=${catalina.base}/logs/appsys.log
log4j.appender.R.layout=org.apache.log4j.PatternLayout 
log4j.appender.R.MaxFileSize=5000KB 
log4j.appender.R.MaxBackupIndex=8 
log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p %t %c - %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender 

(4)DailyRollingFileAppender选项:


Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。


ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。


Append=false:true表示消息增加到指定文件中,false则将消息覆盖指定的文件内容,默认值是true。


File=${catalina.base}/mylog/appsys.log:指定当前消息输出到appsys.log文件中。


DatePattern=’.'yyyy-MM:每月滚动一次日志文件,即每月产生一个新的日志文件。当前月的日志文件名为lappsys.log,前一个月的日志文件名为appsys.log.yyyy-MM。


另外,也可以指定按周、天、时、分等来滚动日志文件,对应的格式如下:

1)’.‘yyyy-MM:每月

2)’.‘yyyy-ww:每周

3)’.‘yyyy-MM-dd:每天

4)’.‘yyyy-MM-dd-a:每天两次

5)’.‘yyyy-MM-dd-HH:每小时

6)’.'yyyy-MM-dd-HH-mm:每分钟


示例如下:

log4j.appender.File=org.apache.log4j.DailyRollingFileAppender
log4j.appender.File.File=${catalina.base}/HNTOWER/hn_tower_check.log
log4j.appender.File.Threshold=INFO
log4j.appender.File.Append=true
log4j.appender.File.ImmediateFlush=true
log4j.appender.File.DatePattern=yyyy-MM-dd'.log'
log4j.appender.File.layout=org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c]%m%n

产生日志如下图所示:


③ 配置日志信息的输出格式(Layout)

语法格式如下:

log4j.appender.appenderName.layout=className


className:可设值如下:

(1)org.apache.log4j.HTMLLayout(以HTML表格形式布局)
(2)org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
(3)org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
(4)org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)


(1)HTMLLayout选项:

LocationInfo=true:输出java文件名称和行号,默认值是false。

Title=My Logging: 默认值是Log4J Log Messages。


(2)PatternLayout选项:

ConversionPattern=%m%n:设定以怎样的格式显示消息。

(3)XMLLayout选项:

LocationInfo=true:默认值是false,输出java文件和行号。


④ 设置不同框架(不同包)的日志级别

示例如下:

log4j.logger.org.hibernate=INFO
#log4j.logger.org.hibernate=ERROR
#log4j.logger.org.hibernate=DEBUG
#log4j.logger.org.apache=INFO
#log4j.logger.org.apache=DEBUG
#log4j.logger.org.apache=ERROR
#log4j.logger.org.apache.struts2=INFO
#log4j.logger.org.apache.myfaces=INFO
#log4j.logger.org.apache.myfaces=DEBUG
log4j.logger.org.apache.myfaces=ERROR
log4j.logger.org.springframework=INFO
#log4j.logger.org.springframework=DEBUG
#log4j.logger.org.springframework=ERROR
#log4j.logger.com.opensymphony.xwork2=INFO
#log4j.logger.com.opensymphony.xwork2=INFO
#log4j.logger.com.opensymphony.xwork2.config=DEBUG
log4j.logger.com.opensymphony.xwork2=ERROR
log4j.logger.freemarker=INFO
#log4j.logger.freemarker=DEBUG
#log4j.logger.freemarker=ERROR
log4j.logger.org.quartz=INFO
#log4j.logger.org.quartz=DEBUG
#log4j.logger.org.quartz=ERROR
log4j.logger.org.json=INFO
#log4j.logger.org.json=DEBUG
#log4j.logger.org.json=ERROR
log4j.logger.javax.faces=INFO
#log4j.logger.javax.faces=DEBUG
#log4j.logger.javax.faces=ERROR
#log4j.logger.org.apache.ibatis=INFO,debug,stdout 
#log4j.logger.org.apache.ibatis=DEBUG
#log4j.logger.org.apache.ibatis=ERROR
log4j.logger.org.apache.ibatis=DEBUG
#log4j.logger.org.mybatis.spring=INFO
log4j.logger.org.mybatis=DEBUG
log4j.logger.org.mybatis.spring=DEBUG
log4j.logger.org.mybatis.spring.mapper=DEBUG
#log4j.logger.org.mybatis.spring=ERROR
log4j.logger.org.activiti=INFO
#log4j.logger.org.activiti=DEBUG
#log4j.logger.org.activiti=ERROR
log4j.logger.oracle=INFO
#log4j.logger.oracle=DEBUG
#log4j.logger.oracle=ERROR
#设置自定义包的级别
#log4j.logger.com.web=INFO
log4j.logger.com.web=DEBUG
#log4j.logger.com.web=ERROR
log4j.logger.java.sql.Connection = DEBUG
log4j.logger.java.sql.Statement = DEBUG
log4j.logger.java.sql.PreparedStatement = DEBUG
log4j.logger.java.sql.ResultSet =ERROR 
#log4j.logger.java.sql.ResultSet=DEBUG



⑤ 输出信息到单独文件

① 输入error信息到单独文件

即,根据级别划分,将error日志输出到单独文件。

log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = logs/error.log ## 异常日志文件名
log4j.appender.D.Append = true
log4j.appender.D.Threshold = ERROR ## 只输出ERROR级别以上的日志!!!
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n


② 输出自定义类到单独文件


即,将指定类的日志输出到单独文件。

如果想对不同的类输出不同的文件(以cn.com.Test为例),先要在Test.java中定义:

private static Log logger = LogFactory.getLog(Test.class);

然后在log4j.properties中加入如下配置(以类的全类名作为logger自定义名字):

log4j.logger.cn.com.Test= DEBUG, test
log4j.appender.test=org.apache.log4j.FileAppender
log4j.appender.test.File=${myweb.root}/WEB-INF/log/test.log
log4j.appender.test.layout=org.apache.log4j.PatternLayout
log4j.appender.test.layout.ConversionPattern=%d %p [%c] - %m%n


也就是让cn.com.Test中的logger使用log4j.appender.test所做的配置。


但是,如果在同一类中需要输出多个日志文件呢?

其实道理是一样的,先在Test.java中定义:

private static Log logger1 = LogFactory.getLog("myTest1");
private static Log logger2 = LogFactory.getLog("myTest2");



然后在log4j.properties中加入如下配置(这里注意logger自定义名字和appender自定义名字):

log4j.logger.myTest1= DEBUG, test1
log4j.appender.test1=org.apache.log4j.FileAppender
log4j.appender.test1.File=${myweb.root}/WEB-INF/log/test1.log
log4j.appender.test1.layout=org.apache.log4j.PatternLayout
log4j.appender.test1.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.logger.myTest2= DEBUG, test2
log4j.appender.test2=org.apache.log4j.FileAppender
log4j.appender.test2.File=${myweb.root}/WEB-INF/log/test2.log
log4j.appender.test2.layout=org.apache.log4j.PatternLayout
log4j.appender.test2.layout.ConversionPattern=%d %p [%c] - %m%n

也就是在用logger时给它一个自定义的名字(如这里的"myTest1"),然后在log4j.properties中做出相应配置即可。

别忘了不同日志要使用不同的logger(如输出到test1.log的要用logger1.info(“abc”))。



还有一个问题,就是这些自定义的日志默认是同时输出到log4j.rootLogger所配置的日志中的,如何能只让它们输出到自己指定的日志中呢?


别急,这里有个开关:

log4j.additivity.myTest1 = false

它用来设置是否同时输出到log4j.rootLogger所配置的日志中,设为false就不会输出到其它地方!


注意这里的"myTest1"是你在程序中给logger起的那个自定义的名字!


如果你说,我只是不想同时输出这个日志到log4j.rootLogger所配置的logfile中,console里我还想同时输出呢!


那也好办,把你的


log4j.logger.myTest1 = DEBUG, test1


改为


log4j.logger.myTest1=DEBUG, test1,console


Log4j配置文件实现了输出到控制台、文件、回滚文件、发送日志邮件、输出到数据库日志表、自定义标签等全套功能。


根配置如下

log4j.rootLogger=DEBUG,console,dailyFile,im
log4j.additivity.org.apache=true

【2】配置实例

① 控制台(console)

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.ImmediateFlush=true
log4j.appender.console.Target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

② 日志文件(logFile)


log4j.appender.logFile=org.apache.log4j.FileAppender
log4j.appender.logFile.Threshold=DEBUG
log4j.appender.logFile.ImmediateFlush=true
log4j.appender.logFile.Append=true
log4j.appender.logFile.File=D:/logs/log.log4j
log4j.appender.logFile.layout=org.apache.log4j.PatternLayout
log4j.appender.logFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

③ 回滚文件(rollingFile)

log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender
log4j.appender.rollingFile.Threshold=DEBUG
log4j.appender.rollingFile.ImmediateFlush=true
log4j.appender.rollingFile.Append=true
log4j.appender.rollingFile.File=D:/logs/log.log4j
log4j.appender.rollingFile.MaxFileSize=200KB
log4j.appender.rollingFile.MaxBackupIndex=50
log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.rollingFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

④ 定期回滚日志文件(dailyFile)

log4j.appender.dailyFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyFile.Threshold=DEBUG
log4j.appender.dailyFile.ImmediateFlush=true
log4j.appender.dailyFile.Append=true
log4j.appender.dailyFile.File=D:/logs/log.log4j
log4j.appender.dailyFile.DatePattern='.'yyyy-MM-dd
log4j.appender.dailyFile.layout=org.apache.log4j.PatternLayout
log4j.appender.dailyFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

⑤ 应用于socket


log4j.appender.socket=org.apache.log4j.RollingFileAppender
log4j.appender.socket.RemoteHost=localhost
log4j.appender.socket.Port=5001
log4j.appender.socket.LocationInfo=true

⑥ 发送日志到指定邮件


log4j.appender.mail=org.apache.log4j.net.SMTPAppender
log4j.appender.mail.Threshold=FATAL
log4j.appender.mail.BufferSize=10
log4j.appender.mail.From = xxx@mail.com
log4j.appender.mail.SMTPHost=mail.com
log4j.appender.mail.Subject=Log4J Message
log4j.appender.mail.To= xxx@mail.com
log4j.appender.mail.layout=org.apache.log4j.PatternLayout
log4j.appender.mail.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

⑦ 应用于数据库


log4j.appender.database=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.database.URL=jdbc:mysql://localhost:3306/test
log4j.appender.database.driver=com.mysql.jdbc.Driver
log4j.appender.database.user=root
log4j.appender.database.password=
log4j.appender.database.sql=INSERT INTO LOG4J (Message) VALUES('=[%-5p] %d(%r) --> [%t] %l: %m %x %n')
log4j.appender.database.layout=org.apache.log4j.PatternLayout
log4j.appender.database.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

⑧ 自定义Appender


log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender
log4j.appender.im.host = mail.cybercorlin.net
log4j.appender.im.username = username
log4j.appender.im.password = password
log4j.appender.im.recipient = corlin@cybercorlin.net
log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

⑨ 项目配置实例

① 根据日期生成日志文件

完整实例如下:

log4j.rootLogger=INFO,console,file
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.SimpleLayout
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.file=../logs/ssm.log
log4j.appender.file.encoding=GBK
log4j.appender.file.DatePattern=yyyy-MM-dd'.log'
log4j.appender.file.Append=true
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c - %m%n
log4j.logger.com*=DEBUG
log4j.logger.com.ibatis=debug
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug
log4j.logger.java.sql.Connection=debug
log4j.logger.java.sql.Statement=debug
log4j.logger.java.sql.PreparedStatement=debug

生成日志文件效果如下:

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
2天前
|
开发工具 git
git显示开发日志+WinSW——将.exe文件注册为服务的一个工具+图床PicGo+kubeconfig 多个集群配置 如何切换
git显示开发日志+WinSW——将.exe文件注册为服务的一个工具+图床PicGo+kubeconfig 多个集群配置 如何切换
14 1
|
3天前
|
数据采集 监控 Java
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......
本文是关于SpringBoot日志的详细教程,涵盖日志的定义、用途、SLF4J框架的使用、日志级别、持久化、文件分割及格式配置等内容。
11 0
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......
|
2月前
|
Java 应用服务中间件 HSF
Java应用结构规范问题之配置Logback以仅记录错误级别的日志到一个滚动文件中的问题如何解决
Java应用结构规范问题之配置Logback以仅记录错误级别的日志到一个滚动文件中的问题如何解决
|
2月前
|
Java 应用服务中间件 HSF
Java应用结构规范问题之配置Logback以在控制台输出日志的问题如何解决
Java应用结构规范问题之配置Logback以在控制台输出日志的问题如何解决
|
2月前
|
存储 Ubuntu Apache
如何在 Ubuntu VPS 上配置 Apache 的日志记录和日志轮转
如何在 Ubuntu VPS 上配置 Apache 的日志记录和日志轮转
35 6
|
2月前
|
存储 Ubuntu 应用服务中间件
如何在 Ubuntu VPS 上配置 Nginx 的日志记录和日志轮转
如何在 Ubuntu VPS 上配置 Nginx 的日志记录和日志轮转
20 4
|
2月前
|
存储 容器
【Azure 事件中心】为应用程序网关(Application Gateway with WAF) 配置诊断日志,发送到事件中心
【Azure 事件中心】为应用程序网关(Application Gateway with WAF) 配置诊断日志,发送到事件中心
|
2月前
|
人工智能
【Azure Application Insights】在Azure Function中启用Application Insights后,如何配置不输出某些日志到AI 的Trace中
【Azure Application Insights】在Azure Function中启用Application Insights后,如何配置不输出某些日志到AI 的Trace中
|
3月前
|
Java 测试技术
深入理解Logback异步日志配置及性能优化
深入理解Logback异步日志配置及性能优化
242 2
|
3月前
|
缓存 Java
浅析JAVA日志中的性能实践与原理解释问题之AsyncAppender的配置方式的问题是如何解决的
浅析JAVA日志中的性能实践与原理解释问题之AsyncAppender的配置方式的问题是如何解决的