gpt4 book ai didi

java - 如何让多个线程和类写入 Java 中的同一个日志文件?

转载 作者:搜寻专家 更新时间:2023-11-01 03:06:21 28 4
gpt4 key购买 nike

在 Java 应用程序中,我到处都有几个类和线程。我希望他们都将日志写入一个文件。我怎样才能做到这一点?

另外还有一些问题:

  1. 如果我在不同的类中为它们定义相同的名称,我会收到相同的记录器实例吗?要清楚,以下两个记录器是否相同:

    class MyClass1 {
    Logger logger1 = Logger.getLogger("theSameName");
    }
    class MyClass2{
    Logger logger2 = Logger.getLogger("theSameName");
    }
  2. 如果我在两个具有相同文件名的独立线程中定义两个 FileHandler 会怎样?他们都写入同一个文件吗?如果是,如果文件已被第一个打开,当第二个尝试打开并写入文件时会发生什么情况?

  3. 如果我尝试将同一个 FielHandler 添加到记录器中不止一次,会发生什么情况:

    logger.addHandler(myFileHandler); // in Thread one
    ...
    logger.addHandler(myFileHandler); // in Thread two

我会因为两个 FileHandler 尝试同时打开同一个文件而收到 RuntimeException 吗?

我使用的是 java-util-logging 而不是 log4j

最佳答案

制作 singleton log 类,以便任何其他类或线程尝试创建它的副本,实际上将使用相同的实例。

使用 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)中,您将像这样使用它:

class MyClass1 {
LogMe logMe1 = new LogMe();
Logger logger2 = logMe1.getLogger();
logger.info("X 01");
}

class MyClass2 {
LogMe logMe2 = new LogMe();
Logger logger2 = logMe2.getLogger();
logger.info("X 02");
}

请注意,无论您在类中为 LogMe 及其 Logger 命名,都不会产生任何影响,因为它们引用的是 LogMe< 的同一个实例 及其 Logger

日志文件中的示例输出如下所示:

Oct 1, 2015 10:43:47 AM 
INFO: X 01
Oct 1, 2015 10:43:47 AM
INFO: X 02

请注意,这些日志行的顺序将取决于您的类的执行顺序。您也不需要任何同步,引用 Logger 的 JavaDoc:

All methods on Logger are multi-thread safe.

关于java - 如何让多个线程和类写入 Java 中的同一个日志文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20975383/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com