2

我想构建一个 Appender(或类似的东西)来检查事件并在某些条件下创建日志新事件。

一个例子是 Escalating Appender,它检查是否记录了一定数量的相同事件,如果是,则使用更高的日志级别记录事件。因此,您可以定义如下内容:如果您在此记录器上收到超过 10 个相同的警告,则将其设为错误。

所以我的问题是:

  1. 这样的东西已经存在了吗?

  2. Appender 是实现此行为的正确类吗?

  3. 有没有你认为我应该注意的陷阱?

澄清:我对收集和分析事件的算法很好。我将在 appender 中使用一个集合来做到这一点。我的目的不需要坚持不懈。我的问题 #2 是:appender 是否适合这样做?毕竟,为 appender 创建日志条目是不正常的行为。

4

3 回答 3

2

Appender您可以通过实现log4j 提供的接口来创建自己的 appender 。

http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/Appender.html

那将是一种方法。另一种方法是使用现有的附加程序,然后编写一些监视日志的代码。例如,您可以登录到数据库,然后编写一个进程来监视数据库中的日志条目并根据它看到的内容创建元事件。

这主要取决于您对什么感到满意。您必须处理的一个问题是如何回顾日志以创建您的元事件。您要么必须在 appender 中累积事件,要么将它们保存在您可以查询以构建元事件的地方。累积它们的问题是,如果您停止并启动您的流程,您要么必须将它们转储到某个地方以便它们被拾取,要么在流程重新启动时重新开始。

例如,假设我想每 10 次NullPointerException抛出 a 就创建一个日志条目。如果我在某种数据库中有日志条目,那么每次抛出 NPE 时,我都会运行一个查询来查看自上次为它们创建日志条目以来已经抛出了多少 NPE。如果每次抛出一个时我只在内存中计算它们,如果在抛出 5 个后重新启动应用程序,如果我不坚持这个数字,我将失去计数。

于 2009-07-30T17:02:34.703 回答
1

Logback(log4j 的继任者)将允许您通过 TurboFilters 为任何事件启用日志记录。例如,假设同一事件在给定时间范围内发生 N 次或多次,您可以强制接受该事件(无论其级别如何)。另请参阅 DuplicateMessageFilter,它执行相反的操作(拒绝重新发生的事件)。

然而,即使是 logback,也不允许增加日志事件的级别。Log4j 也不会。这两个框架都不是为此而设计的,我不鼓励您尝试在同一线程中动态增加级别。另一方面,在后期处理期间增加级别是完全不同的事情。向另一个线程发出信号以生成具有更高级别的新日志记录事件是另一种可能性。(让您的 turbo-filter 向另一个线程发送信号以生成更高级别的新日志事件。)

从您的问题中不清楚您为什么希望增加级别。级别的增加本身是一个原因还是它是实现目标的一种手段,即无论其级别如何都记录事件。如果是后者,那么 logback 的 TurboFilters 就是要走的路。

高温下,

于 2009-07-31T09:45:57.087 回答
0

正如 Rafe 已经指出的那样,最大的挑战是将实际事件持久保存在 中Appender,以便您知道触发事件的时机已经到来(例如升级日志级别)。

因此,我提出以下策略:

  1. 使用自定义 JDBCAppender。与与 Log4j 捆绑的那个不同,这个可以记录异常。
  2. 设置一个嵌入式数据库,如HSQLDB,并设置一个包含一个用于事件记录的表的数据库。它解决了持久性问题,因为您可以使用 SQL 查找发生的事件类型。
  3. 运行一个单独的线程来监视数据库并检测所需的事件模式。
  4. 使用LogManager访问所需的Logger并手动设置其级别。
于 2009-07-30T21:11:26.183 回答