1. 配置文件示例
下面展示一些 内联代码片
。
<?xml version="1.0" encoding="UTF-8"?>
<!-- ALL < TRACE< DEBUG < INFO < WARN < ERROR < FATAL < OFF -->
<!-- status: log4j本身的日志信息级别 -->
<Configuration status="OFF">
<!-- 配置变量,可以在下面通过变量名进行引用 -->
<Properties>
<Property name="BaseDir">logs</Property>
<Property name="LogName">info</Property>
<Property name="LogExtensionName">gz</Property>
</Properties>
<Appenders>
<!-- 日志写入文件 -->
<RollingFile
name="RollingFile"
fileName="${BaseDir}/${LogName}.${LogExtensionName}"
filePattern="${BaseDir}/$${date:yyyy-MM}/logs-%d{yyyy-MM-dd-HH}-%i.${LogExtensionName}.gz"
>
<!-- 日志信息格式 -->
<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%t] [%p] %c{1}.%M [%L] %m%n"/>
<!-- 判断哪些级别的日志可以写入该文件 -->
<Filters>
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<!-- 触发策略,决定何时触发文件的压缩, 满足下面任意一个条件都会触发压缩 -->
<Policies>
<!-- filePattern 中的最小粒度为单位, 每隔 interval 个单位时间压缩一次 -->
<!-- 比如: yyyy-MM-dd-HH, 则每隔5个小时压缩一次 -->
<TimeBasedTriggeringPolicy interval="5"/>
<!-- 文件大小超过500MB时压缩日志文件 -->
<SizeBasedTriggeringPolicy size="500MB"/>
</Policies>
<!--
max参数是与filePattern中的计数器%i配合使用,根据filePattern的不同max的含义也不同
1. 如果filePattern没有%i,则max不会生效
2. 如果filePattern没有时间格式,有%i, 文件个数达到max, 则会删除旧的日志文件
3. 如果filePattern有时间格式,有%i, 则时间格式相同时,文件个数达到max,则会删除旧的日志文件
例如 %d{yyyy-MM-dd-HH}, 如果某个小时的文件个数大于max,则会删除这个小时内的旧的日志文件
-->
<DefaultRolloverStrategy max="7">
<!-- 删除策略 -->
<!-- maxDepth=2: 表示该策略会应用于BaseDir子目录下的日志文件 -->
<Delete basePath="${BaseDir}" maxDepth="2">
<!-- 下面的文件名策略,文件最新的修改时间策略,文件大小策略,文件个数策略都可以进行组合使用 -->
<!-- IfAny 表示或, IfAll 表示与 -->
<!-- 如果filePattern中包含时间格式,则IfFileName策略会按照时间格式维度进行判断 -->
<!--
例如时间格式为%d{yyyy-MM-dd-HH},以2022-10-01-12的文件为例
info-2022-10-10-12-1.log.gz
info-2022-10-10-12-2.log.gz
info-2022-10-10-12-3.log.gz
info-2022-10-10-12-4.log.gz
1. 将2022-10-01-12的所有文件进行一次逻辑判断
2. 如果文件都超过30天未修改
3. 满足下面两个任意一个条件即可删除
3.1 2022-10-01-12文件总大小大于5GB
3.2 2022-10-01-12文件总个数大于3个
-->
<IfFileName glob="*/${LogName}-*.${LogExtensionName}.gz">
<IfLastModified age="30d">
<IfAny>
<IfAccumulatedFileSize exceeds="5GB"/>
<IfAccumulatedFileCount exceeds="3"/>
</IfAny>
</IfLastModified>
</IfFileName>
</Delete>
<!-- maxDepth=1: 表示该策略会应用于BaseDir目录下的日志文件 -->
<Delete basePath="${BaseDir}" maxDepth="1">
<IfLastModified age="10d" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<!-- 输出到控制台的日志信息 -->
<Console name="console" target="SYSTEM_OUT">
<ThresholdFilter level="INFO"/>
<PatternLayout pattern="[%d{yyyy-MM-dd-HH:mm:ss}] [%-15t] [%-5p] - %-35C{1} %M - %m%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="RollingFile"/>
<AppenderRef ref="console"/>
</Root>
</Loggers>
</Configuration>
#展示log4j各种配置,私有部分见文件中注释,公有部分详细注释见文件最后
log4j.rootLogger=DEBUG,console,file,rolling,daily,DATABASE,MAIL
#控制台
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} - [%p] - [%l] %m%n
#普通文件
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.Encoding=UTF-8
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} - [%p] - [%l] %m%n
log4j.appender.file.File=../logs/file.log
log4j.appender.file.Append=true
log4j.appender.rolling.Threshold=DEBUG
#轮转文件
log4j.appender.rolling=org.apache.log4j.RollingFileAppender
log4j.appender.rolling.layout=org.apache.log4j.PatternLayout
log4j.appender.rolling.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} - [%p] - [%l] %m%n
log4j.appender.rolling.Append=true
log4j.appender.rolling.Encoding=UTF-8
log4j.appender.rolling.Threshold=DEBUG
#表示最多保存10个日志文件
log4j.appender.rolling.MaxBackupIndex=10
log4j.appender.rolling.File=../logs/rolling.log
log4j.appender.rolling.MaxFileSize=10MB
#按日期区分
log4j.appender.daily=org.apache.log4j.DailyRollingFileAppender
log4j.appender.daily.layout=org.apache.log4j.PatternLayout
log4j.appender.daily.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} - [%p] - [%l] %m%n
log4j.appender.daily.Append=true
log4j.appender.daily.Encoding=UTF-8
log4j.appender.daily.Threshold=DEBUG
log4j.appender.daily.File=../logs/daily.log
# 表示重开文件的频率
# yyyy-MM,对应monthly(每月)
# yyyy-ww,对应weekly(每周)
# yyyy-MM-dd,对应daily(每天)
# yyyy-MM-dd-a,对应half-daily(每半天)
# yyyy-MM-dd-HH,对应hourly(每小时)
# yyyy-MM-dd-HH-mm,对应minutely(每分钟)
# 不用处理的文字放在单引号之间
log4j.appender.daily.DatePattern='.'yyyy-MM-dd'.log'
#写入数据库
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=root
log4j.appender.DATABASE.sql=INSERT INTO test (text) VALUES ('%d{yyyy-MM-dd HH:mm:ss} - [%p] - [%l] %m%n')
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} - [%p] - [%l] %m%n
#发送邮件
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=ERROR
log4j.appender.MAIL.From=7610aotian@sina.com
log4j.appender.MAIL.SMTPHost=smtp.sina.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=7610aotian@sina.com
#发件箱登陆用户名
log4j.appender.MAIL.SMTPUsername=******
#发件箱登陆密码
log4j.appender.MAIL.SMTPPassword=******
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} - [%p] - [%l] %m%n
# 定义输出级别和输出端(A1,A2,A3....)
# DEBUG: 指出细粒度信息事件对调试应用程序是非常有帮助的,就是输出debug的信息.
# INFO: 表明消息在粗粒度级别上突出强调应用程序的运行过程,就是输出提示信息.
# WARN: 表明会出现潜在错误的情形,就是显示警告信息.
# ERROR: 指出虽然发生错误事件,但仍然不影响系统的继续运行.就是显示错误信息.
# FATAL: 指出每个严重的错误事件将会导致应用程序的退出.
# ALL: 是最低等级的,用于打开所有日志记录.
# OFF: 是最高等级的,用于关闭所有日志记录.
# log4j建议只使用五个级别,级别顺序(由低到高): DEBUG < INFO < WARN < ERROR < FATAL
# windows下控制台效率比较差,输出的多了,非常影响服务器性能.
# 调试程序用debug或更低的优先级,这样开发的时候可以尽量输出,方便调试.
# 正式部署之后,可以提高日志的级别,只输出关键信息
log4j.rootLogger=DEBUG,*,*,*,*......
# 定义A1输出到控制器
# ConsoleAppender:写到控制台
# FileAppender:写到指定的文件中
# DailyRollingFileAppender:把Log信息输出到按照日期来区分的文件中,每天产生一个log文件
# RollingFileAppender:文件大小到达指定尺寸的时候产生一个新的文件
# WriterAppender:将日志信息以流格式发送到任意指定的地方(需要配合代码进行,不常用)
# JDBCAppender:输出日志文件到数据库
# SMTPAppender:发送到指定邮箱
log4j.appender.*=org.apache.log4j.ConsoleAppender
# 定义A1的布局模式
# HTMLLayout:以HTML表格形式布局
# PatternLayout:可以灵活地指定布局模式,就是可以自定义输出样式
# SimpleLayout:包含日志信息的级别和信息字符串
# TTCCLayout:包含日志产生的时间、线程、类别等等信息
log4j.appender.*.layout=org.apache.log4j.PatternLayout
# 定义A1的输出格式
# %m 输出代码中指定的消息
# %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
# %r 输出自应用启动到输出该log信息耗费的毫秒数
# %t 输出产生该日志事件的线程名;
# %n 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"
# %d 输出日志时间的日期或时间,默认格式为ISO8601,也可以在其后指定格式
# %c 输出所属的类目,通常就是所在类的全名,如“iNotes.Default”;
# %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数
# %L 输出代码中的行数;
# %F 输出代码中的文件名;
log4j.appender.*.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} - [%p] - [%l] %m%n
2. 注意事项
1.PatternLayout
-
- 模式字符含义
%d: 日志产生时间
%t: thread id当前线程ID
%p: priority日志优先级(DEBUG、INFO、WARN……)
%F: 日志所在文件名
%c: logger的名称
%C: 日志请求的完全限定类名(例如类名为com.skd.demo.App, %C{1} 会输出App)
%M: 日志所在方法名
%L: 日志语句所在的行号
%m: 日志内容
%n: 换行符
-
- 格式修饰符
以%M为例:
%20M: 右对齐,如果方法名长度小于20个字符,则用空格在左边补齐
%-20M: 左对齐,如果方法名长度小于20个字符,则用空格在右边补齐
%.20M: 左对齐,如果方法名长度大于20个字符,则保留右边的20个字符
%20.30M: 右对齐,如果方法名长度小于20个字符,则用空格在左边补齐; 如果长度大于30,则保留右边的30个字符
%-20.30M: 左对齐,如果方法名长度小于20个字符,则用空格在右边补齐; 如果长度大于30,则保留左边的30个字符
- ThresholdFilter
onMatch="ACCEPT" 表示匹配该级别及以上
onMatch="DENY" 表示不匹配该级别及以上
onMatch="NEUTRAL" 表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上
onMismatch="ACCEPT" 表示匹配该级别以下
onMismatch="NEUTRAL" 表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的
onMismatch="DENY" 表示不匹配该级别以下的
配置的其他说明
-
输出方式appender一般有5种:
org.apache.log4j.RollingFileAppender(滚动文件,自动记录最新日志)
org.apache.log4j.ConsoleAppender (控制台)
org.apache.log4j.FileAppender (文件)
org.apache.log4j.DailyRollingFileAppender (每天产生一个日志文件)
org.apache.log4j.WriterAppender (将日志信息以流格式发送到任意指定的地方) -
日记记录的优先级priority,优先级由高到低分为
OFF ,FATAL ,ERROR ,WARN ,INFO ,DEBUG ,ALL。
Log4j建议只使用FATAL ,ERROR ,WARN ,INFO ,DEBUG这五个级别。 -
格式说明layout中的参数都以%开始,后面不同的参数代表不同的格式化信息(参数按字母表顺序列出):
%c 输出所属类的全名,可在修改为 %d{Num} ,Num类名输出的维(如:“org.apache.elathen.ClassName”,%C{2}将输出elathen.ClassName)
%d 输出日志时间其格式为 %d{yyyy-MM-dd HH:mm:ss,SSS},可指定格式 如 %d{HH:mm:ss}
%l 输出日志事件发生位置,包括类目名、发生线程,在代码中的行数
%n 换行符
%m 输出代码指定信息,如info(“message”),输出message
%p 输出优先级,即 FATAL ,ERROR 等
%r 输出从启动到显示该log信息所耗费的毫秒数
%t 输出产生该日志事件的线程名