【问题标题】:Log to different files based on logger name根据记录器名称记录到不同的文件
【发布时间】:2014-03-26 17:59:36
【问题描述】:

我有以下问题。我正在开发一个对所有记录器使用文件附加程序的应用程序(log4j 版本 1.2)。一切正常,但现在我需要根据一些运行时参数登录到不同的文件。

作为一个限制,我还需要限制 log4j.xml 配置信息的数量,因为我事先不知道该参数将采用多少值,因此我无法配置不同的附加程序 (FileAppenders)指向 log4j 配置文件中的不同文件。我还需要限制添加的新代码的数量,例如,可以将运行时参数作为记录器名称的一部分传递(LoggerFactory.getLogger(runtimeParameter + getClass) 等),但我不想创建通过代码创建一个新的 FileAppender,然后将该新的 Appender 添加到最近创建的记录器中(作为一个附带问题,这个替代方案会起作用吗?)。

我认为也许创建一个新的附加程序,根据他提供的名称(基于运行时参数)打开不同的文件会起作用,但我不知道该怎么做,我不知道它会怎么做同时执行时的行为(因为它将是所有记录器的单个附加程序)。

谢谢你,原谅我的英语!

【问题讨论】:

    标签: java logging log4j


    【解决方案1】:

    在您的情况下,听起来最简单的解决方法是实时以编程方式配置和创建记录器对象。

    是的,它有效。幸运的是,我刚刚解决了这个问题并提供了示例代码。不过,这是针对 log4j2 的。我相信在 1.2 中它更容易和直接

    /**
     * Dynamically creates an instance of a Logger.
     * 
     * @param appenderName
     *            most often will be the name of the class this logger will
     *            belong to.
     * @param logFileName
     *            the file name to save the logs to
     * @return
     */
    public static org.apache.logging.log4j.Logger createInstanceLogger(String appenderName,
            String logFileName) {
        //call getLogger() which will create and load a logger with a default configuration
        org.apache.logging.log4j.Logger logger = org.apache.logging.log4j.LogManager
                .getLogger(String.format("DynamicLogger%s",
                        String.valueOf(DynamicLogManager.loggerCount++)));
        org.apache.logging.log4j.core.Logger coreLogger = (org.apache.logging.log4j.core.Logger) logger; // cast logger to core logger to access protected methods
        org.apache.logging.log4j.core.LoggerContext context = coreLogger.getContext();
        org.apache.logging.log4j.core.config.BaseConfiguration configuration = (org.apache.logging.log4j.core.config.BaseConfiguration) context
                .getConfiguration();
    
        TriggeringPolicy compositePolicy = CompositeTriggeringPolicy.createPolicy(
                SizeBasedTriggeringPolicy.createPolicy("5mb"),
                TimeBasedTriggeringPolicy.createPolicy("1", "true"));
    
        String fileName = String.format("%1$s/%2$s", appenderName, logFileName);
        String filePattern = String.format("%1$s/%2$s.%%d{yyyy-MM-dd}",
                appenderName, logFileName);
    
        Layout<String> layout = PatternLayout.createLayout(DynamicLogManager._conversionPattern,
                configuration, RegexReplacement.createRegexReplacement("a^", "."), //empty regex replacement
                "utf-8", "false");
    
        Filter f = ThresholdFilter.createFilter("trace", "accept", "accept");
    
        Appender a = RollingFileAppender.createAppender(fileName, //fileName
                filePattern, //filePattern
                "true", //append
                appenderName, //appender name
                "true", //bufferred io
                "true", //immediate flush
                compositePolicy, //policy
                null, //strategy default
                layout, //layout
                f, //filter none
                "true", //ignore exceptions
                "false", //advertise
                "null", //advertise uri
                configuration //configuration
                );
    
        a.start();
    
        coreLogger.addAppender(a);
    
        //this is where we would figure out how to configure the logger to listen on a configuration file
        coreLogger.setLevel(Level.ALL); //set the log level of the logger that we are returning to Level.ALL
    
        return coreLogger; //cast logger back to Logger interface
    

    【讨论】:

      猜你喜欢
      • 2015-04-10
      • 1970-01-01
      • 2016-03-21
      • 1970-01-01
      • 2013-08-09
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多