当前位置: 首页 > 知识库问答 >
问题:

使用log4j创建多个日志实例以在不同的位置输出日志文件

经和歌
2023-03-14

大家好,我的社区,

我正在编写一个多线程应用程序,其中需要使用log4j为每个线程输出一个日志文件。理想情况下,我希望为每个线程运行一个单独的日志实例。我正在辩论我应该如何处理这个问题。因为每个日志实例的文件输出位置不同,所以我需要更新log4j。阿佩德。破碎文件。File=每个实例的属性。现在,我正在尝试创建一个新的记录器,将新属性设置到属性对象中,并使用PropertyConfigurator将新属性加载到新创建的记录器对象中。配置(log4jproperty) 在创建新的记录器实例时,新实例似乎无法识别新属性。是否需要为每个新的记录器实例创建新的FileAppender?

public class Broker implements Runnable{

    private Settings ss; //The Settings object associated with this broker.

    private String loggerName = null;
    private Logger log = null;
    private Properties log4jProperties = new Properties();
}

    //Constructor
    public Broker(Settings ss){

        this.ss = ss;
    }

    public void run() {

        loggerName = ss.getBrokerName() + "_Logger";
        log = Logger.getLogger(loggerName);

        log4jProperties.setProperty("log4j.loggerName", "DEBUG, FILE");
            log4jProperties.setProperty("log4j.appender.FILE","org.apache.log4j.FileAppender");
            log4jProperties.setProperty("log4j.appender.FILE.File", "C:/Logz/"+loggerName+".out");
            log4jProperties.setProperty("log4j.appender.FILE.ImmediateFlush", "true");
            log4jProperties.setProperty("log4j.appender.FILE.Threshold", "DEBUG");
            log4jProperties.setProperty("log4j.appender.FILE.Append", "FALSE");
            log4jProperties.setProperty("log4j.appender.FILE.layout", "org.apache.log4j.PatternLayout");
            log4jProperties.setProperty("log4j.appender.FILE.layout.conversionPattern", "%m%n");

            PropertyConfigurator.configure(log4jProperties);

            log.debug("This is a debug message");


            // This will be set to true as long as the Broker is running
            while(isRunnable){

                //Listen for and process files      

            }
    }

这里是控制台输出。如您所见,正在创建新的记录器实例,但无法识别新属性。

log4j:WARN No appenders could be found for logger (Broker1_Logger).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

log4j:WARN No appenders could be found for logger (Broker2_Logger).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

log4j:WARN No appenders could be found for logger (Broker3_Logger).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

每个经纪人都是这样。是否有任何方法可以直接将我的配置设置应用于Logger对象?例如,类似于log的东西。属性配置程序。配置(log4jproperty);必须有一种方法将配置设置应用于创建的每个记录器对象。

谢谢你,

吉姆


共有1个答案

公羊绪
2023-03-14

似乎有必要为每个新实例创建一个新的appender,因为每个实例都需要打印到不同的文件输出位置。我通过创建一个GenerateLogger()方法来解决这个问题,该方法具有以编程方式创建新记录器和追加器的必要参数。如果您注意到第一个参数包含父记录器的名称。如果我在我的新记录器名称中包含这个,它将继承其父文件的属性,父文件在我的master.properties文件中配置,反之亦然。例如,如果我的父记录器是“经纪人”,而我的记录器名称是“经纪人1”,那么完整的记录器名称将是“经纪人”。经纪人1”。通过这种方式,我可以在一个日志文件中跟踪所有的代理,同时在自己单独的文件输出位置为每个代理提供单独的日志文件。更不用说,这种方法可以在使用不同父记录器的许多不同类型的日志中重复使用。虽然父记录仪是甚至不必要的,如果你选择。如果您选择没有父记录器,只需从方法中删除它,并忽略我的master.properties文件。

public Logger generateLogger(String parent, String name, String logDirectory, String filePattern, String fileThreshold) {
    // TODO Auto-generated method stub

    //Create Logger 
            String loggerName = parent + "." + name;
            Logger log = Logger.getLogger(loggerName);


            //Create Logging File Appender
            RollingFileAppender fileApp = new RollingFileAppender();
            fileApp.setName("Broker." + loggerName + "_FileAppender");
            fileApp.setFile(logDirectory +"/"+ name+".log");
            fileApp.setLayout(new PatternLayout(filePattern));
            fileApp.setThreshold(Level.toLevel(fileThreshold));
            fileApp.setAppend(true);
            fileApp.activateOptions();

            log.addAppender(fileApp);


            return log;     
}

这是我的主机中的代理记录器配置。属性文件以供参考。

log4j.logger.Broker=DEBUG, BrokerFile

    # Broker Appenders
    # Broker File Appender
        log4j.appender.BrokerFile=org.apache.log4j.RollingFileAppender
        log4j.appender.BrokerFile.File=C:/Documents and Settings/gr2cher/My Documents/KTLO/Java/CMInbound/BrokerLogs/Logs/Broker.log
        log4j.appender.BrokerFile.MaxFileSize=1MB
        log4j.appender.BrokerFile.MaxBackupIndex=1
        log4j.appender.BrokerFile.layout=org.apache.log4j.PatternLayout
        log4j.appender.BrokerFile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
        log4j.appender.BrokerFile.threshold=DEBUG
 类似资料:
  • 我想创建单独的日志文件,一个用于信息,另一个用于调试,我正在使用下面的log4j.property文件,请建议如何修改不同文件中的两级日志记录, 我想请求请发送我更新的属性文件而不是给我搜索或探索的指针,因为我已经花了3-4个小时在Google和StackOverflow上搜索这个解决方案, 提前道谢。

  • 我试图在springboot中配置log4j2。我已经从pom.xml.中删除(排除)了登录依赖项,我正在名为log4j2.xml的资源文件夹下使用此xml 这是我的控制器类。 我在这里错过了什么吗?我尝试使用application.properties也使用最新版本的Log4j2.But仍然没有created.When我运行应用程序,我看不到任何日志文件在xml中指定的路径上动态创建。

  • 问题内容: 我正在尝试配置log4j以将消息记录到文件中。现在,确实使用我提供的名称创建了该文件,但是日志未写入该文件。我的代码: 我文件的内容: 运行此命令时,将在控制台中获得以下输出: 该文件确实在我的主目录中创建。但是它是空的。 有什么想法我做错了吗?我正在使用log4j 1.2.17版。 问题答案: 输出似乎是Java标准日志记录框架(JUL)发出的默认格式。 因此,有两种可能性(想到):

  • 问题内容: 我有一个自动化的集成测试工具,想简化日志记录(使用log4j实现) 我有许多高级测试,每个测试都有一个ID,并且每个测试都需要一个 单独的 日志文件。由于测试是随机创建的,因此直到运行时才知道ID。 因此,我想确保将每个高级测试中的日志记录写到该测试的日志文件中。 我不想创建自定义日志级别,也不想将日志发送到所有附加程序。 有人知道这样做的方法吗? 问题答案: 您可以轻松地以编程方式调

  • 问题内容: 有没有一种方法可以配置log4j,以便将不同级别的日志记录输出到不同的附加程序? 我正在尝试设置多个日志文件。主日志文件将捕获所有类的所有INFO及以上消息。(在开发中,它将捕获所有DEBUG和以上消息,以及特定类的TRACE。) 然后,我想要一个单独的日志文件。该日志文件将捕获特定类子集的所有DEBUG消息,而忽略其他任何类的所有消息。 有没有办法得到我想要的? 问题答案: 这应该使