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天以前的过期日志。
log4j.xml的实用例子的更多相关文章
- log4j2.xml实用例子
一个多月前,我写了篇关于log4j.xml配置的文章,点击此处查看:http://www.cnblogs.com/guogangj/p/3931397.html 最近,我把自己的log4j升级到2.0 ...
- log4j.xml 为什么要使用SLF4J而不是Log4J
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SY ...
- log4j.properties和log4j.xml配置
>>>>1. 概述<<<< 1.1. 背景 在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统 ...
- log4j日志文件 log4j.xml log4j.properties配置
1,导入log4j jar包; 2,配置log4j.xml或log4j.properties文件; ------------------------------------------------- ...
- 转载:log4j.properties log4j.xml 路径问题
自动加载配置文件: (1)如果采用log4j输出日志,要对log4j加载配置文件的过程有所了解.log4j启动时,默认会寻找source folder下的log4j.xml配置文件,若没有,会寻找lo ...
- Log4j XML 配置
Xml代码 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configurat ...
- log4j.xml配置文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration S ...
- Log4j XML配置
问题描述: Log4j XML配置 问题解决: (1)编写log4j.xml配置文件 注: 如上的XML文件必须以log4j.xml文件命名,否则无法读取配置文件,同样的如果 ...
- log4j.xml配置示例
这是log4j1.x版本讲解,log4j-1.2.16.jar 1. 一般的log4j.xml的两种配置方式: 1.Logger 完成日志信息的处理定义输出的层次和决定信息是否输出DEBUG&l ...
随机推荐
- LinkedHashMap源码阅读笔记(基于jdk1.8)
LinkedHashMap是HashMap的子类,很多地方都是直接引用HashMap中的方法,所以需要注意的地方并不多.关键的点就是几个重写的方法: 1.Entry是继承与Node类,也就是Linke ...
- Linux中安装NodeJs 、cnpm 、npm
一.安装NodeJs 切换到 cd /usr/local/src/ 下载nodejs wget https://nodejs.org/dist/v6.9.3/node-v6.9.3-linux-x64 ...
- 自定义RatingBar的一个问题(只显示显示一个星星)
问题一: 在自定义RatingBar时在设置了numStars属性后只显示一张图(一个星星) 解答: 注意准备的替换图片千万不要使用.9PNG格式的图片,要不之后显示一张图(一个星星)! 问题二: 设 ...
- OpenCV2.4.13+VS2013开发环境配置
List1:完成 写在前面:之前电脑很杂乱的装了OpenCV的2个版本,在配置OpenCV和VS2013环境时死活配不好.但是接下来的工作要用到,没有办法,还是得好好做.今天重新装了OpenCV2.4 ...
- Shell_2 语句
1 if else fi if 语句通过关系运算符判断表达式的真假来决定执行哪个分支.Shell 有三种 if ... else 语句: if ... fi 语句: if ... else ... f ...
- 转:Delphi的类与继承(VB与delphi比较)
既然已经做出了com程序用delphi来开发的决定,那当然就要对delphi进行一些深入的了解.有人说delphi是一个用控件堆砌起来的工具,和vb没什么两样:也有人说dephi实际上是面向过程的,他 ...
- iOS CoreData primitive accessor
Given an entity with an attribute firstName, Core Data automatically generates firstName, setFirstNa ...
- BZOJ的两道osu概率DP easy与osu
坑 http://blog.csdn.net/CreationAugust/article/details/49516415 http://blog.csdn.net/braketbn/article ...
- javascript获取childNodes详情,删除空节点
chidNodes返回的是node的集合, 每个node都包含有nodeType属性. nodeType取值: 元素节点:1 属性节点:2 文本节点:3 注释节点:8 页面上是由无数个节点组成 ...
- 大BOSS随时都会到来
郑昀(微博:http://weibo.com/yunzheng) 去年在上市前后,我不止一次跟大家说过如下内容: 我们这帮兄弟第一精通业务,第二有丰富的战斗经验和规范,你们都是中流砥柱,都要带兵打仗. ...