I have 2 threads running in same time, I want write info in file for each.
I used method described in unable to write log on correct file for mulithread?
I obtain 2 files with info but when the 2 threads are running, all infos doesn't write, just a part.
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();
}
}
Worker.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 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();
}
}
When I launch thread Worker alone, I have what I want :
worker1_aa.log
2018-01-11 10:54:36.321 [Thread-0] INFO worker_1.loggerTest.Worker - --------------processing 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] INFO worker_1.loggerTest.Worker - --------------processing 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] INFO worker_1.loggerTest.Worker - --------------processing 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] INFO worker_1.loggerTest.Worker - --------------processing 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] INFO worker_1.loggerTest.Worker - --------------processing Worker-----------------
but when I launch the 2 threads in the same time, I obtain in worker1_aa.log
2018-01-11 10:02:52.248 [Thread-0] INFO worker_1.loggerTest.Worker - --------------processing Worker-----------------
2018-01-11 10:02:54.277 [Thread-0] INFO worker_1.loggerTest.Worker - --------------processing Worker-----------------
2018-01-11 10:02:56.292 [Thread-0] INFO worker_1.loggerTest.Worker - --------------processing Worker-----------------
2018-01-11 10:02:58.306 [Thread-0] INFO worker_1.loggerTest.Worker - --------------processing 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] INFO worker_1.loggerTest.Worker - --------------processing Worker-----------------
The same with SomethingElse.
I don't get it. What is the problem?
I use log4j 1.2.17 with a 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
I never use log4j before, so I don't know all the trick.
UPDATE
I tried without log4j.additivity.worker_2=false in the log4j.properties (so it's also write in main log), and the message is complete only in the main.
The problem must be from configuration of appender.