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

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

初始化时调用:

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

spring代码异常捕获到logback logging.config=logback-spring.xml文件中不能输出异常e.printStackTrace的更多相关文章

  1. Spring MVC框架下在java代码中访问applicationContext.xml文件中配置的文件(可以用于读取配置文件内容)

    <bean id="propertyConfigurer" class="com.****.framework.core.SpringPropertiesUtil& ...

  2. 事务配置在applicationContext.xml文件中不起作用,控制不了异常回滚

    一.博主在学习到整合ssm框架的时候,遇到一个奇葩的问题就是将 事务的控制 ,写在在applicationContext.xml文件中不起作用,在事务控制的方法中,即使出现了异常,但是事务不会回滚的坑 ...

  3. 死磕Spring之IoC篇 - BeanDefinition 的加载阶段(XML 文件)

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...

  4. Android中通过代码获取arrays.xml文件中的数据

    android工程res/valuse文件夹下的arrays.xml文件中用于放各种数组数据,比如字符串数组.整型数组等,数组中的数据可能是具体的值,也有可能是对资源数据的引用,下面针对这两种情况通过 ...

  5. web.xml 文件中一般包括 servlet, spring, filter, listenr的配置的加载顺序

    首先可以肯定 加载顺序与他们在web.xml 文件中的先后顺序无关. web.xml 中 listener 和 serverlet 的加载顺序为 先 listener 后serverlet最终得出结果 ...

  6. 当你的Spring IOC 容器(即applicationContext.xml文件)忘记配到web.xml 文件中时

    当你的Spring IOC 容器忘记配到web.xml 文件中时,启动服务器就会报错. 部分错误如下: Caused by: org.springframework.beans.factory.NoS ...

  7. Spring 在xml文件中配置Bean

    Spring容器是一个大工厂,负责创建.管理所有的Bean. Spring容器支持2种格式的配置文件:xml文件.properties文件,最常用的是xml文件. Bean在xml文件中的配置 < ...

  8. spring将service添加事务管理,在applicationContext.xml文件中的设置

    在applicationContext.xml文件中的设置为: <beans> <bean id="sessionFactory" class="org ...

  9. Spring MVC静态资源处理(在applicationContex.xml文件中进行配置)

    优雅REST风格的资源URL不希望带 .html 或 .do 等后缀.由于早期的Spring MVC不能很好地处理静态资源,所以在web.xml中配置DispatcherServlet的请求映射,往往 ...

随机推荐

  1. Azure系列2.1.6 —— BlobProperties

    (小弟自学Azure,文中有不正确之处,请路过各位大神指正.) 网上azure的资料较少,尤其是API,全是英文的,中文资料更是少之又少.这次由于公司项目需要使用Azure,所以对Azure的一些学习 ...

  2. 在Laravel中使用数据库事务以及捕获事务失败后的异常

    Description 在Laravel中要想在数据库事务中运行一组操作,则可以在 DB facade 中使用 transaction 方法.如果在事务的闭包内抛出异常,事务将会被自动还原.如果闭包运 ...

  3. python爬虫之Splash使用初体验

    Splash是什么: Splash是一个Javascript渲染服务.它是一个实现了HTTP API的轻量级浏览器,Splash是用Python实现的,同时使用Twisted和QT.Twisted(Q ...

  4. Django的一些操作与视图函数

    一 . Django的安装 pip install django==1.14.6 # 后面的数字是django的版本 二 .  通过命令行(cmd)来创建Django项目 1. 切换到保存项目的文件夹 ...

  5. Partition算法以及其应用详解上(Golang实现)

    最近像在看闲书一样在看一本<啊哈!算法> 当时在amazon上面闲逛挑书,看到巨多人推荐这本算法书,说深入浅出简单易懂便买来阅读.实际上作者描述算法的能力的确令人佩服.就当复习常用算法吧. ...

  6. 在windows 7上安装TensorFlow

    TensorFlow是一个开源软件库,用于各种感知和语言理解任务的机器学习.目前被50个团队用于研究和生产许多Google商业产品,如语音识别.Gmail.Google 相册和搜索,其中许多产品曾使用 ...

  7. 死锁问题分析(个人认为重点讲到了gap间隙锁,解决了我一些不明报死锁的问题)

    线上某服务时不时报出如下异常(大约一天二十多次):“Deadlock found when trying to get lock;”. Oh, My God! 是死锁问题.尽管报错不多,对性能目前看来 ...

  8. 版本控制Git使用最佳实践

    总结版本控制Git的使用,应明确有哪些具体的场景 应用场景  紧急上线(hotfix)  功能开发(feature)  测试(dev/release)  生产(master) 紧急上线 4.git c ...

  9. 四、docker compose

    docker compose可以方便我们快捷高效地管理容器的启动.停止以及重启等操作,和批量管理容器,它类似于linux下的shell脚本,基于yaml语法,在该文件里我们可以描述应用的架构,比如用什 ...

  10. 三、kubernetes环境搭建(实践)

    一.目前近况 docker 版本 K8S支持 18.06的 二.安装docker #1.配置仓库 sudo yum install -y yum-utils device-mapper-persist ...