【问题标题】:how can we remove extra message in log files我们如何删除日志文件中的额外消息
【发布时间】:2011-08-01 12:08:37
【问题描述】:

我有一个简单的日志记录程序,即:

public class LoggingExample1 {
 public static void main(String args[]) {
try {
  LogManager lm = LogManager.getLogManager();
  Logger logger;
  FileHandler fh = new FileHandler("log_test.txt");

  logger = Logger.getLogger("LoggingExample1");
  lm.addLogger(logger);
  logger.setLevel(Level.INFO);

  fh.setFormatter(new SimpleFormatter());

  logger.addHandler(fh);
  // root logger defaults to SimpleFormatter. We don't want messages
  // logged twice.
  //logger.setUseParentHandlers(false);

  logger.log(Level.INFO, "test 1");
  logger.log(Level.INFO, "test 2");
  logger.log(Level.INFO, "test 3");
  fh.close();
} catch (Exception e) {
  System.out.println("Exception thrown: " + e);
  e.printStackTrace();
}
}
}

我得到了这个日志:

Aug 1, 2011 5:36:37 PM LoggingExample1 main
INFO: test 1
Aug 1, 2011 5:36:37 PM LoggingExample1 main
INFO: test 2
Aug 1, 2011 5:36:37 PM LoggingExample1 main
INFO: test 3

但我想删除以下消息:LoggingExample1 main 和 INFO 并且只保留由代码记录的数据。 我该怎么办???

【问题讨论】:

    标签: java logging java.util.logging


    【解决方案1】:

    这是因为您使用的是SimpleFormatter,它始终记录类名、方法名等。如果您不想要这些信息,您可以编写自己的格式化程序。这是一个简单的格式化程序示例,它只输出日志级别和日志消息:

    import java.util.logging.*;
    
    class MyFormatter extends Formatter{
    
        /* (non-Javadoc)
         * @see java.util.logging.Formatter#format(java.util.logging.LogRecord)
         */
        @Override
        public String format(LogRecord record) {
            StringBuilder sb = new StringBuilder();
            sb.append(record.getLevel()).append(':');
            sb.append(record.getMessage()).append('\n');
            return sb.toString();
        }    
    }
    

    在您的文件处理程序中使用此格式化程序:

    fh.setFormatter(new MyFormatter());
    

    这将输出:

    INFO:test 1
    INFO:test 2
    INFO:test 3
    

    【讨论】:

      【解决方案2】:

      使用格式化程序类扩展您的课程,如下所示:

      public class MyFormatter extends SimpleFormatter{
      
      @Override
      
      public synchronized String format(LogRecord record){
      
          record.setSourceClassName(MyFormatter.class .getName());
          return String.format(
                  " [%1$s] :%2$s\n",
                  record.getLevel().getName(), formatMessage(record));
      
          }
      }
      

      然后在您的主类中,将控制台处理程序和文件处理程序格式设置为您的类格式对象。 就我而言,它是 consoleHandler.format(new MyFormatter); filehandler.format(new Myformatter);

      最重要的是你必须设置 logger.setUseParentHandler(false);

      现在你可以开始了!

      【讨论】:

        【解决方案3】:

        如果我理解正确,你想删除INFO 并且只有test 1 等等?

        如果是这样的话,我认为这是不可能的。原因是您需要知道这是什么类型的消息。

        ERROR
        WARNING
        INFO
        DEBUG
        TRACE
        

        如果需要,您可以将级别更改为仅显示警告及更高级别。

        【讨论】:

        • @TC1 这不是 log4j。这是java.util.logging
        • @dogbane 我写评论时他把它标记为 log4j,以后一定要编辑。
        【解决方案4】:

        这是我的做法,SimpleFormatter 的简化版

        package org.nibor.git_merge_repos;
        
        import java.util.Date;
        import java.util.logging.Formatter;
        import java.util.logging.LogRecord;
        
        
        public class CustomLogFormatter extends Formatter {
        
            private final Date dat = new Date();
        
            private static final String seperator = " : ";
        
            public synchronized String format(LogRecord record) {
                dat.setTime(record.getMillis());
                return dat + seperator + record.getLevel().getName() + seperator + record.getMessage() + "\n";
        
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-02-04
          • 1970-01-01
          • 2019-08-25
          • 1970-01-01
          • 2021-08-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多