我正在使用Java.util.Logger记录项目的各种事件。我正在使用文件处理程序来创建日志。我看到事件写入日志(在磁盘中)的速率几乎就是事件发生的速度。这似乎是好的和坏的同时。很好,因为事件更新很快写入,但我担心IO时间。有时需要将大量数据写入日志。因此,在这些情况下,由于此日志记录,我的程序运行速度会变慢,这是不可取的。
如果有人可以建议我在这种情况下应该做些什么,那将会有很大的帮助。我不关心事件记录的速率,他们只需要在执行结束时在日志文件中。
感谢。
答案 0 :(得分:2)
运行完整的调试日志记录时,预计性能损失为5-10%。这对我们的客户来说似乎是可以接受的。
如果生成一些要注销的内容的代码很昂贵,请考虑使用这样的简单测试来避免在关闭调试时执行此代码:
if (log.isLoggable(Level.FINEST)) {
// code to generate the log entry
}
您还可以创建java.util.logging.MemoryHandler
并定期推送到文件。
答案 1 :(得分:1)
Jochen Bedersdorfer的答案很好,而just4log是一个可以自动为你做的系统 - 通过后期处理。因此,您不必使用if语句周围的if语句来破坏代码。
答案 2 :(得分:1)
Pexus最近发布了一个开源性能日志包 - PerfLog,它还包括一个基于java.util.logging。* API的应用程序记录器。它包括使用Common J Work Manager进行异步日志记录的选项,该选项可在所有J2EE容器(1.4+)中使用 有关详细信息,请参阅:http://www.pexus.com/perflog
答案 3 :(得分:0)
我建议您尝试另一种日志解决方案,例如广泛使用的log4j(通常与公共日志结合使用)。它提供了一种高效的日志记录方法。
如果你想要更多的控制,你可以实现自己的appender。假设您需要文件追加器,则可以覆盖append的FileAppender例程。
,例如,
public class BatchingFileAppender extends FileAppender {
private List<LoggingEvent> batch = new LinkedList<LoggingEvent>;
public static final int BATCH_SIZE = 10;
@Override
protected void append(LoggingEvent event) {
batch.add(event);
// you can even optionally push ever 10'th or so messages to file
if (batch.size() == BATCH_SIZE) {
appendBatch();
}
}
@Override
protected void reset() {
appendBatch();
}
@Override
protected void closeWriter() {
appendBatch();
}
private void appendBatch() {
for(LoggingEvent event : batch) {
super.append(event);
}
batch.clear();
}
}
答案 4 :(得分:0)
使用更现代的日志库,例如log4j或slf4j,它们支持异步/缓冲的appender。
在log4j中,您可以使用AsyncAppender(提供缓冲功能)并将FileAppender连接到它:
AsyncAppender将收集发送给它的事件,然后将它们分发给附加到它的所有appender。您可以将多个appender附加到AsyncAppender。
AsyncAppender使用单独的线程来为其缓冲区中的事件提供服务。
这样,事件就会以受控方式写入磁盘,并且执行实际工作的线程不会与磁盘I / O捆绑在一起。
或者作为一个更简单的选项,请考虑在运行此程序时是否确实需要完整的日志输出。在DEBUG级别进行日志记录,在生产环境中运行应用程序通常会有些过分。
答案 5 :(得分:0)
你应该看看Logback。如果我没弄错的话,与log4j的作者相同。
基于我们之前关于log4j的工作,已经有了logback内部结构 重写,在某些关键时刻表现要快十倍 执行路径。不仅logback组件更快,而且还有 更小的内存占用。