buguge - Keep it simple,stupid

知识就是力量,但更重要的,是运用知识的能力why buguge?

导航

< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

统计

程序打印的日志哪里去了?结合slf4j来谈谈面向接口编程的重要性

 

回到顶部

1.1 两个工程:

umf-pay-sdk

|---umf-pay-sdk-core

|--umf-pay-demo

这个工程用来对接联动的支付接口,依赖log4j来打印日志。  其中,umf-pay-sdk-core是一个module,编译后会打成jar;umf-pay-demo是测试主程序,用来测试ymf-pay-sdk-core的api。

draft_server

是一个应用,使用的日志框架是log4j2。它依赖很多jar,其中就包括上面的umf-pay-sdk-core

 

回到顶部

1.2 umf-pay-sdk-core记日志的方式是用log4j。并定义了log4j.properties。

log实例的声明:
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
private static final Logger log = LogManager.getLogger("UMF");
log4j.properties,指定了日志文件名UMF.log:
复制代码
########################################################
#    for Log4j/Logger4
########################################################
log4j.rootCategory=INFO, stdout,UMF
log4j.category.com.umpay.sign=INFO,UMF
log4j.additivity.com.umpay.sign=true


log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[UMF]%d{yyyyMMdd.HHmmss.SSS} %p [%t] %c{1}.%M(%L) | %m%n

########################
# Daily Rolling File Appender
#######################
log4j.appender.UMF=org.apache.log4j.DailyRollingFileAppender
log4j.appender.UMF.File        =UMF.log
log4j.appender.UMF.DatePattern    ='.'yyyyMMdd
log4j.appender.UMF.layout    =org.apache.log4j.PatternLayout
log4j.appender.UMF.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss.SSS}],%m%n
复制代码

 

测试环境运行draft_server,在测试联动支付时出现bug,只得通过日志来问诊了,可是在测试环境找不到UMF.log文件。

 

后来,本地排查时,发现并不是没有记日志,而是,日志记录在了一个叫jeewxApi.log的文件里了。why?

原来,Ctrl+Shift+N查找log4j.properties文件时,发现找到了2个:一个在jeewx-api.jar里,一个在umf-pay-sdk-core.jar里。其中,jeewx-api.jar的log4j.properties定义如下。

复制代码
log4j.rootLogger=info,A1,R
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.Target=System.out
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=[%c]%m%n

log4j.appender.R=org.apache.log4j.RollingFileAppender 
log4j.appender.R.File=../jeewxApi.log
log4j.appender.R.MaxFileSize=10MB
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c]%m%n
View Code
复制代码

看来,log4j先扫描到了jeewx-api下log4j.properties,就读取这个配置文件来记日志了。为了印证,删掉jeewx-api下的log4j.properties文件,果然,UMF.log就出现了。

 

如果把两个jar里的log4j.properties都删掉呢?

此时,会有下面的告警日志,意思是:找不到相应的appender,那么,自然就不会记日志了。

log4j:WARN No appenders could be found for logger (UMF).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

 

跟一个技术嗅觉灵敏的90后小伙沟通,认为umf-pay-sdk-core里用log4j来记录日志实为不妥。最好使用slf4j。这样的话,它会找主程序依赖的日志框架。即日志会统一记录在draft_server程序所配置的log4j2的日志文件里。日志统一记录,利于我们排查问题。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger log =  LoggerFactory.getLogger("UMF");

 

这也就是面向接口编程的重要性。优秀的开源组件或工具包,在声明日志对象时,都会使用slf4j,诸如lombok。我们看slf4j的介绍文字:

 

posted on   buguge  阅读(820)  评论(0编辑  收藏  举报

编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示