zoukankan      html  css  js  c++  java
  • log4j.xml的实用例子

    大多数讲log4j配置的教程用的都是log4j.properties文件,我觉得xml或许更好一点,在这里我提供一个我已经用于生产环境的log4j.xml的例子,先上代码,然后再解释:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd">
    <log4j:configuration>
        <!--输出到控制台-->
        <appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender">
            <param name="Threshold" value="DEBUG"/>
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
            </layout>
        </appender>
    
        <!--输出到文件(info)-->
        <!--将生成“info.log.2014-06-11”这样的日志文件-->
        <appender name="fileAppenderInfo" class="org.apache.log4j.DailyRollingFileAppender">
            <param name="File" value="${user.home}/logs/website/info.log" />
            <param name="DatePattern" value=".yyyy-MM-dd" />
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
            </layout>
            <filter class="org.apache.log4j.varia.LevelRangeFilter">
                <param name="LevelMin" value="INFO" />
                <param name="LevelMax" value="INFO" />
            </filter>
        </appender>
    
        <!--输出到文件(warn)-->
        <appender name="fileAppenderWarn" class="org.apache.log4j.DailyRollingFileAppender">
            <param name="File" value="${user.home}/logs/website/warn.log" />
            <param name="DatePattern" value=".yyyy-MM-dd" />
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
            </layout>
    
            <filter class="org.apache.log4j.varia.LevelRangeFilter">
                <param name="LevelMin" value="WARN" />
                <param name="LevelMax" value="WARN" />
            </filter>
        </appender>
    
        <!--输出到文件(error)-->
        <appender name="fileAppenderError" class="org.apache.log4j.DailyRollingFileAppender">
            <param name="File" value="${user.home}/logs/website/error.log" />
            <param name="DatePattern" value=".yyyy-MM-dd" />
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
            </layout>
            <filter class="org.apache.log4j.varia.LevelRangeFilter">
                <param name="LevelMin" value="ERROR" />
                <param name="LevelMax" value="ERROR" />
            </filter>
        </appender>
    
        <!--屏蔽所有org.springframework.*输出的Debug(及以下)信息-->
        <logger name="org.springframework">
            <level value="INFO"></level>
        </logger>
    
        <root>
            <level value="ALL"/>
            <appender-ref ref="consoleAppender" />
            <appender-ref ref="fileAppenderInfo" />
            <appender-ref ref="fileAppenderWarn" />
            <appender-ref ref="fileAppenderError" />
        </root>
    </log4j:configuration>

    log4j简单地说,由3个东西组成:

    • 一个叫“logger”,是我们的程序直接使用的东西,log4j高明之处就在于它的logger可以有继承关系,下面我会稍微用到一点这个功能;
    • 一个叫“appender”,负责管日志到底输出到哪里去,目前对我们而言输出日志最多的两个地方,一是控制台,另一当然是文件;
    • 一个叫“layout”,也就是日志输出的格式定义。

    你可以定义一个layout,给一些appender使用,再定义几个logger,使用不同的appender,总之很灵活,而我用的功能则很简单:

    • 对于info、warning和error这几种错误,都需要输出到文件去,而且是不同的文件
    • 自动按天新建文件,避免单个日志文件过大
    • debug信息不需要输出到文件,只需要在控制台中显示
    • spring框架输出的debug信息太多,要屏蔽

    我针对info,warning,error定义了3个appender,这3个appender的类型都是“DailyRollingFileAppender”,是log4j直接提供的,能够按天新建日志文件,这些日志文件的存放位置在用户的home目录的log/website子目录下,为什么不存在程序当前的目录?因为程序我经常要更新,一不小心就把log目录删掉了,当然你也可以存到别的地方去,比如上级目录,前提是要有写入权限。另外还有一个appender是用于输出到控制台的,类型是“ConsoleAppender”,此类型也是log4j提供的。一共4个appender。

    我的layout使用了“PatternLayout”,也是log4j提供的,这种layout可以自己定义一个输出模板,我的输出模板是“[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n”,会生成这样的输出格式:

    [15:22:15:131] [DEBUG] - com.ignet.website.ui.controller.HomeController.exceptionTest(HomeController.java:19) - test output format
    [15:22:15:140] [ERROR] - com.ignet.website.ui.resolver.SimpleLoggingExceptionResolver.resolveException(SimpleLoggingExceptionResolver.java:26) - 未考虑到的异常发生,请注意排查

    对一般的项目来说,足够了。需要更丰富的信息的话就自己写在日志内容里吧。

    而对于logger,我只定义了两个,一个是root,这个是所有logger的“祖先”,这个logger包含了前面定义的4个appender,这意味则什么呢?意味着所有的日志,都会尝试调用这4个appender去记录。那问题来了,假如我一个要log一个warning信息,那么岂不是3个日志文件中都有这个信息?——放心,仔细看,我在appender中设置了过滤,看一看你就明白了。

    一切安好,除了运行时候发觉spring框架输出的废话实在太多,那些debug信息对我们来说没什么用,我们又不打算修改spring的代码,于是我定义了另一个logger,名字叫“org.springframework”,所有“org.springframework”命名空间下的类,都会使用这个logger,我给这个logger设置了一个level,为info,debug比info低,所以从此以后spring的那些debug信息就不来烦我了。“org.springframework”这个logger是root logger的孩子,所以理所当然地“继承了”4个appender,不需要再写了吧?

    这里稍微提一下,为啥spring框架这么聪明,会自动使用我们另外加上去的log4j?其实spring是用了一个叫“commons-logging”的库,这玩意儿能自动检测各大logging framework并使用,很牛逼就是。

    最后生成的日志文件大致是这样的,大家感受下:

    error.log        error.log.2014-08-13    info.log.2014-07-23    info.log.2014-08-04    info.log.2014-08-14
    error.log.2014-07-11    info.log        info.log.2014-07-24    info.log.2014-08-05    info.log.2014-08-15
    error.log.2014-07-18    info.log.2014-07-11    info.log.2014-07-25    info.log.2014-08-06    info.log.2014-08-19
    error.log.2014-07-22    info.log.2014-07-17    info.log.2014-07-28    info.log.2014-08-07    info.log.2014-08-20
    error.log.2014-08-04    info.log.2014-07-18    info.log.2014-07-29    info.log.2014-08-08    info.log.2014-08-21
    error.log.2014-08-05    info.log.2014-07-19    info.log.2014-07-30    info.log.2014-08-09    info.log.2014-08-22
    error.log.2014-08-07    info.log.2014-07-21    info.log.2014-07-31    info.log.2014-08-11    warn.log
    error.log.2014-08-11    info.log.2014-07-22    info.log.2014-08-01    info.log.2014-08-13    warn.log.2014-07-11

    日积月累,日志文件越来越多,咋办?教大家个秘籍,在这个日志目录的上两层目录写个脚本:

    find ./logs/website -ctime +10 -exec rm {} ;

    执行这个脚本,就能删除掉10天以前的过期日志。

  • 相关阅读:
    Chrome开发者工具中Elements(元素)断点的用途
    最简单的SAP云平台开发教程
    Java实现 LeetCode 495 提莫攻击
    Java实现 LeetCode 494 目标和
    Java实现 LeetCode 494 目标和
    Java实现 LeetCode 494 目标和
    Java实现 LeetCode 493 翻转对
    Java实现 LeetCode 493 翻转对
    Java实现 LeetCode 493 翻转对
    Java实现 LeetCode 492 构造矩形
  • 原文地址:https://www.cnblogs.com/guogangj/p/3931397.html
Copyright © 2011-2022 走看看