`
seeallsea
  • 浏览: 41743 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

log4j重定向stdout和stderr到log文件

阅读更多

        我们使用apache log4j实现项目中的日志功能,在项目中我们通常有这样的需求,一般情况System.out.println()是输出到控制台,但我们希望System.out的输出也记录到log中,还有System.err同样也记录到log中,一些runtime的exception会通过System.err打出到控制台,我们同样希望把这些也都输出到log。在网上查了些参考之后,自己整理并实现了下面的方法。

        System类有setOut方法,可以设置output stream,进行output重定向,所以我们可以传入一个新的PrintStream对象,重写PrintStream的print方法,把要print的值都通过log4j写入到log,因此我们实现一个这样的类:

import java.io.PrintStream;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


public class StdOutErrRedirect {
	private final static Log logger = LogFactory.getLog(StdOutErrRedirect.class);

    public static void redirectSystemOutAndErrToLog() {
    	PrintStream printStreamForOut = createLoggingWrapper(System.out, false);
    	PrintStream printStreamForErr = createLoggingWrapper(System.out, true);
        System.setOut(printStreamForOut);
        System.setErr(printStreamForErr);
    }

    public static PrintStream createLoggingWrapper(final PrintStream printStream, final boolean isErr) {
        return new PrintStream(printStream) {
        	@Override
            public void print(final String string) {
        		if (!isErr){
        			logger.debug(string);
        		}else{
        			logger.error(string);
        		}
            }
        	@Override
            public void print(boolean b) {
        		if (!isErr){
        			logger.debug(Boolean.valueOf(b));
        		}else{
        			logger.error(Boolean.valueOf(b));
        		}
            }
        	@Override
            public void print(char c) {
        		if (!isErr){
            		logger.debug(Character.valueOf(c));
        		}else{
        			logger.error(Character.valueOf(c));
        		}
            }
        	@Override
            public void print(int i) {
        		if (!isErr){
        			logger.debug(String.valueOf(i));
        		}else{
        			logger.error(String.valueOf(i));
        		}
            }
        	@Override
            public void print(long l) {
        		if (!isErr){
        			logger.debug(String.valueOf(l));
        		}else{
        			logger.error(String.valueOf(l));
        		}
            }
        	@Override
            public void print(float f) {
        		if (!isErr){
        			logger.debug(String.valueOf(f));
        		}else{
        			logger.error(String.valueOf(f));
        		}
            }
        	@Override
            public void print(double d) {
        		if (!isErr){
            		logger.debug(String.valueOf(d));
        		}else{
        			logger.error(String.valueOf(d));
        		}
            }
        	@Override
            public void print(char[] x) {
        		if (!isErr){
            		logger.debug(x == null ? null : new String(x));
        		}else{
        			logger.error(x == null ? null : new String(x));
        		}
            }
        	@Override
            public void print(Object obj) {
        		if (!isErr){
        			logger.debug(obj);
        		}else{
        			logger.error(obj);
        		}
            }
        };
    }
}

 这个类里面我们重定向了System.out和Syste.err

 

如果是standalone的应用程序,我们可以在刚进入main方法的地方调用这个类的redirectSystemOutAndErrToLog()静态方法。

 

如果是web应用,我们可以实现一个servlet的listener,在初始化的时候调用这个类的redirectSystemOutAndErrToLog()静态方法。

例如:

 

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class StdOutErrInitializer implements ServletContextListener {

	@Override
	public void contextDestroyed(ServletContextEvent arg0) {

	}

	@Override
	public void contextInitialized(ServletContextEvent arg0) {
		StdOutErrRedirect.redirectSystemOutAndErrToLog();
	}

}

 然后在web.xml文件中注册这个listener

 

	<listener>
		<listener-class>com.polyvirtual.webapp.util.StdOutErrInitializer</listener-class>
	</listener>

 

log4j.xml的配置文件,举个例子可以简单的配置成这样:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                value="%p [%t] %c{1}.%M(%L) | %m%n"/>
        </layout>
    </appender>
    
    <appender name="FILE" class="org.apache.log4j.RollingFileAppender">  
		<param name="File" value="polyvirtual_logs/polyvirtual_portal.log"/>
		<param name="MaxFileSize" value="512KB" />
		<layout class="org.apache.log4j.PatternLayout">  
			<param name="ConversionPattern" value="%d - %c -%-4r [%t] %-5p %x - %m%n" />  
		</layout>  
	</appender>   

    <logger name="my.test">
        <level value="DEBUG"/>
    </logger>

    <root>
        <level value="WARN"/>
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </root>

</log4j:configuration>

 

这样System.out和System.err的输入都重定向写入到log文件里了,同时也输出到了Console,便于在IDE里开发时查看。

分享到:
评论

相关推荐

    Node.js检查stdout或stderr是否是交互式的

    一个重要的概念是理解`stdout`(标准输出)和`stderr`(标准错误)流,它们是Node.js中处理程序输出的主要方式。在某些情况下,你可能需要检查这些流是否是交互式的。比如,如果程序是在终端运行,用户可能期望能够...

    syslog-redirector:将 stdinstderr 重定向到 syslog

    一种静态编译工具,用于生成可执行文件,将其标准输出和标准错误重定向到 syslog。 静态编译很重要,至少在预期的 Helios/Docker 用例中,因为我们不想对容器的内容以及 libc 的可用性或位置做出任何假设。 具体来...

    一文学会重定向.zip

    4. **合并输出**:`&&gt;`或`&gt;&`操作符可以同时重定向stdout和stderr到同一个文件。例如,`command &&gt; combined_output.txt`会将命令的所有输出,包括正常输出和错误,都写入combined_output.txt。 5. **管道符**:`|`...

    linux中的重定向.pdf

    11. 当需要执行更复杂的I/O重定向时,可以结合使用管道("|")、重定向和文件描述符。例如,"cmd1 | cmd2 | cmd3 &gt; file"这条命令会先将cmd1的输出传递给cmd2,再将cmd2的输出传递给cmd3,并将最终的输出结果重定向...

    console-redirect:将控制台方法重定向到流

    例如,可用于将浏览器console重定向到process.stdout和process.stderr 。安装npm install console-redirect --save例子 var redirect = require ( 'console-redirect' )// redirect browser's console.log and ...

    如何使用输入、输出重定向.zip

    在计算机操作系统中,输入、输出重定向是一种强大的命令行工具,它允许用户将程序的输出(stdout)和错误输出(stderr)导向到文件或者从文件读取输入(stdin)。这在自动化任务、脚本编程以及调试过程中非常有用。...

    重定向程序设计

    4. **错误重定向**:可以单独重定向标准错误流,例如 `program 2&gt; error.log` 将错误信息写入 `error.log`。 5. **组合重定向**:使用 `&&gt;` 或 `&gt;&` 符号可以同时重定向标准输出和错误到同一个文件。 在编程语言中...

    alpine-apache-php:一个使用Alpine Linux的简单苗条的apachephp docker映像

    现在可以根据需要将日志文件重定向到STDOUT和STDERR,可以对其进行自定义以仅重定向访问日志或仅重定向错误日志,或者两者都不重定向。 可以通过设置LOG_CONF环境变量来完成,支持的值为: 价值 行为 全部 将访问...

    shell浅谈之八IO重定向.docx

    - `command &gt; file 2&gt;&1`:将命令的标准输出和错误输出都重定向到同一个文件。 - `command &lt; input.txt &gt; output.txt 2&gt; errors.log`:从 input.txt 输入,将命令的标准输出写入 output.txt,错误输出写入 errors....

    SHELL 输入与输出资料

    使用`&&gt;`可以同时重定向stdout和stderr到同一个文件,如`command &&gt; all_output.txt`。还可以使用`&gt;&gt;`追加模式,避免覆盖已有文件内容。 5. 管道(pipe): `|`字符允许将一个命令的stdout作为另一个命令的stdin...

    linux重定向和管道符

    4. **混合输出重定向**:通过`&&gt;`或`2&gt;&1`可以将标准输出和错误输出合并到同一个文件,如`ls /nonexistent_dir &&gt; all_output.txt`。 5. **输入重定向**:使用`或`将命令的输入源从键盘或其他来源更改。例如,`cat ...

    faketty:包装程序在pty中执行命令,即使重定向输出

    这允许(分别)记录一个进程的stdout和stderr,如果您没有记录任何内容,则输出不会与在终端上看到的输出不同。 $ cargo install faketty $ faketty bazel build :target &gt; log/out 2&gt; log/err ~~~~~~~~~~~~~~~~...

    14-1-RHEL7-Linux+输入输出重定向

    实现这一功能的操作符是“2&gt;”,例如,如果想要将某个命令的错误信息重定向到名为`error.log`的文件,可以使用`command 2&gt; error.log`。如果想要同时忽略标准输出和错误输出,可以使用`&&gt;/dev/null`;如果想要保留...

    linux的重定向命令应用及语法.docx

    标准输出(stdout)和标准错误(stderr)是命令执行时常见的两种输出。使用`&gt;` 符号可以将命令的输出重定向到指定文件,覆盖原有内容。例如: ```bash ls -l &gt; list ``` 上述命令会将当前目录的详细列表覆盖写入到...

    重定向工具的使用方法 ReadMet

    它允许用户将系统或应用程序的输出导向不同的地方,比如标准输出(stdout)和标准错误(stderr)可以被重定向到文件、设备或者其他的进程。本文将深入探讨重定向工具的使用方法,帮助你更好地理解和应用这一技术。 ...

    调试信息重定向

    3. **标准输出重定向**:在命令行环境下,可以将程序的stdout和stderr重定向到其他文件或设备,如`&gt; log.txt`。 4. **日志服务接口**:集成第三方日志服务,如Loggly、Sentry或ELK Stack(Elasticsearch、Logstash...

    详解python的几种标准输出重定向方式

    例如,可以临时替换`sys.stdout`为一个文件对象,从而将输出重定向到指定文件: ```python import sys # 创建一个临时的输出文件 temp_file = open("temp_output.txt", "w") # 替换标准输出 sys.stdout = temp_file...

    Linux下的输入/输出重定向.pdf

    4. `command 2&gt; error.log` 会将错误信息重定向到`error.log`。 5. `command 2&gt;&1` 将错误信息重定向到标准输出,通常用于合并标准输出和错误输出。 在某些情况下,可能希望将所有输出都丢弃,这时可以使用`/dev/...

    例程:将command的输入输出重定向到自己的进程

    这就需要用到I/O重定向,即将标准输入(stdin)、标准输出(stdout)和标准错误(stderr)的流向改变,使其不局限于屏幕或键盘。 **I/O重定向** 1. **标准输入(stdin)**:默认情况下,命令行从键盘接收输入。...

    按天切割tomcat的catalina.out日志(附cronolog安装包)

    catalina.out是tomcat把stdout和stderr重定向到文件后生成的日志文件,其生成是不受logging.properties 或 log4j.properties配置文件所影响的,需要另行安装工具(如cronolog或rotatelogs之类)进行处理。...

Global site tag (gtag.js) - Google Analytics