【问题标题】:how to use log4j in Multithread using java?如何在使用 java 的多线程中使用 log4j?
【发布时间】:2012-01-03 19:49:04
【问题描述】:

我想使用 log4j 为每个线程写日志,日志文件名为“workthread..log”,第一个线程打印日志在文件“workthread-1.log”上,第二个线程在“workthread-2.log”上等等。

class MyRunnable implements Runnable 
  {
       private Logger logger=null;

       public MyRunnable()
        {
            DOMConfigurator.configure(this.getClass().getClassLoader().getResource(LOG4J_FILEPATH));
            logger =Logger.getLogger(classname);
        }

        public void run() 
        {
          logger.info("Important job running in MyRunnable"+Thread.currentThread().getName());
        }
   }


public class TestThreads 
{
    public static void main (String [] args) 
     {
        Thread[] worker=new Thread[3];
        MyRunnable r = new MyRunnable();

        for(int i=0;i<3;i++) {
           worker[i]=new Thread(r);
           worker[i].start();
        }


    }
}//class

请帮帮我?

问候

【问题讨论】:

  • 你的问题是什么?代码在做什么?有什么错误吗?

标签: java multithreading log4j


【解决方案1】:

你可以使用 MDC

MDC.put(key,value); --在代码中

和%X{key}--在log4j配置文件的文件名字段中

【讨论】:

    【解决方案2】:

    也许你可以尝试这样的事情:

    logger = Logger.getLogger(classname);
    logger.removeAllAppenders();                                        
    logger.addAppender(new FileAppender(layout, "your-thread-name.log", true)); 
    

    你可以用“thread.getName()”之类的东西来获取你的线程的名称,我认为 ;)

    【讨论】:

      【解决方案3】:

      您可以使用LogManager.getLogger(Class) method 使用实例初始化每个logger 字段。通过使用不同的文本文件附加程序,您可以将日志行转储到适当名称的文本文件中。

      如果每个线程都使用自己的Runnable 实现(?),这应该可以工作。如果不是,请尝试将ThreadLocal&lt;Logger&gt; 用作logger,并使用LogManager.getLogger(String) 填充它,并使用线程范围内唯一的名称。

      如果您需要有关如何配置附加程序的示例,另请参阅 Short introduction to log4j: Ceki Gülcü, March 2002

      【讨论】:

        【解决方案4】:
        1. 实现一个新的日志附加器,它为不同的线程和文件管理 FileAppender。使用 AppenderSkeleton 执行此操作,维护 FileAppenders 的映射。

          public MultiThreadAppender extends AppenderSkeleton {
              public final static String THREAD_KEY = "THREAD_NO";
              private Map<String, FileAppender> fileAppenders;
          }
          
        2. 使用 MDC 来识别不同的线程。使用“THREAD_NO”之类的键,在线程第一次调用记录器时放入 MDC (MDC.put),并检查此键以获取 FileAppender。示例如下:

          protected void append(LoggingEvent event) {
              Object value = event.getMDC(THREAD_KEY);
              FileAppender appender;
              if (value instanceof String && ((String) value).length() > 0) {
                  appender = fileAppenders.get(value);
              } else {
                  value = nextThreadNo();
                  fileAppenders.put(value, new FileAppender(...)); //
              }
          }
          

        【讨论】:

          【解决方案5】:

          这就是我使用线程特定记录器的方式。只需复制粘贴并将其放在运行方法之上,并且应该按原样工作。不要忘记更改大写的文本。

          String currenttime = String.valueOf(new Long(new Date().getTime()/1000));
          String logFileName = "NAMEHERE_thread" + Thread.currentThread().getId() 
                               + "_" + currenttime+".log";
          Logger logger = Logger.getLogger("NAMEHERE_thread" +
                                                Thread.currentThread().getId() + "_"+ currenttime);
          
          Properties prop = new Properties();
          prop.setProperty("log4j.logger.NAMEHERE_thread" + Thread.currentThread().getId() 
                           + "_" + currenttime,"DEBUG, file");
          
          prop.setProperty("log4j.appender.file", "org.apache.log4j.RollingFileAppender");
          prop.setProperty("log4j.appender.file.maxFileSize", "100MB");
          prop.setProperty("log4j.appender.file.maxBackupIndex", "100");
          prop.setProperty("log4j.appender.file.File", 
                           REPLACEMEWITHPATH + File.separator + logFileName);
          prop.setProperty("log4j.appender.file.threshold","debug");
          prop.setProperty("log4j.appender.file.layout", "org.apache.log4j.PatternLayout");
          prop.setProperty("log4j.appender.file.layout.ConversionPattern", 
                           "%d [%t] %-5p [%-35F : %-25M : %-6L] %-C -%m%n");
          prop.setProperty("log4j.appender.stdout", "org.apache.log4j.ConsoleAppender");
          PropertyConfigurator.configure(prop);
          

          【讨论】:

            猜你喜欢
            • 2020-02-01
            • 2011-03-04
            • 2023-03-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-05-17
            • 2018-01-26
            相关资源
            最近更新 更多