Log4j主要有三个重要的组件:
Loggers组件在此系统中被分为5个级别: DEBUG
, INFO
, WARN
, ERROR
和 FATAL
.
这5个级别是有顺序的, DEBUG
< INFO
< WARN
< ERROR
< FATAL
, 分别用来指定这条日志的重要程度.
Log4j有一个规则: 只输出级别不低于设定级别的日志等级, 假设Loggers级别设定为INFO
, 则INFO
, WARN
, ERROR
, FATAL
级别的日志都会输出, 而级别比INFO
低的 DEBUG
则不会输出.
log4j日志系统提供了许多强大的功能, 比如允许把日志输出到不同的地方, 如控制台(Console), 文件(Files)等, 可以根据天数或者文件大小产生新的文件, 可以以流的形式发送到其他地方.
常用的类如下:
类型 | 用途 |
---|---|
org.apache.log4j.ConsoleAppender | 将日志输出到控制台 |
org.apache.log4j.FileAppender | 将日志写入到文件 |
org.apache.log4j.DailyRollingFileAppender | 每天产生一个日志文件 |
org.apache.log4j.RollingFileAppender | 文件达到指定容量的是会有, 产生一个新的文件 |
org.apache.log4j.WriterAppender | 将日志信息以流格式发送到任意指定的地方 |
log4j可以再 Appenders的后面附加 Layouts来完成这个功能
Layouts提供4种日志输出样式, 如根据 html样式, 自由指定样式, 包含日志级别与信息的样式和包含日志时间, 线程, 类型的信息的样式.
常用的类如下
类型 | 用途 |
---|---|
org.apache.log4j.HTMLLayout | 以 html表格形式布局 |
org.apache.log4j.PatternLayout | 可以灵活地指定布局模式 |
org.apache.log4j.SimpleLayout | 包含日志信息的级别和信息字符串 |
org.apache.log4j.TTCCLayout | 包含日志产生的时间, 线程, 类别等信息 |
在实际应用中, 要使 log4j在系统中运行, 需要实现设定好配置文件. 配置文件事实上也就是对 Logger, Appender 及 Layout进行相应的设置.
log4j支持两种配置文件格式: log4j.properties
和 log4j.xml
log4j.rootLogger = [level], appenderName1, appenderName2 ...
log4j.additivity.org.apache = false # 表示Logger不会在 父Logger的 appender`里输出, 默认为true
示例: log4j.rootLogger=info,goldInterface,file
appendName: 就是制定日志信息要输出到哪里. 可以同时指定多个输出目的地, 用逗号隔开.
log4j.appender.appenderName = className
可指定如下几种类型: ConsoleAppender
, FileAppender
, DailyRollingFileAppender
, RollingFileAppender
, WriterAppender
前4种都比较常用, 最后一种没用过
示例: log4j.appender.file``=``org.apache.log4j.RollingFileAppender
file是 appenderName
Threshold=WARN
指定日志信息的最低输出级别, 默认为 DEBUG
ImmediateFlush=true
表示所有的消息都会被立即输出, 设置为false则不输出, 默认值是 true
Target=System.err
默认值是 System.out
Threshold=WARN
ImmediateFlush=true
Append=false
true表示将日志追加到指定文件中, false则将消息覆盖指定的文件内容, 默认值是 true
File=/data/logs/catalina.out
指定消息输出到 catalina.out 文件中
Threshold=WARN
ImmediateFlush=true
Append=false
File=/data/logs/catalina.out
DatePattern='.'yyyy-MM
每月滚动一次日志文件, 即每月产生一个新的日志文件. 当前月的日志文件名为 catalina.out
, 前一个月的日志文件名为 catalina.out.2020-12
另外也可以指定按 周, 天, 时, 分等来滚动日志文件, 对应的格式如下:
'.'yyyy-MM 每月
'.'yyyy-ww 每周
'.'yyyy-MM-dd 每天
'.'yyyy-MM-dd-a 每天两次 (am, pm)
'.'yyyy-MM-dd-HH 每小时
'.'yyyy-MM-dd-HH-mm 每分钟
Threshold=WARN
ImmediateFlush=true
Append=false
File=/data/logs/catalina.out
MaxFileSize=5120KB
后缀可以是KB,MB,GB, 在日志文件达到该大小时, 将会自动滚动, 将原来的内容移到 catalina.out.1
文件中
MaxBackupIndex=10
指定可以产生的滚动文件的最大数, 例如, 设为2则可以产生 catalina.out.1
, catalina.out.2
两个滚动文件
和一个 catalina.out文件
layout=org.apache.log4j.PatternLayout
layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss:SSS} %-5p %c (%F %L) %x %m%n
log4j.appenderappenderName.layout = classsName
可指定以下几种类型: HTMLLayout
, PatternLayout(最常用)
, SimpleLayout
, TTCCLayout
LocationInfo=true
输出java文件名称和行号, 默认是 false
Title=My Logging
默认值是 Log4j Log Messages
ConversionPattern=%m%n
设定以怎样的格式显示消息
常用的格式化符号说明如下
参数 | 说明 | 常用示例 | |
---|---|---|---|
%d | 日期 | %d{yyyy-MM-dd HH:mm:ss:SSS} | 2021-01-04 18:07:25:899 |
%p | 日志级别 | %p | DEBUG,INFO,WARN,ERROR,FATAL |
%c | 类的全限定名 | %c | domino.action.interceptor.HexResultInterceptor |
%F | 文件名 | %F | HexResultInterceptor.java |
%L | 行号 | %L | 179 |
%m | 代码中输出的日志内容 | %m | log.info(xxxx); |
%n | 换行 | %n | 加在末尾 |
%t | 输出线程名 | ||
%x | 输出和当前线程相关联的NDC(嵌套诊断环境) 尤其用到像java servlets这样的多客户多线程的应用中。 |
这里以 %m 演示
%20m | 指定日志的最小宽度是20, 如果小于20的话, 左边补空格 |
---|---|
%-20m | 同上, 右边补空格 |
%.30m | 最大宽度是30, 如果大于30的话, 就会将右面多出的字符截掉, 但小于30的话也不会有空格 |
%20.30m | 小于20补空格, 多余30截取掉 |
配置
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss:SSS} %-5p %c (%F %L) %x %m%n
真实日志
2021-01-04 18:25:02:490 INFO domino.action.core.DataAction (HandleMsgAction.java 66) [HandleMsgAction] msgType: 0x7, costTimes: 2061ms
#############
# 输出到控制台
#############
# log4j.rootLogger日志输出类别和级别:只输出不低于该级别的日志信息DEBUG < INFO < WARN < ERROR < FATAL
# WARN:日志级别 CONSOLE:输出位置自己定义的一个名字 logfile:输出位置自己定义的一个名字
log4j.rootLogger=WARN,CONSOLE,logfile
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,SSS} - %-4r %-5p [%t] %C:%L %x - %m%n
################
# 输出到日志文件中
################
log4j.appender.logfile=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.Encoding=UTF-8
log4j.appender.logfile.File=${catalina.base}/logs/catalina.out
log4j.appender.logfile.MaxFileSize=10MB
log4j.appender.logfile.MaxBackupIndex=3
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %F %p %m%n
##########################
# 对不同的类输出不同的日志文件
##########################
# club.bagedate包下的日志单独输出
log4j.logger.club.bagedate=DEBUG,bagedate
# 设置为false该日志信息就不会加入到rootLogger中了
log4j.additivity.club.bagedate=false
# 下面就和上面配置一样了
log4j.appender.bagedate=org.apache.log4j.RollingFileAppender
log4j.appender.bagedate.Encoding=UTF-8
log4j.appender.bagedate.File=logs/bagedate.log
log4j.appender.bagedate.MaxFileSize=10MB
log4j.appender.bagedate.MaxBackupIndex=3
log4j.appender.bagedate.layout=org.apache.log4j.PatternLayout
log4j.appender.bagedate.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %F %p %m%n
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- 根logger的设置,若代码中未找到指定的logger,则会根据继承机制,使用根logger-->
<root>
<level value="WARN"/>
<appender-ref ref="console"/>
<appender-ref ref="fileAppender"/>
<appender-ref ref="rollingAppender"/>
<appender-ref ref="dailyRollingAppender"/>
</root>
<!--
1. 指定logger的设置,additivity是否遵循缺省的继承机制
2. 当additivity="false"时,root中的配置就失灵了,不遵循缺省的继承机制
3. 代码中使用Logger.getLogger("logTest")获得此输出器,且不会使用根输出器
-->
<logger name="logTest" additivity="false">
<level value ="INFO"/>
<appender-ref ref="dailyRollingAppender"/>
</logger>
<!-- 日志输出到控制台 -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss,SSS} - %-4r %-5p [%t] %C:%L %x - %m%n"/>
</layout>
</appender>
<!-- 输出日志到文件 -->
<appender name="fileAppender" class="org.apache.log4j.FileAppender">
<param name="Threshold" value="INFO"/>
<param name="Append" value="false"/>
<param name="BufferedIO" value="false"/>
<param name="BufferSize" value="512"/>
<param name="File" value="${catalina.base}/logs/fileAppender.log"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss,SSS} - %-4r %-5p [%t] %C:%L %x - %m%n"/>
</layout>
</appender>
<!-- 输出日志到文件,当文件大小达到一定阈值时,自动备份 -->
<appender name="rollingAppender" class="org.apache.log4j.RollingFileAppender">
<param name="Encoding" value="UTF-8"/>
<param name="Append" value="true" />
<param name="MaxFileSize" value="10MB" />
<param name="MaxBackupIndex" value="10" />
<param name="File" value="${catalina.base}/logs/catalina.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss,SSS} - %-4r %-5p [%t] %C:%L %x - %m%n" />
</layout>
</appender>
<!-- 日志输出到文件,可以配置多久产生一个新的日志信息文件 -->
<appender name="dailyRollingAppender" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="${webApp.root}/applogs/own/dailyRollingAppender.log"/>
<param name="Append" value="true" />
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss,SSS} - %-4r %-5p [%t] %C:%L %x - %m%n"/>
</layout>
</appender>
</log4j:configuration>
${WORKDIR}/logs/catalina.out
${``catalina.home}``/logs/catalina.out
WORKDIR 是个变量, 会被 System.Property中的 'WORKDIR’的值代替, 同理, 可以在程序启动时设置文件路径 System.setProperty ("WORKDIR", "/data/logs/catalina.out");
直接设置并引用其他系统变量也是可以的.
catalina.home
指向公共信息的位置, 就是 bin 和 lib 的父目录
catalina.base
指向每个 tomcat目录私有信息的位置, 就是 conf, logs, temp, webapps 和 work 的父目录
仅运行一个tomcat实例时, 这两个属性指向的位置是相同的.