如何规范记录指令产生的打印输出量随着时间的推移而产生?

时间:2009-06-12 13:06:48

标签: java performance logging java.util.logging

如何在Y秒内将程序日志打印输出限制为最多X个打印输出?

使用java.util.logging编程服务器端,我的代码有很多信息,警告和错误语句,如:

s_logger.logp(Level.WARNING, myClassName, myMethodName, "msg.code.in.properties.file");

一方面,我确实希望看到上面的警告信息打印到STDOUT,因为它表明出现了问题,特别是在调查生产中的问题时,但另一方面,打印了许多线条,告诉我们同一个故事在很短的时间内,没有附加价值,而是打击性能并引入滚动失明。

我正在寻找的是一种机制/ API,可以在y秒内将每个消息代码的打印输出调整为不超过x条消息。例如,在一分钟内,我不想生成和写入超过10个类型的消息:“事务超时”。

我很高兴API或库参考,任​​何人?

4 个答案:

答案 0 :(得分:1)

如果你想使用标准的日志库/机制,你可以在标准记录器周围生成自己的包装器,它将检查你是否记录的条件,并且只有在满足条件时才将信息传递给记录机制

或者你可以编写自己的(简单的,或许不是)记录器:)

答案 1 :(得分:0)

感谢。我已经考虑过了。
我希望有一些已经存在的东西,因为我认为这个问题在服务器端开发项目中很常见。

答案 2 :(得分:0)

吉利,我不确定开箱即用的这种情况。像Logback这样的良好日志记录实现将允许您为代码的每个部分定义记录器,然后配置每个记录器的日志记录级别(例如,默认情况下仅限WARN及以上消息,但对于Logger控制,则为INFO甚至FINE)您正在积极调试的区域)。

日志记录实现通常还可以管理多个日志文件,将当前日志转换为压缩归档版本,并定期或在日志文件变得过大时开始新的日志文件。

如果您控制代码,则可以修改日志记录语句,以免产生如此多的冗余警告。例如,如果您获得了大量的事务超时,也许您可​​以在完全放弃之前等待事务开始尝试之间的连续更长时间。 (这样做的好处是可以降低实现事务的服务器的负载,为他们提供恢复时间。)

zappan提到的另一种方法是创建自己的日志过滤器。在java.util.logging中,您可以将自己的过滤器附加到Filters以限制打印出来的内容。

更精细的过滤方法是将日志记录实现配置为在多播地址而不是文件上发送所有日志消息。您将编写一个过滤程序来侦听多播并有选择地将您想要的那些写入磁盘(例如,如果您有分布式系统,这可以在日志聚合服务器上运行)。其他过滤器可以提取最重要的消息并更新系统健康状况的图形显示。

答案 3 :(得分:0)

  

如何在Y秒内将程序日志打印输出限制为最多X个打印输出?

如果您有JavaMail 1.5.5 or logging-mailhandler 1.5.5的访问权限,则可以使用com.sun.mail.util.logging.DurationFilter来限制特定的java.util.logging.Loggerjava.util.logging.Handler

  

我正在寻找的是一种机制/ API,可以在y秒内将每个消息代码的打印输出调整为不超过x条消息。例如,在一分钟内,我不想生成并向日志写入超过10种类型的消息:"事务超时"。

如果超时消息仅对一个记录器是本地的,那么它与上面的相同。否则,您必须创建自定义过滤器。正如在其他答案中指出的那样,用其他过滤器组成过滤器并不困难。

另一种选择是创建代理处理程序,在将它们发布到其他下游处理程序之前,在给定时间窗口内缓冲并删除重复的消息。