java - 忽略记录第三方库的重复异常消息

标签 java logging apache-kafka slf4j logback

我需要处理日志中特定异常的重复。

我使用 slf4j 和 logback 登录我的应用程序。我使用一些外部服务(DB、apache kafka、第三方库等)。当与此类服务的连接丢失时,我会遇到异常,例如

[kafka-producer-network-thread | producer-1] WARN  o.a.kafka.common.network.Selector - Error in I/O with localhost/127.0.0.1
java.net.ConnectException: Connection refused: no further information
    at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) ~[na:1.8.0_45]
    at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717) ~[na:1.8.0_45]
    at org.apache.kafka.common.network.Selector.poll(Selector.java:238) ~[kafka-clients-0.8.2.0.jar:na]
    at org.apache.kafka.clients.NetworkClient.poll(NetworkClient.java:192) [kafka-clients-0.8.2.0.jar:na]
    at org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:191) [kafka-clients-0.8.2.0.jar:na]
    at org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:122) [kafka-clients-0.8.2.0.jar:na]
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_45]

问题是我每秒都会收到这条消息。此异常消息将淹没我的日志文件,因此我将在 N 小时内在日志文件中拥有几 GB。

我希望每 1-5 分钟收到一次关于此异常的日志消息。有什么方法可以忽略日志文件中重复的异常吗?

可能的解决方案:

  1. 忽略特定包和类的所有日志。 [糟糕,因为我可以跳过重要消息]

  2. 使用 http://logback.qos.ch/manual/filters.html#DuplicateMessageFilter [不好,因为我只能设置属性 AllowedRepetitions 或 CacheSize。它会匹配所有消息,但我只需要特定的异常(exception)]

  3. 编写自定义过滤器 也许,您知道已经实现的解决方案?

最佳答案

我认为您最好的选择是简单地扩展 DuplicateMessageFilter你已经找到了。它不是最终版本,而且相当容易:

  1. 使用基于类名或异常类型或任何其他您希望根据其做出初始决定的过滤器方法实现新的 TurboFilter

  2. 然后委托(delegate)给父类进行口是心非的检查

可用的参数:

public FilterReply decide(Marker marker, Logger logger, Level level,
  String format, Object[] params, Throwable t) {

包括 ThrowableLogger

关于java - 忽略记录第三方库的重复异常消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34531534/

相关文章:

elasticsearch - 是否可以为 Elasticsearch 维护从 FileBeat 到 LogStash 的索引名称?

javascript - 登录函数作用域,还有this。 TypeError : custLog(. ..).bind 不是函数

java - 是否可以将二进制文件(比如 .mp3 文件)作为单个消息放入 Kafka 中?如果是,如何?

apache-kafka - 卡夫卡排序保证

Java Greenfoot,无法在文件之间链接方法

java - 使用 java 电子邮件的日历事件

java - OffsetDateTime 时间正在改变时区偏移

java - 使用 Camel Rest 时如何记录请求负载?

java - Apache Kafka 客户端什么时候抛出 "Batch Expired"异常?

java - 在声明后填充数组成员