美文网首页
解决logback不能输出e.printStackTrace()

解决logback不能输出e.printStackTrace()

作者: 七岁能杀猪 | 来源:发表于2021-07-01 13:58 被阅读0次

    背景

    老代码中有一些使用e.printStackTrace(),System.err和System.out来打印日志,在logback的日志文件中没有输出,导致产生异常找不到原因。

    解决方案

    1. 替换掉不合理的日志打印方式,通过slf4j处理
    2. e.printStackTrace()换成log.error("产生异常的参数",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>
    

    相关文章

      网友评论

          本文标题:解决logback不能输出e.printStackTrace()

          本文链接:https://www.haomeiwen.com/subject/zapjultx.html