如何防止使用logback进行日志轰炸?

Ali*_*aka 5 java logging logback slf4j

我不确定“轰炸”一词是否正确。轰炸是指同一内容(消息和参数)多次记录。

例如,拒绝服务附加可能会导致日志警告,表明未经身份验证的用户正在尝试访问某些API。日志:

[03-29 11:26:01.000] missing token
[03-29 11:26:01.001] missing token
[03-29 11:26:01.005] missing token
... overall 100000 times
Run Code Online (Sandbox Code Playgroud)

我要解决的问题是防止日志过大。大小是个问题。另外,由于重复消息的数量过多,可能看不到其他重要消息。

我希望能够防止此类日志爆炸,并提供一些汇总消息,例如:

[03-29 11:26:01.000] missing token
[03-29 11:26:06.000] missing token [silenced. Overall 100000 times]
Run Code Online (Sandbox Code Playgroud)

因此,我在这里寻找2个功能:

  1. 沉默过于重复的日志。
  2. 表现出沉默的日志的总结。

是否知道如何以及如何使用logback做到这一点?也许另一个日志记录工具可以支持这一点?谢谢。

ton*_*y19 7

DuplicateMessageFilter,过滤掉确切重复的消息,可能适合你的第一个要求。目前,过滤器在指定阈值(通过设置)之后停止所有重复消息allowedRepititions,这可能是不可取的。如果您希望根据新消息或基于 time重置重复计数,则必须扩展过滤器。但是,它不提供静默日志的摘要。

示例登录配置:

<configuration>

  <turboFilter class="ch.qos.logback.classic.turbo.DuplicateMessageFilter" allowedRepetitions="2"/>

  <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%date [%thread] %-5level %logger - %msg%n</pattern>
    </encoder>
  </appender>

  <root level="INFO">
    <appender-ref ref="console" />
  </root>  
</configuration>
Run Code Online (Sandbox Code Playgroud)

  • 我刚刚在[github](https://github.com/qos-ch/logback/blob/master/logback-classic/src/main/java/ch/qos/logback/classic)上快速检查了`DuplicateMessageFilter`的来源/turbo/DuplicateMessageFilter.java) 并且找不到有关时间范围的任何信息。因此,在我看来,它只会在达到阈值后丢弃所有消息。OP 应提供基于此过滤器的自定义实现。还有 [a similar filter](http://logback.10977.n7.nabble.com/DuplicateMessageFilter-time-based-duplication-td13059.html) 使用 Guava 和基于时间的驱逐作为缓存实现。 (3认同)