• 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归档文件名
  • 相关阅读:
    CodeForces
    CodeForces
    Comet OJ
    CodeForces
    2019年第五届计蒜之道复赛总结
    2019计蒜之道初赛4 B. 腾讯益智小游戏—矩形面积交(简单)(矩形交集)
    2019计蒜之道初赛3 D. 阿里巴巴协助征战SARS(困难)(大数取余+欧拉降幂)
    2018计蒜之道复赛 贝壳找房函数最值(贪心+优先队列)
    牛客想开了大赛2 A-【六】平面(切平面)
    2018年第九届蓝桥杯国赛试题(JavaA组)
  • 原文地址:https://www.cnblogs.com/bobo132/p/14235605.html
Copyright © 2020-2023  润新知