如何只记录一次重复警告

Ada*_*deg 15 java logging warnings log4j

有一种模式偶尔会发生.我有一个多次调用的方法,它包含以下代码段:

Foo foo = getConfiguredFoo();
if (foo == null) {
  logger.warn("Foo not configured");
  foo = getDefaultFoo();
}
Run Code Online (Sandbox Code Playgroud)

然后我的日志文件被这个警告混乱了一百次.我知道我可以grep把它拿出来,但我想知道是否有更好的方法只能看到这个警告一次.

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

Ada*_*deg 4

这是我能想到的:一个累积警告的类,可以在最后转储这些警告。这是很常规的,但你可以明白要点。当然,可以自定义转储部分以使用记录器。

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)
  }
}
Run Code Online (Sandbox Code Playgroud)