0

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

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

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

一方面,我确实希望看到上面的警告消息打印到 STDOUT,因为它表明出现了问题,特别是在调查生产中的问题时,但另一方面,打印许多行来讲述相同的故事在很短的时间内,没有附加价值,反而会影响性能并引入滚动盲区。

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

我很乐意提供 API 或库参考,有人吗?

4

4 回答 4

1

如果您想使用标准日志库/机制,您可以围绕标准记录器生成自己的包装器,该包装器将检查您的条件是否记录,并仅在满足条件时将信息传递给日志记录机制。

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

于 2009-06-12T13:10:24.530 回答
0

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

于 2009-06-16T21:58:02.590 回答
0

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

日志实现通常还可以管理多个日志文件,将当前日志滚动到压缩存档版本中,并定期或在日志文件变得太大时启动新的日志文件。

如果您可以控制代码,则可以修改日志记录语句以不生成太多冗余警告。例如,如果您遇到很多事务超时,也许您可​​以在事务开始尝试之间连续等待更长的时间,然后再完全放弃。(这样做的好处是可以减轻执行事务的服务器上的负载,让它们有时间恢复。)

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

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

于 2009-06-16T22:18:34.607 回答
0

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

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

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

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

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

于 2015-12-18T15:56:58.370 回答