暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MongoDB -- 屏蔽驱动频繁打印的日志

释福 2021-08-30
2103

背景

     使用MongoDB 时,客户端频繁打印 mongo-java-drivers 驱动中的 info 级诊断日志,对日常测试、生产活动中产生的问题定位有影响,需进行屏蔽处理。


1、分析

    mongo-java-drivers 的 jar 包中的com.mongodb.diagnostics.logging 包下:

    日志通常由 Logger 来输出。此包中,Logger 有两种实现:SLF4JLogger 和 JULLogger。其中:

    a. JULLogger 是 Java 自身的 java.util.logging.Logger

    b. SLF4JLoger 为更加流行的 org.slfj.logger


    二者的区别,请先自行去浏览器搜索了解。


    最终该使用哪个类,可观察 Logger 类中的内容,可见如下成员:

    其表示类加载时,先调用 shouldUseSLF4J() 方法。由方法可知,即为是否使用 SLF4J 作为 Logger 的实现,其具体方法内容代码如下:

    逻辑简易:若存在 SLF4J 的驱动就加载驱动,并返回 true,否则返回 false。

    最关键在于 getLogger 函数,代码如下:

    由此可知,若你使用了 SLF4J 驱动(Logback 或 Log4j),则使用 SLF4Logger,否则使用 Java 自带的 JULLogger。

    官方文档的说明,如下截图:

    查看源码发现, mongo-java-drivers 驱动中所有功能部件的日志都是同一个诊断类进行日志代理打印,这些功能部件都有用相同的根-- PREFIX(the root logger):

org.mongodb.driver。

    具体的功能部件有  cluster、connection、protocol、insert、update、delete、query、getmore、killcursor、command、uri。


2、解决 -- 屏蔽

    本人工作的开发项目中使用了 Log4j 作为 SLF4j 的实现,因此 mongo-java-drivers 使用的 Logger 是 SLF4JLogger。

    示例,若需屏蔽 cluster 中的 info 级诊断日志,只需调高该功能组件的日志级别。如:


在log4j日志的配置文件中,取消对应的日志名称的日志的输出:


注:

    mongo-java-drivers 的官方文档,有如下描述:


    以上是个人在工作中遇到的小问题,只需耐心看下源码即可,本不值得记录,但还是想以此来鞭策下自己,再耐心、细心点。


    若有不当之处,请大家批评指正,因为你的意见、建议是我前进路上的指示灯、警示灯,没有了你们,我可能会偏离轨道,滑向深坑...... 所以,若有不当、不爽之处敬请指出!

文章转载自释福,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论