2014-09-01 262 views
1

我有一个关于java.util.Logger的问题。 我设置了文件处理程序,改变这样的格式:Java日志记录:控制台与文件输出

Logger logger = Logger.getLogger("TotalLog"); 
FileHandler fh = new FileHandler("log/total.%g.log", 5242880, 20, true); 
fh.setFormatter(new Formatter() { 

    @Override 
    public String format(LogRecord record) { 
    return new Date(record.getMillis()) + " " + record.getLevel() + ": " + record.getMessage() + "\n"; 
    } 
}); 

logger.addHandler(fh); 
logger.log(Level.INFO, "****************************************"); 

的问题是格式化影响的日志文件。但控制台不显示这种格式的消息。此外,像这样的代码在控制台中工作,但不能在文件中工作。

logger.log(Level.INFO, "{0} user folders registered.", userfolders.size()); 

在控制台上的印刷这意味着:4 user folders registered.
但在文件:{0} user folders registered.

如何解决这些问题?

编辑
确定这里是解决方案,我发现是展示如何访问记录器的默认控制台处理程序的链接:logging in java

因此,而不是创建一个匿名类,我创建了一个新的名为类LogFormatter

public class LogFormatter extends Formatter { 
    @Override 
    public String format(LogRecord record) { 
    return new Date(record.getMillis()) + " " + record.getLevel() + ": " + record.getMessage() + "\n"; 
    } 
} 

,并改变了代码一点点:

Logger logger = Logger.getLogger("TotalLog"); 
FileHandler fh = new FileHandler("log/total.%g.log", 5242880, 20, true); 
fh.setFormatter(new LogFormatter()); 
logger.addHandler(fh); 
logger.getParent().getHandlers()[0].setFormatter(new LogFormatter()); 
logger.log(Level.INFO, "****************************************"); 

不过,我不知道如何做参数化日志记录。同时我用下面的代码代替了:

logger.log(Level.INFO, userfolders.size() + " user folders registered."); 

任何想法该怎么做?

+0

你为什么要为此编写代码?您可以配置格式化模式(甚至以编程方式)以实现相同的结果。事实上,你可能打破了替代逻辑。 – Thilo 2014-09-01 01:56:33

+0

默认的日志中查找此 DATE CLASS:方法 LEVEL:MESSAGE 不过,我需要这种格式 日期级别:MESSAGE – Batbayar 2014-09-01 02:07:15

+0

一些例子为格式字符串:http://docs.oracle.com/javase/7/docs/api /java/util/logging/SimpleFormatter.html#format%28java.util.logging.LogRecord%29但java.util.Logging非常痛苦。我建议看看SLF4J。 – Thilo 2014-09-01 02:16:22

回答

0

呼叫formatMessageFormatter类(或复制并调整它为您的需求),例如:用于format方法上http://docs.oracle.com/javase/7/docs/api/java/util/logging/Formatter.html

public class LogFormatter extends Formatter { 
    @Override 
    public String format(LogRecord record) { 
    return new Date(record.getMillis()) + " " + record.getLevel() + ": " + super.formatMessage(record) + "\n"; 
    } 
} 

见注释:

公共抽象的字符串格式(的LogRecord记录)

格式化给定的日志记录并返回格式化的字符串。

生成的格式化字符串通常包含LogRecord消息字段的本地化和 格式化版本。建议 使用formatMessage(java.util.logging.LogRecord)方便 方法来本地化和格式化消息字段。

+0

工作就像我想要的感谢。 – Batbayar 2014-09-02 07:39:00