Log4j学习

一. log4j 简介

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

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

1. Loggers

Loggers组件在此系统中被分为5个级别: DEBUG, INFO, WARN, ERROR 和 FATAL.
这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不会在 父Loggerappender 里输出, 默认为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 日志级别 %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这样的多客户多线程的应用中。
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归档文件名
原文地址:https://www.cnblogs.com/bobo132/p/14235605.html