spring代码异常捕获到logback logging.config=logback

在spring中使用logging.config=logback-spring.xml将日志转存到了文件中。但是代码中的捕获的异常无法用 e.printStackTrace 打印到文件中。使用如下方法打印:

1main: 2catch(Exception e){ 3log.error("xxx",e); 4}这里可以重新定向 system.out 和err的输出,到logback:https://stackoverflow.com/questions/1200175/log4j-redirect-stdout-to-dailyrollingfileappender用于捕获运行时异常。 5 6package com.italktv.platform.audioDist; 7 8import java.io.IOException; 9import java.io.OutputStream; 10import java.io.PrintStream; 11 12import org.apache.log4j.Level; 13import org.apache.log4j.Logger; 14 15public class Log4jStdOutErrProxy { 16 17 public static void bind() { 18 bind(Logger.getLogger("STDOUT"), Logger.getLogger("STDERR")); 19 } 20 21 @SuppressWarnings("resource") 22 public static void bind(Logger loggerOut, Logger loggerErr) { 23// System.setOut(new PrintStream(new LoggerStream(loggerOut, Level.INFO, System.out), true)); 24 System.setErr(new PrintStream(new LoggerStream(loggerErr, Level.ERROR, System.err), true)); 25 } 26 27 private static class LoggerStream extends OutputStream { 28 private final Logger logger; 29 private final Level logLevel; 30 private final OutputStream outputStream; 31 private StringBuilder sbBuffer; 32 33 public LoggerStream(Logger logger, Level logLevel, OutputStream outputStream) { 34 this.logger = logger; 35 this.logLevel = logLevel; 36 this.outputStream = outputStream; 37 sbBuffer = new StringBuilder(); 38 } 39 40 @Override 41 public void write(byte[] b) throws IOException { 42 doWrite(new String(b)); 43 } 44 45 @Override 46 public void write(byte[] b, int off, int len) throws IOException { 47 doWrite(new String(b, off, len)); 48 } 49 50 @Override 51 public void write(int b) throws IOException { 52 doWrite(String.valueOf((char) b)); 53 } 54 55 private void doWrite(String str) throws IOException { 56 sbBuffer.append(str); 57 if (sbBuffer.charAt(sbBuffer.length() - 1) == '\n') { 58 // The output is ready 59 sbBuffer.setLength(sbBuffer.length() - 1); // remove '\n' 60 if (sbBuffer.charAt(sbBuffer.length() - 1) == '\r') { 61 sbBuffer.setLength(sbBuffer.length() - 1); // remove '\r' 62 } 63 String buf = sbBuffer.toString(); 64 sbBuffer.setLength(0); 65 outputStream.write(buf.getBytes()); 66 outputStream.write('\n'); 67 logger.log(logLevel, buf); 68 } 69 } 70 } // inner class LoggerStream 71 72}

初始化时调用:

// initialize logging to go to rolling log file
LogManager.resetConfiguration();

// and output on the original stdout
System.out.println("Hello on old stdout");
Log4jStdOutErrProxy.bind();

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )