开发者社区> 问答> 正文

应用不打日志问题跟进

问题

某个应用 升级二方包之后,无法打印日志

展开
收起
君浩 2020-03-31 00:18:33 2038 0
1 条回答
写回答
取消 提交回答
  • 开发

    排查过程

    • debug 日志,发现本地代码和服务器代码不一致
    • debug 启动了demo代码,发现slf4j启动时会绑定 log的时效,如果发现多个会打日志
    • 发现启动日志中,打印错误,绑定了多个日志
    SLF4J: Class path contains multiple SLF4J bindings.
    SLF4J: Found binding in [jar:file:/WEB-INF/lib/logback-classic-1.2.3.9-struct.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: Found binding in [jar:file:r.war/WEB-INF/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: Found binding in [jar:file:twar/WEB-INF/lib/slf4j-nop-1.7.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
    SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
    
    • 询问后得知,目前应用是用log4j 配置的,那么读取logback就是有问题的
    • 找到 logback-classic-1.2.3.9-struct.jar!/org/slf4j/impl/StaticLoggerBinder.class 的所有引入应用,发现forest 引进了
    • forest exclude这个依赖

    能力沉淀

    • 遇到问题应该先谷歌的
    • 不打印日志通常两个原因

      • slf4j 找错了实现:可以通过日志查看“binding”关键字解决
      • log4j 或 logback 找错了配置文件:可以通过日志查看”加载的日志文件“解决
    • log4j 使用

      • Logger logger = Logger.getLogger();
      • logger.info("xxx");
    • log4j 流程

      • LogManager 的static 代码块加载 log4j.xml 配置
      • LogManager 根据入参构造一个Logger对象
      • Logger 对象遍历其中的appender进行打印

      • slf4j 使用

      • Logger logger = LoggerFactory.getLogger();
      • logger.info("xxx");
    • slf4j 原理
      • StaticLoggerBinder.getSingleton().getLoggerFactory() 获取 LoggerFactory
        • LoggerFactory 由 slf4j-log4j 这个依赖提供
      • 接下来的流程和 log4j 一样
    2020-03-31 00:19:26
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
PostgresChina2018_赖思超_PostgreSQL10_hash索引的WAL日志修改版final 立即下载
Kubernetes下日志实时采集、存储与计算实践 立即下载
日志数据采集与分析对接 立即下载