将javax.net.debug捕获到文件

时间:2011-01-04 16:32:19

标签: java log4j

我需要保存创建到文件的javax.net.debug = all输出。我正在使用log4j,我尝试创建一个日志代理,如下面的代码示例所示;但是,它没有拿起信息。我不确定javax.net.debug的打印位置。我尝试以这种方式捕获system.out和system.err,但都没有工作。谢谢你的帮助。

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);
            }
        };
    }
}

3 个答案:

答案 0 :(得分:7)

也许子系统会复制这些值,而且在切换时你太迟了。首先尝试在您的主体中执行此操作。

修改

好的 - 我完全错过了你的习语。我认为你不应该使用这个内部类。您应该在OutputStream上定义一个PrintStream实例,该实例在每个“\ n”上创建一个新的日志条目。你现在的方式错过了很多可能“打印”你的实例。


package de.mit.stackoverflow;

import java.io.IOException;
import java.io.OutputStream;

public class LogOutputStream extends OutputStream {

    private StringBuilder sb = new StringBuilder();

    @Override
    public void write(int b) throws IOException {
        if (b == '\n') {
            log(sb.toString());
            sb.setLength(0);
        } else {
            sb.append((char) b);
        }
    }

}


然后再做

    OutputStream os = new LogOutputStream();
    PrintStream ps = new PrintStream(os);
    System.setOut(ps);

您可能仍希望包含对上一个流的引用 - 左侧为练习: - )

答案 1 :(得分:3)

这是一个很长的镜头,但是覆盖print(String)是不够的。例如,还有print(Object)等,更不用说各种append()format()方法了。

答案 2 :(得分:2)

您需要在class-path(/ WEB-INF / classes /)中包含log4j.properties文件,其中包含以下内容:

log4j.properties文件

datestamp=yyyy-MM-dd/HH:mm:ss.SSS/zzz
roll.pattern.hourly=.MM-dd-yyyy.HH
roll.pattern.daily=.MM-dd-yyyy

log4j.rootLogger=INFO, Console
log4j.logger=INFO, Console

log4j.appender.Console=org.apache.log4j.DailyRollingFileAppender
log4j.appender.Console.DatePattern=${roll.pattern.daily}
log4j.appender.Console.file=${catalina.home}/logs/Console.log
log4j.appender.Console.MaxFileSize=800KB
log4j.appender.Console.MaxBackupIndex=5
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d{${datestamp}} [%t] %-5p %m%n

log4j.appender.custom=org.apache.log4j.DailyRollingFileAppender
log4j.appender.custom.DatePattern=${roll.pattern.daily}
log4j.appender.custom.File=${catalina.home}/logs/custom.log
log4j.appender.custom.MaxFileSize=800KB
log4j.appender.custom.MaxBackupIndex=5
log4j.appender.custom.layout=org.apache.log4j.PatternLayout
log4j.appender.custom.layout.ConversionPattern=%d{${datestamp}} [%t] %-5p %m%n

log4j.logger.net.javax=DEBUG, custom

这会将您的日志条目写入tomcat主目录/logs/custom.log

希望这会对你有所帮助。