如何在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的示例。
-
实现一个新的日志appender,管理不同线程和文件的FileAppender。 使用AppenderSkeleton执行此操作,维护FileAppenders的映射。
public MultiThreadAppender extends AppenderSkeleton { public final static String THREAD_KEY = "THREAD_NO"; private Map
fileAppenders; } -
使用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);