log4j配置使用详解与实例

简介: 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

生成日志文件效果如下:

相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
目录
相关文章
|
3月前
|
监控 安全 程序员
Python日志模块配置:从print到logging的优雅升级指南
从 `print` 到 `logging` 是 Python 开发的必经之路。`print` 调试简单却难维护,日志混乱、无法分级、缺乏上下文;而 `logging` 支持级别控制、多输出、结构化记录,助力项目可维护性升级。本文详解痛点、优势、迁移方案与最佳实践,助你构建专业日志系统,让程序“有记忆”。
302 0
|
4月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
680 5
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
4014 31
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
10月前
|
SQL Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— application.yml 中对日志的配置
在 Spring Boot 项目中,`application.yml` 文件用于配置日志。通过 `logging.config` 指定日志配置文件(如 `logback.xml`),实现日志详细设置。`logging.level` 可定义包的日志输出级别,例如将 `com.itcodai.course03.dao` 包设为 `trace` 级别,便于开发时查看 SQL 操作。日志级别从高到低为 ERROR、WARN、INFO、DEBUG,生产环境建议调整为较高级别以减少日志量。本课程采用 yml 格式,因其层次清晰,但需注意格式要求。
970 0
|
安全 BI 网络安全
EventLog Analyzer 如何满足等保合规要求?密码有效期、产品日志保留、配置备份三大核心问题全面解答
EventLog Analyzer(ELA)助力企业满足网络安全等级保护要求,支持配置自动/手动备份、日志180天留存及密码策略管理,提升合规性与安全运营效率。
159 0
|
6月前
|
JSON 安全 Go
Go语言项目工程化 —— 日志、配置、错误处理规范
本章详解Go语言项目工程化核心规范,涵盖日志、配置与错误处理三大关键领域。在日志方面,强调其在问题排查、性能优化和安全审计中的作用,推荐使用高性能结构化日志库zap,并介绍日志级别与结构化输出的最佳实践。配置管理部分讨论了配置分离的必要性,对比多种配置格式如JSON、YAML及环境变量,并提供viper库实现多环境配置的示例。错误处理部分阐述Go语言显式返回error的设计哲学,讲解标准处理方式、自定义错误类型、错误封装与堆栈追踪技巧,并提出按调用层级进行错误处理的建议。最后,总结各模块的工程化最佳实践,助力构建可维护、可观测且健壮的Go应用。
|
7月前
|
存储 NoSQL MongoDB
Docker中安装MongoDB并配置数据、日志、配置文件持久化。
现在,你有了一个运行在Docker中的MongoDB,它拥有自己的小空间,对高楼大厦的崩塌视而不见(会话丢失和数据不持久化的问题)。这个MongoDB的数据、日志、配置文件都会妥妥地保存在你为它精心准备的地方,天旋地转,它也不会失去一丁点儿宝贵的记忆(即使在容器重启后)。
856 4
|
9月前
|
存储 监控 API
【Azure App Service】分享使用Python Code获取App Service的服务器日志记录管理配置信息
本文介绍了如何通过Python代码获取App Service中“Web服务器日志记录”的配置状态。借助`azure-mgmt-web` SDK,可通过初始化`WebSiteManagementClient`对象、调用`get_configuration`方法来查看`http_logging_enabled`的值,从而判断日志记录是否启用及存储方式(关闭、存储或文件系统)。示例代码详细展示了实现步骤,并附有执行结果与官方文档参考链接,帮助开发者快速定位和解决问题。
287 23
|
10月前
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
10月前
|
数据库连接 测试技术 Windows
【YashanDB知识库】windows配置ODBC跟踪日志, 使用日志定位问题
【YashanDB知识库】windows配置ODBC跟踪日志, 使用日志定位问题