【问题标题】:java util logging multiple log files createdjava util记录创建的多个日志文件
【发布时间】:2021-11-13 15:58:40
【问题描述】:

我正在尝试在我的 java awt swing 应用程序(它是一个 .jar 应用程序)中实现 java.util.logging。另外,我想记录多个 java 类文件。 因此,我将日志记录功能创建为实用程序类。

请找到我的MyLog 它是一个实用程序类

public class MyLog {
    
    private static MyLog instance = new MyLog();
    public static MyLog getInstance() {
        return instance;
    }
    
    
    public void info(String msg) {
         Logger logger = Logger.getLogger("MyLog");  
            FileHandler fh;  

            try {  

                // This block configure the logger with handler and formatter  
                fh = new FileHandler("f://MyLogFile.log");  
                logger.addHandler(fh);
                SimpleFormatter formatter = new SimpleFormatter();  
                fh.setFormatter(formatter);  

                // the following statement is used to log any messages  
                logger.info(msg);  

            } catch (SecurityException e) {  
                e.printStackTrace();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
    }
}

请找到我的实现类。

class AEvent extends Frame implements ActionListener {

    private static final long serialVersionUID = 1L;
    private MyLog logProp = MyLog.getInstance();

    TextField tf;

    AEvent() {

        // create components
        tf = new TextField();
        tf.setBounds(60, 50, 170, 20);
        Button b = new Button("click me");
        b.setBounds(100, 120, 80, 30);

        // register listener
        b.addActionListener(this);// passing current instance

        // add components and set size, layout and visibility
        add(b);
        add(tf);
        setSize(300, 300);
        setLayout(null);
        setVisible(true);
        logProp.info("My first logging message 1");

    }

    public void actionPerformed(ActionEvent e) {
        logProp.info("My first logging message 2");
        tf.setText("Welcome");

    }

    public static void main(String args[]) throws SecurityException, IOException {
        new AEvent();

    }
}

这里的问题是,日志写入多个文件(意味着生成多个MyLogFile.log),MyLogFile.log.1.lck 这种类型的文件也生成。

请在下面找到日志文件列表。

【问题讨论】:

    标签: java logging java.util.logging


    【解决方案1】:

    不要在每次写入日志时都创建一个 Logger,而是创建 一个静态 Logger 对象:

    private static final Logger logger =
        Logger.getLogger(MyLog.class.getName());
    
    static {
        try {  
            fh = new FileHandler("f:\\MyLogFile.log");  
            SimpleFormatter formatter = new SimpleFormatter();  
            fh.setFormatter(formatter);  
            logger.addHandler(fh);
        } catch (SecurityException | IOException e) {  
            e.printStackTrace();  
        }  
    }
    

    然后你的方法应该变得简单:

    public void info(String msg) {
        logger.info(msg);
    }
    

    显然,这样做没有多大价值。相反,每个类都应该有自己的静态最终 Logger 字段。将 Java Logger 包装在自己的日志记录类中不会增加任何价值。

    事实上,你的包装类让事情变得更糟了,因为它把所有的消息都写到一个同名的 Logger 中。每个类都应该使用一个名称与该类的完全限定名称相对应的 Logger,这就是 Logger.getLogger(MyLog.class.getName()) 所做的。

    所以,您真正需要做的就是添加 FileHandler:

    public class MyLog {
        private static boolean added;
    
        /** Make sure this class cannot be instantiated. */
        private MyLog() {
            // Deliberately empty.
        }
    
        public static void addFileHandler() {
            if (!added) {
                try {  
                    fh = new FileHandler("f:\\MyLogFile.log");  
                    SimpleFormatter formatter = new SimpleFormatter();  
                    fh.setFormatter(formatter);  
                    Logger.getLogger("").addHandler(fh);
                    added = true;
                } catch (SecurityException | IOException e) {  
                    e.printStackTrace();  
                }  
            }
        }
    }
    

    Logger.getLogger("") 是所有其他记录器的父级。其他的将继承它的处理程序。

    在您的应用程序类中,更改以下内容:

    private MyLog logProp = MyLog.getInstance();
    

    到这里:

    private static final Logger logProp =
        Logger.getLogger(AEEvent.class.getName());
    

    并在您的 main 方法中初始化日志文件处理程序:

    public static void main(String args[]) {
        MyLog.addFileHandler();
        new AEvent();
    }
    

    旁注:AWT 和 Swing 类需要在专用的 AWT 事件调度线程中执行,而不是在主线程中。你可以用EventQueue.invokeLater做到这一点:

    public static void main(String args[])
        MyLog.addFileHandler();
        EventQueue.invokeLater(() -> new AEvent());
    }
    

    旁注2:斜杠和反斜杠不是同一个字符。这是一个有效的 Windows 路径:

    "f:\\MyLogFile.log"
    

    但这不是:

    "f://MyLogFile.log"
    

    【讨论】:

      【解决方案2】:

      问题:您正在 info 方法中创建日志文件。

      当你第一次运行程序时,它会为每次调用 info 方法创建一个日志文件。

      您应该只在构造函数中创建一次日志文件。

      package com.practice;
      
      import java.io.IOException;
      import java.util.logging.FileHandler;
      import java.util.logging.Logger;
      import java.util.logging.SimpleFormatter;
      
      public class MyLog {
      
      private static MyLog instance = new MyLog();
      private Logger logger;
      
      public static MyLog getInstance() {
          return instance;
      }
      
      
      public void info(String msg) {
          logger.info(msg);
      
      }
      
      
      private MyLog() {
          FileHandler fh;
          try {
              logger = Logger.getLogger("MyLog");
              // This block configure the logger with handler and formatter
              fh = new FileHandler("f://MyLogFile.log");
              logger.addHandler(fh);
              SimpleFormatter formatter = new SimpleFormatter();
              fh.setFormatter(formatter);
      
          } catch (SecurityException e) {
              e.printStackTrace();
          } catch (IOException e) {
              e.printStackTrace();
          }
      }
      
      public static void main(String[] args) {
          MyLog myLog = MyLog.getInstance();
          myLog.info("www");
          myLog.info("asa");
          myLog.info("asa");
          myLog.info("vv");
          myLog.info("ffv");
      }
      

      }

      【讨论】:

        猜你喜欢
        • 2011-06-17
        • 2012-04-27
        • 1970-01-01
        • 2011-02-12
        • 1970-01-01
        • 1970-01-01
        • 2020-05-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多