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天以前的过期日志。

from: http://www.cnblogs.com/guogangj/p/3931397.html

时间: 2024-12-05 01:48:40

log4j.xml的实用例子的相关文章

log4j2.xml实用例子

一个多月前,我写了篇关于log4j.xml配置的文章,点击此处查看:http://www.cnblogs.com/guogangj/p/3931397.html 最近,我把自己的log4j升级到2.0之后发现之前的配置文件不能用了,于是把旧的配置挪到新的来,挪的过程中遇到了些问题,但一番搜索测试后基本上趋于完美了.老样子,先上代码: <?xml version="1.0" encoding="UTF-8"?> <!--设置log4j2的自身log级

.Net常用技巧_读取XML某节点例子

注:此例子只是自己在代码中为了读某固定的几个值,写的有点死,所以另作他用的时候请自行修改或扩充 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Xml; namespace MyTool {

C#操作XML的完整例子——XmlDocument篇

这是一个用c#控制台程序下,  用XmlDocument 进行XML操作的的例子,包含了查询.增加.修改.删除.保存的基本操作.较完整的描述了一个XML的整个操作流程.适合刚入门.net XML操作的朋友参考和学习. 假设有XML文件:books.xml Xml代码   <?xml version="1.0" encoding="UTF-8"?> <books> <book> <name>哈里波特</name&g

log4j.xml配置文件

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <!-- 根节点的配置顺序: renderer appender pl

log4j日志文件 log4j.xml log4j.properties配置

1,导入log4j  jar包; 2,配置log4j.xml或log4j.properties文件; ----------------------------------------------------------------------------------------------------------- <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuratio

解决log4j.xml问题http//jakarta.apache.org/log4j/ uri is not registered

在Eclipse中,配置log4j.xml出现"http //jakarta.apache.org/log4j/ uri is not registered"的错误信息. 原始的log4j.xml配置文件: <?xml version="1.0" encoding="GB2312" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4

log4j(七)——log4j.xml简单配置样例说明

一:测试环境与log4j(一)--为什么要使用log4j?一样,这里不再重述 二:老规矩,先来个栗子,然后再聊聊感受 (1)这里栗子有一点特别呀!给出了包名唉!想必有用,是的,配置文件中要特别说明一下的 package test.log4j.test8; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import org.apache.log4j.xml.DOMConfigurator; /** * Cre

log4j.xml 异常: &quot;log4j:configuration&quot; must match &quot;(renderer*,appender*,(category|logger)*......问题分析及解决

使用log4j.xml进行log4j的配置,在项目中报如下异常: log4j:ERROR The content of element type "log4j:configuration" must match "(renderer*,appender*,(category|logger)*,root?,categoryFactory?)". 异常分析: log4j.xml中相关元素的位置不正确 配置文件定位及解决: 经对比,发现项目log4j.xml中"

怎样在log4j.xml配置文件中引入变量:小公司经验较多的我和阿里UC等大公司经验较多的Boss,一些技术交流和探讨

从最初学习使用log4j的时候,网上和书本上主要都是使用"log4j.properties"这种属性格式,配置日志.多年以来,一直使用这种格式,总的来说,简单.够用.    而有十多年经验的Boss,不建议使用properties格式配置,而是用xml格式配置.Boss之前在阿里(支付宝.淘宝).UC等大公司工作过. 我们有个很明显的不同:  我比较注重,简单.快速.Boss比较注重,规范.严谨. 我的观点:没有对与错,只有适用与不适用.每个人都是根据自己的经历和追求,做出的技术选择.