如何在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 

请帮我?

问候

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

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

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

你可以使用MDC

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

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

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

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

另请参阅log4j简介:CekiGülcü,2002年3月 ,以防您需要一个如何配置appender的示例。

  1. 实现一个新的日志appender,管理不同线程和文件的FileAppender。 使用AppenderSkeleton执行此操作,维护FileAppenders的映射。

     public MultiThreadAppender extends AppenderSkeleton { public final static String THREAD_KEY = "THREAD_NO"; private Map 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(...)); // } } 

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

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