2011-11-22 91 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);