提示:学知识,特别是开发技术,要有下面的观念
- 这是个什么东西?有什么作用?
- 找个例子,看下演示,或者自己动手做一下,知道并理解它能干什么。
- 这个东西怎么实现的,或者有配置的话,怎么配置的?配置项的中关键概念是那些?
- 这个东西和其他类似功能的东西的对比,优劣?
- 使用这个东西有什么潜在的问题吗?
一.log4j日志系统介绍
1.关键组成部分
- Logger:设置总体日志级别,和要设置的那些appender,可同时设置多个appender
- Appender:输出日志的位置,常见的输出到控制台,输出到文件
- Layout:输出日志的形式
2.日志级别
Logj4日志级别有5个DEBUG、INFO、WARN、ERROR和FATAL,Log4j有一个规则:只输出级别不低于设定级别的日志信息,所以如果你配置设置的级别是error,那么你在代码里用log.info()打印的日志不会输出.
3.输出日志文件的设置选择
- 滚动生成,设置一个时间周期X,过了X之后就生成一个新日志文件
- 滚动生成,设置一个文件大小阈值threld,日志文件到达threld时设置成一个新文件
- 可以设置日志文件的位置和名字,名字可以带参数(系统环境变量)
- 某个类的日志输出为独立的日志文件
二.具体配置
假设使用gradle作为构建工具
1.buidl gradle的配置
// 日志管理依赖
implementation group: 'org.slf4j', name: 'slf4j-api', version: '2.0.3'
implementation group: 'org.slf4j', name: 'slf4j-log4j12', version: '2.0.3', ext: 'pom'
implementation group: 'org.apache.logging.log4j', name: 'log4j-to-slf4j', version: '2.19.0'
2.log4j.properties
这一部分就要根据你的不同选择来进行个性化配置了,以下根据你想要的设置的功能来进行设置
2.1 最简单的配置
log4j.rootLogger=info, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
2.2 输出到固定日志文件
log4j.rootLogger=info, stdout, fileOut
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
##### 输出到固定file的格式
# 输出到file
log4j.appender.fileOut=org.apache.log4j.FileAppender
# 设置输出到file的日志级别,会覆盖rootLogger里设置得全局日志级别
log4j.appender.fileOut.Threshold=info
# true表示消息增加到指定文件中
log4j.appender.fileOut.Append=true
# 指定消息输出的位置/logging.log4j
#log4j.appender.fileOut.File=${env: LOG_HOME}
#log4j.appender.fileOut.File=${sys: log.home}
log4j.appender.fileOut.File=D:/logs/log4j.log
# 指定消息的输出格式,不指定格式的话,消息无法输出
# org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
log4j.appender.fileOut.layout=org.apache.log4j.PatternLayout
# ConversionPattern指定具体的日志消息格式
log4j.appender.fileOut.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
2.2 设置按照日志文件大小滚动生成日志文件
log4j.rootLogger=debug, stdout, fileOut, rollingFile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
##### 输出到按照大小滚动的滚动日志文件
log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender
log4j.appender.rollingFile.Threshold=DEBUG
# ImmediateFlush=true:表示所有消息都会被立即输出
log4j.appender.rollingFile.ImmediateFlush=true
log4j.appender.rollingFile.Append=true
log4j.appender.rollingFile.File=D:/logs/log.log4j
# MaxFileSize=100KB,在日志文件到达该大小时,将会自动滚动,即将原来的内容移到logging.log4j.1文件中
# 后缀可以是KB, MB 或者GB。
log4j.appender.rollingFile.MaxFileSize=5KB
# MaxBackupIndex=2:指定可以产生的滚动文件的最大数
# 例如,设为2则可以产生logging.log4j.1,logging.log4j.2两个滚动文件和一个logging.log4j文件。
log4j.appender.rollingFile.MaxBackupIndex=5
log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.rollingFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
运行的例子:
2.3 设置按照时间滚动生成日志文件
滚动方式:
(1)如果设置成按照天滚动,则就是每天生成一个日志文件,当前的日志文件是没有日期后缀的,而是会把之前生成的日志加上设置的日期后缀,类似下图
(2) 如果设置小时,就是每小时一个日志文件,本小时的日志文件是没有日期后缀的,而是会把之前生成的日志加上设置的日期后缀
(3) 设置成分钟,同上,这个日期后缀是上个日志文件最后的修改时间
设置成分钟rolling的log4j.properties的配置
log4j.rootLogger=debug, stdout, fileOut, rollingFile, timeRollingFile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
# 定期回滚日志文件(timeRollingFile)
log4j.appender.timeRollingFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.timeRollingFile.Threshold=DEBUG
log4j.appender.timeRollingFile.ImmediateFlush=true
log4j.appender.timeRollingFile.Append=true
log4j.appender.timeRollingFile.File=D:/logs/log.log4j
log4j.appender.timeRollingFile.DatePattern=_yyyy-MM-dd-HH-mm'.log'
log4j.appender.timeRollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.timeRollingFile.layout.ConversionPattern=[%d{MM-dd HH:mm:ss}] [%p] [%c:%L] %m%n
主要是DatePattern的设置关系决定是否是按照每个月、每天、每小时、每分钟
DatePattern='_'yyyy-MM-dd'.log':每天滚动一次文件,即每天产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下:
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生成文件名带日期的文件_Kevin-Zeng的博客-优快云博客_log4j文件名日期格式
2.4 设置某个具体类输出一个独立的日志文件
2.5 使用系统环境变量、java虚拟机参数变量作为日志文件名字的一部分
(1)系统变量{env:env_name},测试失败,无法读取
(2)虚拟机参数:{name}
指定file位置:
-DLOG_HOME="D:\\logs\\log4j.log"
log4j.properties配置:
log4j.appender.fileOut.File=${LOG_HOME}
2.6 同时使用多个appender
2.7 layout的不同格式配置
log4j的安全
log4j2是什么
slf4j是什么
其他日志系统?
...
参考:Log4j.properties配置详解【log4j配置文件】_Archie_java的博客-优快云博客_log4j配置文件