Log4j:有趣的问题和需求解决方案

时间:2011-12-27 06:01:16

标签: log4j logging

我的应用程序以两种方式使用日志记录.... 1)programatic 2)log4j.xml 我必须创建两个日志文件(1个使用programatic和其他使用log4j.xml)。

程序化方式(还有一个属性文件,其中所有的东西都被提及,如日志级别和所有....让我们说...这个...文件正在创建..name as“SAS_VP.log”):

 Enumeration loggers = Logger.getRootLogger().getLoggerRepository().getCurrentLoggers(); 
  ......
  Logger temp = (Logger)iter.next();                                                
  temp.setLevel(level);

的log4j.xml

  <appender name="FILE" class="org.apache.log4j.RollingFileAppender">
  <param name="File" value="/LOGS/SAM/SAM_VJ.log"/> 
  <param name="Threshold" value="DEBUG"/>
  <param name="MaxFileSize" value="10000KB"/>
  <param name="MaxBackupIndex" value="10"/>
  <param name="Append" value="false"/>

 <layout class="org.apache.log4j.PatternLayout">

  <param name="ConversionPattern" value="%d{dd MMM yyyy HH:mm:ss,SSS} [%t] %5p [%F(% M):%L] %m%n"/>

 </layout>   

 </appender>


 <root>
 <appender-ref ref="CONSOLE"/>
 <appender-ref ref="FILE"/>
 </root> 

问题:

我以编程方式设置的日志级别覆盖 log4j.xml的日志级别。在log4j.xml中设置了“调试”级别并以编程方式设置了级别为“ ERROR ”,然后由 log4j.xml 创建的文件(SAM_VJ.log)仅包含ERROR级别日志。

如何解决这个问题...我想要...我的日志记录(programmatic和log4j)应该是独立的。

log4j中有什么内容...如果我已经设置了包“com.sas”的日志级别是“Debug”那么没有人可以修改它......类似于mutable类型

 <logger name="com.sam">    
<priority value="DEBUG"/>
 </logger>

寻找你的建议......

2 个答案:

答案 0 :(得分:0)

我不确定你是否真的应该要求这样的功能。 您正在谈论配置log4j框架的方法,是的,它支持3种不同的配置方式:

  1. 属性文件
  2. xml配置
  3. 以编程方式,通过您的Java代码
  4. 对我来说,编程配置允许更改log4j记录器/追加器的配置状态。

    应在系统启动期间加载您的xml配置,然后应用覆盖配置的Java代码。

    如果您有使用Java提供配置的逻辑,那么为什么不改进逻辑并定义错误级别(仅从您的示例中),只有您真的希望这样做。

    无法配置相同的记录器以使用DEBUG级别(及以上) AND ERROR级别(及以上)。

    这实际上是一个功能,而不是缺点,因为它允许在正在运行的系统上更改LOG4j的行为(无需重启),这对问题跟踪很有用。

    当然你可以WRAP你的记录器,这样他们就不会允许setLevel,但是,我真的不明白为什么你会这样做。

    希望,这有帮助

答案 1 :(得分:0)

为什么不使用具有不同日志级别的两个appender呢?你可以添加levelMax和levelMin参数来告诉log4j appender只记录那些级别。

<param name="LevelMax" value="warn" />
<param name="LevelMin" value="info" />
相关问题