首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

怎么更好的掌控日志输出-Log4j <logger>配置项介绍

2012-11-18 
如何更好的掌控日志输出-Log4j logger配置项介绍经常看见开发Web应用的时候,有人被控制台输出的大量日志

如何更好的掌控日志输出-Log4j <logger>配置项介绍
经常看见开发Web应用的时候,有人被控制台输出的大量日志弄得眼花缭乱,启动一个应用,控制台打出
N多没用的日志。那么,如何控制最大限度log4j的配置文件输出需要的调试信息呢?

Log4j的Logger组件配置可以帮助我们屏蔽不必要的日志输出,尤其在项目应用了大量第三方组件的时候,
通过控制Logger组件可以控制输出某一个组件的日志级别,帮助我们更好的进行调试。

注意:控制的粒度到类一级。也就是说,可以控制某一个类的日志如何输出。
限制:虽然不可以控制到方法一级,但是基本上也够用了。

假设我们现在的类命名空间在 com.foo 下面
我们有2个包
package com.foo.cartoon
package com.foo.common

这2个包下面分别有自己的类文件
在package com.foo.cartoon包下有
com.foo.cartoon.Cat;

在package com.foo.common包下有
com.foo.common.Omia;

使用如下的配置文件:

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"><log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">        <layout class="org.apache.log4j.PatternLayout">            <param name="ConversionPattern"                value="%p [%t] %c{1}.%M(%L) | %m%n"/>        </layout>    </appender>    <logger name="com.foo">        <level value="INFO"/>    </logger>    <logger name="com.foo.common">        <level value="DEBUG"/>    </logger>               <root>        <level value="WARN"/>        <appender-ref ref="CONSOLE"/>    </root></log4j:configuration>


那么 针对所有日志(<root>项配置) 都使用WARN级别输出
com.foo 路径下的Class 都使用INFO 级别输出
com.foo.common 路径下的Class 都使用DEBUG 级别输出

---------------

假如想要控制com.foo.common.Omia这一个类的日志输出级别
只需要使用如下配置
<logger name="com.foo.common.Omia">
<level value="DEBUG"/>
</logger>

---------------

如果项目中使用了第三方组件,那么可以用这样的方式控制日志

<logger name="org.apache.struts2">
<level value="DEBUG"/>
</logger>

<logger name="org.springframework">
<level value="INFO"/>
</logger>

这样就可以让struts2的日志按Debug级别输出,让Spring的日志按Info级别输出
1 楼 e3002 2008-01-03   就是自定义logger 2 楼 qichunren 2008-02-19   我下载了你的源码,没有看到com.frame.model.BaseObject这个类啊,你的com.foo.cartoon.Cat和com.foo.common.Omia都是继承这个BaseObject的啊,
这个BaseObject中是不是有如下的代码啊?
public static Log log = LogFactory.getLog(BaseObject.class); 3 楼 tobato 2008-02-21   qichunren 写道我下载了你的源码,没有看到com.frame.model.BaseObject这个类啊,你的com.foo.cartoon.Cat和com.foo.common.Omia都是继承这个BaseObject的啊,
这个BaseObject中是不是有如下的代码啊?
public static Log log = LogFactory.getLog(BaseObject.class);
是的,代码已经更新.
4 楼 bobo 2008-02-22   tobato 写道qichunren 写道我下载了你的源码,没有看到com.frame.model.BaseObject这个类啊,你的com.foo.cartoon.Cat和com.foo.common.Omia都是继承这个BaseObject的啊,
这个BaseObject中是不是有如下的代码啊?
public static Log log = LogFactory.getLog(BaseObject.class);
是的,代码已经更新.

可能是
protected final Log log = LogFactory.getLog(getClass());
而不是
public static Log log = LogFactory.getLog(BaseObject.class);

5 楼 stonecai 2008-09-26   好似还是很不方便,比如:
<logger name="org.springframework">
<level value="ERROR"/>
</logger>
这样org.springframework下面的类是可以控制到,但
org.springframework.jdbc
org.springframework.aop
org.springframework.core
等等包下面的类控制不到
如果我现在不想输入spring框架下的,总不能每个包都配置上吧?请问还有比较好的方法吗?还是我理解错了 6 楼 tobato 2008-10-05   stonecai 写道
好似还是很不方便,比如: &lt;logger name="org.springframework"&gt; &lt;level value="ERROR"/&gt; &lt;/logger&gt; 这样org.springframework下面的类是可以控制到,但 org.springframework.jdbc org.springframework.aop org.springframework.core 等等包下面的类控制不到 如果我现在不想输入spring框架下的,总不能每个包都配置上吧?请问还有比较好的方法吗?还是我理解错了

可以控制到的 7 楼 gsjch 2008-11-17   少了过滤功能,可以把WARN,DEBUG等信息输出到不同的文件。但一直有个难点是:如何把各种类型的信息输出到不同的文件。比如a.log中记录的是一种类型(比如全部的sql语句)的日志(包括所有级别的日志)

热点排行