我想使用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
请帮帮我?
此致
答案 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)
实现一个新的日志追加器,它管理不同线程和文件的FileAppender。使用AppenderSkeleton执行此操作,为FileAppenders维护一个映射。
public MultiThreadAppender extends AppenderSkeleton {
public final static String THREAD_KEY = "THREAD_NO";
private Map<String, FileAppender> 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(...)); //
}
}
答案 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);