如何在java中使用多线程中的log4j?

时间:2011-11-22 12:13:06

标签: java multithreading log4j

我想使用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

请帮帮我?

此致

5 个答案:

答案 0 :(得分:4)

你可以使用MDC

MDC.put(键,值); - 在代码中

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

答案 1 :(得分:2)

也许你可以试试这样的东西:

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

您可以使用类似“thread.getName()”的内容获取您的主题名称,我认为;)

答案 2 :(得分:1)

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

如果每个线程使用自己的Runnable实现(?),这应该有效。如果没有,请尝试使用ThreadLocal<Logger>作为logger并使用LogManager.getLogger(String)使用广泛使用线程的唯一名称填充它。

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

答案 3 :(得分:1)

  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(...)); //
        }
    }
    

答案 4 :(得分:1)

这是我使用线程特定记录器的方式。只需将粘贴复制到您运行的方法之上,它应该按原样运行。不要忘记更改大写字母。

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);