2011-11-22 48 views
2

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

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 

请帮帮我吗?

问候

+0

和你的问题是什么?代码在做什么?有没有错误? –

回答

2

或许你可以尝试somezthing这样在文件名称字段:

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

你可以得到你的线程的名称像“thread.getName()”我认为;)

4

你可以使用MDC

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

和%X {}键 - log4j的配置文件

1

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

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

另请参阅Short introduction to log4j: Ceki Gülcü, March 2002以防您需要如何配置appender的示例。

1
  1. 实现一个新的日志appender,它为不同的线程和文件管理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(...)); // 
        } 
    } 
    
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);