【问题标题】:Java Logging to Multiple FilesJava 记录到多个文件
【发布时间】:2016-01-26 14:35:35
【问题描述】:

我有一个跟踪多个学生的应用程序。在处理有关该学生的信息时,我希望他们的日志消息进入该日志文件。

logs/system.log
logs/abby.log
logs/brett.log
logs/catherine.log

系统可以动态添加更多学生,所以我无法在我的日志配置文件中指定每个学生。如何在运行时指定记录器应将信息写入 catherine.log ?

【问题讨论】:

    标签: java logging


    【解决方案1】:

    您使用的是哪个日志框架?如果您使用的是 Log4j,以下是一个示例:

    import org.apache.log4j.Level;
    import org.apache.log4j.Logger;
    import org.apache.log4j.SimpleLayout;
    import org.apache.log4j.FileAppender;
    
    public class MyTestClass {
       /* Logger Instance should always be kept static final */
       private static final Logger LOGGER = Logger.getLogger(MyTestClass.class);
    
       public static void main(String args[]) {
    
          /* Create Dynamic FileAppender */
          SimpleLayout myLayout = new SimpleLayout();    
          FileAppender nwAppender = new FileAppender(myLayout,"file_nm",false);    
    
          LOGGER.addAppender(nwAppender);
    
          LOGGER.setLevel((Level) Level.INFO);
    
          /* Write Level : Debug */
          LOGGER.debug("*** DEBUG ***");
          /* Write Level : Info */
          LOGGER.info("*** INFO ***");
          /* Write Level : Error */
          LOGGER.info("*** ERROR ***");
       }
    }
    

    【讨论】:

    • 感谢您的回复。我正在使用 java.util.logging。如果我需要使用不同的框架来让它工作,我会的。否则我不愿意在整个程序中更改日志记录。
    • 无需更改任何内容。您可以开始将 SLF4J 与 Log4J 一起使用,并将 JUL 桥接到 SLF4J。更多信息:slf4j.org/legacy.html#jul-to-slf4j
    • 在您的示例代码中,我是否需要为我希望写入的每个文件创建一个新的记录器?如果我只是将多个 FileAppenders 添加到单个记录器中,那么日志消息将发送到所有文件,不是吗?
    • 是的,如果您将多个 FileAppenders 添加到单个 Logger,那么您的消息将发送到所有文件。
    • 我的意图是写入多个文件。
    【解决方案2】:

    如何在运行时指定记录器应将信息写入 catherine.log ?

    没有用于启用此行为的 logging.properties 选项。您必须编写代码来创建记录器(强引用)并在该记录器上安装 FileHandler。

    abby.log 的消息同时写入系统日志和 abby.log。

    您应该创建一个记录器命名空间,以便系统文件处理程序安装在根记录器上,并且每个学生都是一个子记录器,setUseParentHandlers 设置为 false。

    如果多个线程在处理abby,会打开abby-1、abby-2

    那是因为您创建了多个具有相同文件名的 FileHandler。创建地图并记住您打开的内容。

    【讨论】:

    • 创建文件处理程序的映射?这应该是静态的并以某种方式传递到我的线程中吗?
    • 对。否则,如果每个学生都有一个唯一的记录器,则通过调用 logger.getHandlers 检查它是否在记录器上安装了文件处理程序。
    猜你喜欢
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 2011-01-03
    • 2016-01-13
    相关资源
    最近更新 更多