在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();