随笔-26  评论-111  文章-19  trackbacks-0
        一般情况下,在记录日志时,只能把通过API进行记录的信息写入自定义的日志文件,其余的信息就无法被写入了.

       解决的办法就是重写System.out和System.err,让System.out,System.err的写入转向到你的日志文件,这样只要在控制台的所有的输出信息都会被记录到日志文件中.

      例如可以在系统进行初始化时进行这样的操作:

      重写System.out:
              PrintStream printStreamOut = new PrintStream(outputStreamOut);
              System.setOut(printStreamOut);
     
      重写System.err
              PrintStream printStreamErr = new PrintStream(outputStreamErr);
              System.setErr(printStreamErr);


      这里的outputStreamOut,和outputStreamErr都是自定义的重定向的日志文件的OutputStream


      现在重定向输出的问题解决了,可以又出现了一个新的问题: 在控制台上看不到任何输出信息,输出的信息全部被定向到日志文件中.

       要解决这个问题还需要自己实现一个OutputStream,让OutputStream能同时写入多个输出.

       首先继承java.io.OutputStream,然后实现public abstract void write(int b) throws IOException; 并且覆写java.io.OutputStream中的其他的方法,具体的实现方式按照自己的需求来做,这里就不做出具体的实现了.

       通过实现自己实现OutputStream之后,
      在
           PrintStream printStreamOut = new PrintStream(outputStreamOut);
           PrintStream printStreamErr = new PrintStream(outputStreamErr);
      中分别把outputStreamOut和outputStreamErr对象换成自己实现的OutputStream对象,这样就可以实现在一个OutputStream对象中进行多个输出操作.

      按照以上的思路进行的实现,可以完全把控制台的所有的输出写入到日志文件中,包括System.out.println这样的输出.

               snoics
posted on 2006-03-03 09:10 snoics 阅读(3833) 评论(7)  编辑  收藏 所属分类: 学习 . 感悟

评论:
# re: 捕获控制台的所有输出信息 2006-03-03 09:46 | 乾为天
为什么不用log4j?  回复  更多评论
  
# re: 捕获控制台的所有输出信息 2006-03-03 09:51 | snoics
用log4j也只能写入通过log4j的api进行记录的日志
如果在程序中有这样一段Integer.parseInt("jfdklsjfdkf");
而且没有去catch这个错误,并且用log4j去写入日志,则这段的出错信息是不会被写入日志的,只会在控制太输出,除非程序是用容器执行,而且是类似jboss这样的,才会被记录到jboss自己的系统日志里面  回复  更多评论
  
# re: 捕获控制台的所有输出信息 2006-03-03 10:14 | snoics
偏题了吧......这里说的不是该用哪种日志的问题,而且这个思路和log4j并不冲突,甚至可以说是一种补充的方式,可以把log4j捕捉不到的输出信息也都给记录下来  回复  更多评论
  
# re: 捕获控制台的所有输出信息 2006-03-03 15:40 | lizongbo
tomcat通过配置 context的 swallowOutput="true" 就可以将 system.out和err的输出转到servlet的logger中,不过还没读过tomcat相关的src,有空可以看看它是怎么做的:)


http://tomcat.apache.org/tomcat-5.5-doc/catalina/docs/api/org/apache/catalina/Context.html#setSwallowOutput(boolean)

  回复  更多评论
  
# re: 捕获控制台的所有输出信息 2006-03-05 00:43 | netpirate
程序中的Exception/Error与Log可以分开处理,前者控制台输出,后者输出到文件。
:)  回复  更多评论
  
# re: 捕获控制台的所有输出信息 2006-03-05 00:44 | netpirate
程序中的Exception/Error与Log可以分开处理,前者控制台输出,后者输出到文件。
:)  回复  更多评论
  
# re: 捕获控制台的所有输出信息 2006-03-05 15:43 | snoics
你说的都是使用WEB容器的情况下,使用的是容器的支持功能,如果是普通的JAVA应用程序,不需要使用容器的情况,这样的说法就行不通了  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问