当前位置: 首页 > 工具软件 > Log4Domino > 使用案例 >

Log4j学习笔记

锺高翰
2023-12-01

一. Log4j 简介

Log4j主要有三个重要的组件:

  • Loggers (记录器): 日志类别和级别
  • Appenders (输出源): 日志要输出的地方
  • Layout (布局): 日志以何种形式输出

1. Loggers

Loggers组件在此系统中被分为5个级别: DEBUG, INFO, WARN, ERRORFATAL.
这5个级别是有顺序的, DEBUG < INFO < WARN < ERROR < FATAL, 分别用来指定这条日志的重要程度.

Log4j有一个规则: 只输出级别不低于设定级别的日志等级, 假设Loggers级别设定为INFO, 则INFO, WARN, ERROR, FATAL级别的日志都会输出, 而级别比INFO低的 DEBUG则不会输出.

2. Appenders

log4j日志系统提供了许多强大的功能, 比如允许把日志输出到不同的地方, 如控制台(Console), 文件(Files)等, 可以根据天数或者文件大小产生新的文件, 可以以流的形式发送到其他地方.

常用的类如下:

类型用途
org.apache.log4j.ConsoleAppender将日志输出到控制台
org.apache.log4j.FileAppender将日志写入到文件
org.apache.log4j.DailyRollingFileAppender每天产生一个日志文件
org.apache.log4j.RollingFileAppender文件达到指定容量的是会有, 产生一个新的文件
org.apache.log4j.WriterAppender将日志信息以流格式发送到任意指定的地方

3. Layouts

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.propertieslog4j.xml

1. 配置根 Logger

log4j.rootLogger = [level], appenderName1, appenderName2 ...
log4j.additivity.org.apache = false          # 表示Logger不会在 父Logger的 appender`里输出, 默认为true

示例:  log4j.rootLogger=info,goldInterface,file
appendName: 就是制定日志信息要输出到哪里. 可以同时指定多个输出目的地, 用逗号隔开.

2. 配置日志输出的目的地 Appender

log4j.appender.appenderName = className
可指定如下几种类型: ConsoleAppender, FileAppender, DailyRollingFileAppender, RollingFileAppender, WriterAppender
前4种都比较常用, 最后一种没用过

示例: log4j.appender.file``=``org.apache.log4j.RollingFileAppender
file是 appenderName

2.1 ConsoleAppender选项

Threshold=WARN 指定日志信息的最低输出级别, 默认为 DEBUG
ImmediateFlush=true 表示所有的消息都会被立即输出, 设置为false则不输出, 默认值是 true
Target=System.err 默认值是 System.out

2.2 FileAppender选项

Threshold=WARN
ImmediateFlush=true

Append=false true表示将日志追加到指定文件中, false则将消息覆盖指定的文件内容, 默认值是 true
File=/data/logs/catalina.out 指定消息输出到 catalina.out 文件中

2.3 DailyRollingFileAppender选项

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     每分钟

2.4 RollingFileAppender选项

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

3. 配置日志信息的输出格式

log4j.appenderappenderName.layout = classsName
可指定以下几种类型: HTMLLayout, PatternLayout(最常用), SimpleLayout, TTCCLayout

3.1 HTMLLayout选项

LocationInfo=true 输出java文件名称和行号, 默认是 false
Title=My Logging 默认值是 Log4j Log Messages

3.2 PatternLayout选项

ConversionPattern=%m%n 设定以怎样的格式显示消息
常用的格式化符号说明如下

参数说明常用示例
%d日期%d{yyyy-MM-dd HH:mm:ss:SSS}2021-01-04 18:07:25:899
%p日志级别%pDEBUG,INFO,WARN,ERROR,FATAL
%c类的全限定名%cdomino.action.interceptor.HexResultInterceptor
%F文件名%FHexResultInterceptor.java
%L行号%L179
%m代码中输出的日志内容%mlog.info(xxxx);
%n换行%n加在末尾
%t输出线程名
%x输出和当前线程相关联的NDC(嵌套诊断环境) 尤其用到像java servlets这样的多客户多线程的应用中。
format相关

这里以 %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

三. 一个不错的参考配置

3.1 log4j.properties


#############
# 输出到控制台
#############

# 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


3.2 log4j.xml

<?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>

四. 补充

4.1 tomcat容器中特殊变量说明

${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实例时, 这两个属性指向的位置是相同的.


五. 参考

  1. Log4j.properties配置详解
  2. Log4j相关配置以及在Tomcat中的使用
  3. log4j日志输出格式一览
  4. log4j使用心得之四 – 自定义DailyRollingFileAppender归档文件名
 类似资料: