有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java很好的方式日志4j根据模块写入不同的文件

嗨,我的应用程序中有很多模块,每个模块都有不同的软件包。我的应用程序假设为每个模块创建不同的文件。我是通过以下方式做到这一点的

<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. 我如何处理公共框架类呢?现在我把它当作模块来处理

谢谢你的帮助


共 (2) 个答案

  1. # 1 楼答案

    您应该切换到LogCub,并考虑使用sifpIdAppNoter。这一个按你想要的方式分割你的日志文件

  2. # 2 楼答案

    我不确定是否有任何方法在基本log4japi中使用属性文件,但您当然可以在一些初始化代码中以编程方式尝试这种方法。首先用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如何以您喜欢的方式获取值(通过反射、属性文件等)。我还没有尝试过这段代码,但我认为值得一试