背景
老代碼中有一些使用e.printStackTrace(),System.err和System.out來打印日志稍刀,在logback的日志文件中沒有輸出撩独,導(dǎo)致產(chǎn)生異常找不到原因。
解決方案
- 替換掉不合理的日志打印方式,通過slf4j處理
- e.printStackTrace()換成log.error("產(chǎn)生異常的參數(shù)",e)
其實跌榔,上面說的都說廢話异雁。。僧须。如果替換起來容易的話纲刀,誰還會看到這個文章?
下面開始說重點了担平,我們的臨時替代方案示绊,把System.out和System.err的日志通過log來輸出,不就完美解決了嗎暂论。核心方法面褐,通過System.setOut(PrintStream)
來改變原來的print動作。
@Configuration
public class LogSystemProxy {
private final static Logger log = LoggerFactory.getLogger("proxy.system.log");
@PostConstruct
public void initProxy(){
log.debug("LogSystemProxy init .....");
System.setOut(getLoggerProxy(StdType.OUT));
System.setErr(getLoggerProxy(StdType.ERR));
}
private enum StdType{
OUT(System.out, log::info),
ERR(System.err, log::error),
;
PrintStream stream;
Consumer<String> consumer;
StdType(PrintStream stream,Consumer<String> consumer){
this.stream = stream;
this.consumer = consumer;
}
}
private PrintStream getLoggerProxy(StdType stdType){
return new PrintStream(stdType.stream){
@Override
public void print(String s) {
stdType.stream.print(s);
stdType.consumer.accept(s);
}
};
}
}
如果日志配置文件中日志有root是通過ConsoleAppender
輸出的話取胎,記得要做排除
<logger name="proxy.system.log" additivity="false">
<appender-ref ref="fileAppender" />
</logger>