首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >log4j将标准输出重定向到DailyRollingFileAppender

log4j将标准输出重定向到DailyRollingFileAppender
EN

Stack Overflow用户
提问于 2009-07-29 13:15:46
回答 9查看 93.1K关注 0票数 71

我有一个使用log4j的java应用程序。

配置:

代码语言:javascript
复制
log4j.rootLogger=info, file

log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File=${user.home}/logs/app.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d [%t] %c %p %m%n

因此,所有的日志语句都被正确地附加到文件中,但是我丢失了stdout和stderr。如何将异常堆栈跟踪和系统重定向到每日滚动的文件?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-09-02 20:51:49

代码语言:javascript
复制
// I set up a ConsoleAppender in Log4J to format Stdout/Stderr
log4j.rootLogger=DEBUG, CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[%t] %-5p %c - %m%n


// And I call this StdOutErrLog.tieSystemOutAndErrToLog() on startup

public class StdOutErrLog {

    private static final Logger logger = Logger.getLogger(StdOutErrLog.class);

    public static void tieSystemOutAndErrToLog() {
        System.setOut(createLoggingProxy(System.out));
        System.setErr(createLoggingProxy(System.err));
    }

    public static PrintStream createLoggingProxy(final PrintStream realPrintStream) {
        return new PrintStream(realPrintStream) {
            public void print(final String string) {
                realPrintStream.print(string);
                logger.info(string);
            }
        };
    }
}
票数 108
EN

Stack Overflow用户

发布于 2011-09-20 09:20:25

我从Michael S那里获得了这个想法,但就像在一条评论中提到的那样,它有一些问题:它不能捕获所有内容,并且会打印一些空行。

此外,我还希望将System.outSystem.err分开,以便System.out使用日志级别'INFO'进行记录,而System.err使用'ERROR' (如果您喜欢,也可以使用'WARN' )进行记录。

因此,这是我的解决方案:首先,一个扩展OutputStream的类(覆盖OutputStream的所有方法比覆盖PrintStream的所有方法更容易)。它以指定的日志级别记录日志,并将所有内容复制到另一个OutputStream。此外,它还检测“空”字符串(仅包含空格),并且不记录它们。

代码语言:javascript
复制
import java.io.IOException;
import java.io.OutputStream;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;

public class LoggerStream extends OutputStream
{
private final Logger logger;
private final Level logLevel;
private final OutputStream outputStream;

public LoggerStream(Logger logger, Level logLevel, OutputStream outputStream)
{
    super();

    this.logger = logger;
    this.logLevel = logLevel;
    this.outputStream = outputStream;
}

@Override
public void write(byte[] b) throws IOException
{
    outputStream.write(b);
    String string = new String(b);
    if (!string.trim().isEmpty())
        logger.log(logLevel, string);
}

@Override
public void write(byte[] b, int off, int len) throws IOException
{
    outputStream.write(b, off, len);
    String string = new String(b, off, len);
    if (!string.trim().isEmpty())
        logger.log(logLevel, string);
}

@Override
public void write(int b) throws IOException
{
    outputStream.write(b);
    String string = String.valueOf((char) b);
    if (!string.trim().isEmpty())
        logger.log(logLevel, string);
}
}

然后使用一个非常简单的实用程序类来设置outerr

代码语言:javascript
复制
import java.io.PrintStream;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;

public class OutErrLogger
{
public static void setOutAndErrToLog()
{
    setOutToLog();
    setErrToLog();
}

public static void setOutToLog()
{
    System.setOut(new PrintStream(new LoggerStream(Logger.getLogger("out"), Level.INFO, System.out)));
}

public static void setErrToLog()
{
    System.setErr(new PrintStream(new LoggerStream(Logger.getLogger("err"), Level.ERROR, System.err)));
}

}
票数 12
EN

Stack Overflow用户

发布于 2012-09-11 20:39:24

在Skaffman代码中:要删除log4j日志中的空行,只需在createLoggingProxy的PrintStream中添加"println“方法

代码语言:javascript
复制
public static PrintStream createLoggingProxy(final PrintStream realPrintStream) {
    return new PrintStream(realPrintStream) {
        public void print(final String string) {
            logger.warn(string);
        }
        public void println(final String string) {
            logger.warn(string);
        }
    };
}
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1200175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档