如何仅记录一次重复的警告

2022-09-02 22:32:21

有一种模式时不时地发生。我有一个调用多次的方法,它包含以下代码段:

Foo foo = getConfiguredFoo();
if (foo == null) {
  logger.warn("Foo not configured");
  foo = getDefaultFoo();
}

然后我的日志文件被这个警告弄乱了一百次。我知道我可以解决,但我想知道是否有更好的方法只看到一次这个警告。grep

注意:默认情况下,消息的重复是正确的行为,因此这不是为了避免无意的重复日志消息。我把我的问题标记为log4j,但我对其他java日志记录框架持开放态度。


答案 1

以下是我能想到的:一个累积警告的类,可以在最后转储。它很时髦,但你可以明白这一点。当然,倾倒部分可以定制为使用记录器。

class BadNews {
  static Map<String,List<Object>> warnings = [:];

  static void warn(String key, Object uniqueStuff) {
    def knownWarnings = warnings[key]
    if (! knownWarnings) {
      knownWarnings = []
      warnings[key] = knownWarnings
    }
    knownWarnings << uniqueStuff
  }

  static void dumpWarnings(PrintStream out) {
    warnings.each{key, stuffs ->
      out.println("$key: " + stuffs.size())
      stuffs.each{
        out.println("\t$it")
      }
    }
  }
}

class SomewhereElse {
  def foo(Bar bar) {
    if (! bar)
      BadNews.warn("Empty bar", this)
  }
}

答案 2

我前段时间遇到了类似的问题,但在Log4J中找不到任何处理这个问题的方法。我最终做了以下工作:

Foo foo = getConfiguredFoo();
if (foo == null) {
  if(!warningLogged)logger.warn("Foo not configured");
  warningLogged = true
  foo = getDefaultFoo();
}

如果您有一个或两个日志语句,您不希望在日志中看到重复,但不能使用更多日志语句进行扩展,则可以使用此解决方案(对于记录的每条消息,都需要一个布尔值)


推荐