1

在多个记录器中使用相同的文件处理程序是个好主意吗?我使用Java日志框架,我希望不同的记录器写入同一个日志文件,但我不知道下面这个代码示例是否是一种好的编程风格。

import java.io.*;
import java.util.logging.*;

public class Alpha {
    private static final Logger LOGGER = Logger.getLogger(Alpha.class.getName());
    private static FileHandler loggingHandler;

    static {
        try {
            loggingHandler = new FileHandler("logfile.log", true);
            LOGGER.addHandler(loggingHandler);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static FileHandler getLoggingHandler() {
        return loggingHandler;
    }
}

class Beta {
    private static final Logger LOGGER = Logger.getLogger(Beta.class.getName());

    static {
        LOGGER.addHandler(Alpha.getLoggingHandler());
    }
}
4

3 回答 3

0

答案是肯定的。您可以通过创建一个单例日志类来实现这一点(例如),因此任何其他类或线程尝试创建它的副本,实际上将使用相同的实例。

示例实现java.util.logging

public class LogMe {        
    private static LogMe logMe;
    private static Logger logger;    
    private static FileHandler fh;
    private static Formatter sf;

    public LogMe() {
    //Make this class a singleton
        if (logMe != null) {
           return;
       }

        //Create the log file            
        try {
        fh = new FileHandler("../xyz/LogFile.log");
    } catch (Exception e) {
        e.printStackTrace();
    }

    sf = new SimpleFormatter();
    fh.setFormatter(sf);            
    logger.addHandler(fh);

    //Part of making this class a singleton
    logger = Logger.getLogger("LogMe");
    logMe = this;        
}

public Logger getLogger() {
    return LogMe.logger;
}
}

然后在您的课程中,您将像这样使用它

 class MyClass1 {
    LogMe logMe1 = new LogMe();
    Logger logger2 = logMe1.getLogger();
    logger.info("X 01");
}
于 2017-08-25T18:29:30.463 回答
0

我没有看到将一个文件处理程序用于多个记录器的任何问题。但是,将文件处理程序配置到单独的属性文件或某个配置数据库中总是更好的做法

于 2017-08-25T18:31:17.373 回答
0

通常,您只需在根记录器上安装一个处理程序,Logger.getLogger("")因为它是 和 的父记录AlphaBeta

但是,如果您想在兄弟姐妹上安装处理程序,那么您应该使用LogManager config选项或java.util.logging.config.class系统属性来创建您的日志配置。

package app.configs;

import java.io.IOException;
import java.util.logging.FileHandler;
import java.util.logging.Logger;

public final class SharedHandlerConfig {

    private static final Logger[] LOGGERS
            = new Logger[]{Logger.getLogger(Alpha.class.getName()),
                Logger.getLogger(Beta.class.getName())};

    private static final FileHandler FILE;

    static {
        try {
            FileHandler f = new FileHandler("../xyz/logfile.log", true);
            try {
                for (Logger l : LOGGERS) {
                    l.addHandler(f);
                }
                FILE = f;
                f = null;
            } finally {
                if (f != null) {
                    f.close();
                    for (Logger l : LOGGERS) {
                        l.removeHandler(f);
                    }
                }
            }
        } catch (IOException e) {
            throw new ExceptionInInitializerError(e);
        }
    }

    /**
     * From startup system property:
     * -Djava.util.logging.config.class=app.configs.SharedHandlerConfig
     * 
     * From logging.properties:
     * config=app.configs.SharedHandlerConfig
     */
    public SharedHandlerConfig() {
    }
}
于 2017-08-25T19:26:49.583 回答