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

一个例子是Escalating Appender,用于检查是否记录了一定数量的相同事件,如果是,则记录具有更高logleve的事件。因此,您可以定义类似的内容:如果您在此记录器上获得超过10个相同的警告,请将其设置为错误。

所以我的问题是:

  1. 这样的事情是否已经存在?

  2. Appender是否是实现此行为的合适类?

  3. 你有什么陷阱可以想到我应该留意吗?

  4. 澄清: 我很喜欢收集和分析事件的算法。我会用appender中的一个集合来做到这一点。为了我的目的,持久性不是必需的。我的问题#2是:这是一个正确的地方吗?毕竟,为appender创建日志记录条目不是正常行为。

有帮助吗?

解决方案

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

但是,即使logback也不允许增加日志记录事件的级别。 Log4j也不会。这两个框架都不是为此而设计的,我不鼓励您尝试在运行中递增并在同一个线程内。另一方面,在后处理期间递增水平是完全不同的事情。发信号通知另一个线程以生成具有更高级别的 new 日志记录事件是另一种可能性。 (让您的turbo过滤器发出另一个线程信号,以生成更高级别的 new 日志记录事件。)

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

HTH,

其他提示

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

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

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

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

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

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

因此,我提出以下策略:

  1. 使用自定义JDBCAppender 。与Log4j捆绑的不同,这个可以记录异常。
  2. 设置嵌入式数据库,例如 HSQLDB ,并使用一个表设置数据库以进行事件记录。它解决了持久性问题,因为您可以使用SQL查找发生的事件类型。
  3. 运行一个监视数据库的单独线程,并检测所需的事件模式。
  4. 使用 LogManager 访问需要记录器并手动设置他们的级别
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top