java.util.logging自定义格式化程序无法按预期工作

时间:2015-03-09 14:40:04

标签: java logging

我正在使用Java 6.我创建了一个自定义格式化程序,它只创建时间和消息,但它总是打印空类名和方法名以及除时间和消息之外的日志级别两行:

2015年3月8日下午6:48:09 null null

ALL:这是一条消息

此外,生成的日志文件采用以下格式,我希望它首先以xxx.log.0开头,一旦填满,然后是xxx.log.1,但它同时生成所有10个文件时间。

xxxx.log.0.9

xxxx.log.0.8

xxxx.log.0.7

xxxx.log.0.6

xxxx.log.0.5

xxxx.log.0.4

xxxx.log.0.3

有人可以告诉我如何只记录时间和消息以及如何更正日志文件扩展名?非常感谢!

public class MyFormatter extends Formatter {
    public String format(LogRecord record) 
    {
        String recordStr = new Date() + " " + formatMessage(record)
        return recordStr;
    }
}

使用MyFormatter的代码:

Logger fileLogger = Logger.getLogger(xxxx.class.getPackage().getName());
FileHandler handler = new FileHandler(pattern, limit, numLogFiles, true);
MyFormatter formatter = new MyFormatter();       
handler.setFormatter(formatter);                    
fileLogger.addHandler(handler);
Level logLevel = java.util.logging.Level.ALL;
fileLogger.log(new LogRecord(logLevel, "This is a message"));    

1 个答案:

答案 0 :(得分:1)

  

我正在使用Java 6.我创建了一个自定义格式化程序,它只创建时间和消息,但它总是打印空类名和方法名以及除时间和消息之外的日志级别两行:

该输出来自java.util.logging.SimpleFormatter,它支持仅打印日期和消息。可以使用以下模式将SimpleFormatter更改为自定义格式化程序:

-Djava.util.logging.SimpleFormatter.format="[%1$tc] %5$s%n"

使用格式化程序的代码未设置method nameclass namelogger name。调用Logger.log(Level,String)方法将为您计算呼叫站点。

        private static final Logger fileLogger = Logger.getLogger(xxxx.class.getPackage().getName());

        private static void initLogging() throws IOException {
            FileHandler handler = new FileHandler(pattern, limit, numLogFiles, true);
            MyFormatter formatter = new MyFormatter();       
            handler.setFormatter(formatter);                    
            fileLogger.addHandler(handler);
            fileLogger.log(Level.ALL, "This is a message");
        }

不确定是否有意,但是你应该使用LogRecord的event time而不是当前时间。

  

此外,生成的日志文件采用以下格式,我希望它首先以xxx.log.0开头,一旦填满,然后是xxx.log.1,但它同时生成所有10个文件时间。

对于您创建的每个FileHandler,在创建具有相同模式的新代码之前,必须确保代码已关闭它。默认情况下,LogManager将在关闭时关闭所有连接的处理程序。您还必须确保持有对包含附加处理程序的记录器的强引用。方法本地引用(例如示例中使用的内容)不计算在内。