【发布时间】:2018-01-11 10:31:57
【问题描述】:
我有 2 个线程同时运行,我想在文件中为每个线程写入信息。
我使用了unable to write log on correct file for mulithread?
中描述的方法
我获得了 2 个带有信息的文件,但是当 2 个线程正在运行时,所有信息都不会写入,只是一部分。
class1.java
package loggerTest;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class class1 {
// this logger will just use rootLogger
private static Logger log = Logger.getLogger(Thread.currentThread().getName() + "." + class1.class.getName());
static Worker W = null;
static SomethingElse SE = null;
public static void main(String args[]) {
log.info("Hello world");
W = new Worker();
try {
W.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
W.start();
SE = new SomethingElse();
SE.start();
}
}
工人.java 包 loggerTest;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class Worker extends Thread {
public static Logger LOGGER = Logger.getLogger(Worker.class);
public static void MainFunction(){
System.out.println("MainFunction de Worker");;
try{
String threadName = "worker_" + 1;
LOGGER = Logger.getLogger(threadName + "." + Worker.class.getName());
//Load the Existing Properties
Properties log4jprops = new Properties();
InputStream is = Worker.class.getClassLoader().getResourceAsStream("log4j.properties");
log4jprops.load( is );
//Set the output file for the LOGFILE appender
log4jprops.setProperty("log4j.appender.WORKER_1_LOG_FILE.File", "./logs/worker1_aa.log");
//Configure Log4j
PropertyConfigurator.configure(log4jprops);
LOGGER.info("--------------processing Worker-----------------");
}
catch(Exception e){
e.printStackTrace();
}
}
public void run(){
int i=0;
System.out.println("Lancement worker");
try{
while(i<5){
LOGGER.info("W i="+i);
MainFunction();
i++;
this.sleep(2000);
}
}
catch(Exception e){
e.printStackTrace();
}
this.interrupt();
}
}
SomethingElse.java
package loggerTest;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class SomethingElse extends Thread {
private static Logger log = Logger.getLogger(SomethingElse.class);
static void doIt2(){
try{
String threadName = "worker_" + 2;
log = Logger.getLogger(threadName + "." + Worker.class.getName());
//Load the Existing Properties
Properties log4jprops = new Properties();
InputStream is = SomethingElse.class.getClassLoader().getResourceAsStream("log4j.properties");
log4jprops.load( is );
//Set the output file for the LOGFILE appender
log4jprops.setProperty("log4j.appender.WORKER_2_LOG_FILE.File", "./logs/worker2_aa.log");
//Configure Log4j
PropertyConfigurator.configure(log4jprops);
log.info("--------------processing SomethingElse-----------------");
}
catch(Exception e){
e.printStackTrace();
}
}
public void run(){
int ii=0;
try{
while(ii<6){
log.info("SE ii="+ii);
doIt2();
ii++;
this.sleep(1000);
}
}
catch(Exception e){
e.printStackTrace();
}
this.interrupt();
}
}
当我单独启动线程 Worker 时,我得到了我想要的:
worker1_aa.log
2018-01-11 10:54:36.321 [Thread-0] 信息 worker_1.loggerTest.Worker - --------------处理工人-----------------
2018-01-11 10:54:38.741 [Thread-0 ] INFO worker_1.loggerTest.Worker - W i=1
2018-01-11 10:54:38.741 [Thread-0] 信息 worker_1.loggerTest.Worker - --------------处理工人-----------------
2018-01-11 10:54:40.756 [Thread-0 ] INFO worker_1.loggerTest.Worker - W i=2
2018-01-11 10:54:40.756 [Thread-0] 信息 worker_1.loggerTest.Worker - --------------处理工人-----------------
2018-01-11 10:54:42.757 [Thread-0 ] INFO worker_1.loggerTest.Worker - W i=3
2018-01-11 10:54:42.757 [Thread-0] 信息 worker_1.loggerTest.Worker - --------------处理工人-----------------
2018-01-11 10:54:44.772 [Thread-0 ] INFO worker_1.loggerTest.Worker - W i=4
2018-01-11 10:54:44.772 [Thread-0] 信息 worker_1.loggerTest.Worker - --------------处理工人------------------
但是当我同时启动 2 个线程时,我在 worker1_aa.log 中获得
2018-01-11 10:02:52.248 [Thread-0] 信息 worker_1.loggerTest.Worker - --------------处理工人-----------------
2018-01-11 10:02:54.277 [Thread-0 ] 信息 worker_1.loggerTest.Worker - --------------处理工人-----------------
2018-01-11 10:02:56.292 [Thread-0 ] 信息 worker_1.loggerTest.Worker - --------------处理工人-----------------
2018-01-11 10:02:58.306 [Thread-0 ] 信息 worker_1.loggerTest.Worker - --------------处理工人-----------------
2018-01-11 10:03:00.318 [Thread-0 ] INFO worker_1.loggerTest.Worker - W i=4
2018-01-11 10:03:00.318 [Thread-0] 信息 worker_1.loggerTest.Worker - --------------处理工人------------------
SomethingElse 也是如此。
我不明白。有什么问题?
我使用 log4j 1.2.17 和 log4j.properties
log4j.rootLogger=INFO, MAIN_LOG_FILE
log4j.appender.MAIN_LOG_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.MAIN_LOG_FILE.File=./logs/main.log
log4j.appender.MAIN_LOG_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIN_LOG_FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5p %c - %m%n
log4j.logger.worker_1=INFO, WORKER_1_LOG_FILE
log4j.additivity.worker_1=false
log4j.appender.WORKER_1_LOG_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.WORKER_1_LOG_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.WORKER_1_LOG_FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5p %c - %m%n
log4j.logger.worker_2=INFO, WORKER_2_LOG_FILE
log4j.additivity.worker_2=false
log4j.appender.WORKER_2_LOG_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.WORKER_2_LOG_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.WORKER_2_LOG_FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5p %c - %m%n
我以前从没用过 log4j,所以我不知道所有的窍门。
更新
我尝试在 log4j.properties 中不使用 log4j.additivity.worker_2=false(因此它也写入主日志),并且消息仅在主日志中完成。
问题一定是appender的配置问题。
【问题讨论】:
-
不知道?有人吗?
标签: java multithreading log4j