Log 4j根据模块在不同文件中写入的好方法

时间:2011-07-27 18:15:50

标签: java log4j

嗨我的应用程序中有很多模块,每个模块都有不同的包。我的应用程序假设为每个模块创建不同的文件。我这样做的方法是

<appender name="module1" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="File" value="/var/log/camel/module1.log" />
    <param name="DatePattern" value="'.'yyyy-MM-dd" />
    <param name="Append" value="true" />
    <param name="Threshold" value="DEBUG" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d %p [%c] - %m%n" />
    </layout>
    <param name="additivity" value="false" />
</appender>
   <logger name="com.package.module1">
    <level value="DEBUG" />
    <appender-ref ref="module1" />
</logger>

它运作完美但需要进一步改进

  1. 任何模块的日志条目都会如此之多?我可以链接一些属性文件并在那里提供类/包映射。

  2. 我现在如何处理常见的框架类我将其视为模块?

  3. 感谢您的帮助

2 个答案:

答案 0 :(得分:2)

您应该切换到Logback并考虑使用SiftingAppender。这个以你想要的方式分割你的日志文件。

答案 1 :(得分:1)

我不确定在基本Log4j API中使用属性文件的任何方法,但您当然可以在某些初始化代码中以编程方式尝试。首先在XML中创建基本定义:

<appender name="baseModuleAppender" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="File" value="/var/log/camel/${module}.log" />
    <param name="DatePattern" value="'.'yyyy-MM-dd" />
    <param name="Append" value="true" />
    <param name="Threshold" value="DEBUG" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d %p [%c] - %m%n" />
    </layout>
</appender>
<logger name="com.package.module.base" additivity="false">
    <level value="DEBUG" />
    <appender-ref ref="baseModuleAppender" />
</logger>

然后在您的模块需要记录之前启动应用程序时调用的某些Java代码中执行此操作:

String[] modules = new String[] {"module1", "module2", "module3"};
Logger baseLogger = Logger.getLogger("com.package.module.base");
DailyRollingFileAppender baseAppender = (DailyRollingFileAppender) baseLogger.getAppender("baseModuleAppender");

for (String module : modules) {
    Logger logger = Logger.getLogger("com.package." + module);
    logger.setLevel(baseLogger.getLevel());
    logger.setAdditivity(baseLogger.getAdditivity());

    String filename = baseAppender.getFile().replaceAll("\\$\\{module}", module);
    DailyRollingFileAppender appender = new DailyRollingFileAppender(baseAppender.getLayout(), filename, baseAppender.getDatePattern());
    appender.setAppend(baseAppender.getAppend());
    appender.setThreshold(baseAppender.getThreshold());
    logger.addAppender(appender);
}

您可以决定modules如何获得您喜欢的值(通过反射,属性文件等)。我没有尝试过这段代码,但我认为值得一试。