Best practices for Java logging from multiple threads?

前端 未结 12 1248
星月不相逢
星月不相逢 2020-12-03 02:39

I want to have a diagnostic log that is produced by several tasks managing data. These tasks may be in multiple threads. Each task needs to write an element (possibly with s

12条回答
  •  借酒劲吻你
    2020-12-03 03:25

    This is an old question but here's my solution using Log4J programmatically.

    LogFactory class

    import org.apache.log4j.Logger;
    import org.apache.log4j.PropertyConfigurator;
    
    import java.util.Properties;
    
    public class LogFactory {
    
        private final static ThreadLocal logFactory = new ThreadLocal<>();
    
        public static void createNewLogger(String className) {
    
            Logger log = Logger.getLogger("Thread" + className);
    
            Properties props = new Properties();
            props.setProperty("log4j.appender.file", "org.apache.log4j.RollingFileAppender");
    
            props.setProperty("log4j.appender.file.maxFileSize", "100MB");
            props.setProperty("log4j.appender.file.Append", "false");
            props.setProperty("log4j.", "100MB");
            props.setProperty("log4j.appender.file.maxBackupIndex", "100");
            props.setProperty("log4j.appender.file.File", "logs/" + className + ".log");
            props.setProperty("log4j.appender.file.threshold", "info");
            props.setProperty("log4j.appender.file.layout", "org.apache.log4j.PatternLayout");
            props.setProperty("log4j.appender.file.layout.ConversionPattern", "%d{yyyy-MM-dd HH-mm-ss} | %-5p | %C{1}:%L | %m%n");
            props.setProperty("log4j.appender.stdout", "org.apache.log4j.ConsoleAppender");
            props.setProperty("log4j.appender.stdout.Target", "System.out");
            props.setProperty("log4j.logger." + "Thread" + className, "INFO, file");
            PropertyConfigurator.configure(props);
            logFactory.set(log);
        }
    
        public static Logger getLogger() {
            return logFactory.get();
        }
    
    }
    

    Then to initialise the the logger use the following approach

    logFactory.createNewLogger(String.valueOf(Thread.currentThread().getId()));
    logFactory.getLogger().info(" TEST . Thread id is: " + id);
    

提交回复
热议问题