捕获javax.net.debug到文件

捕获javax.net.debug到文件,java,log4j,Java,Log4j,我需要将javax.net.debug=创建的所有输出保存到一个文件中。我正在使用log4j,并尝试创建一个日志代理,如下面的代码示例所示;然而,它并没有收集信息。我不确定javax.net.debug打印到哪里。我尝试以这种方式捕获system.out和system.err,但都不起作用。谢谢你的帮助 public class StdOutErrLog { private static final Logger logger = Logger.getLogger(StdOutErrL

我需要将javax.net.debug=创建的所有输出保存到一个文件中。我正在使用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);
            }
        };
    }
}

您需要在类路径(/WEB-INF/classes/)中包含包含以下内容的log4j.properties文件:

log4j.properties文件 这将把日志条目写入tomcat主目录/logs/custom.log


希望这能对您有所帮助。

可能子系统复制了这些值,而您切换时已经太晚了。试着在你的主要工作中先做这件事

编辑

好吧,我完全没听清你的成语。我认为你不应该使用这个内部类。您应该在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);

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

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

是的,这是我的主要方法。这是我为SSL设置调试选项之前的第一个调用。这将重定向log4j条目,但对SSL调试日志(javax.net.debug=all)没有任何作用。这个答案与原来的问题无关。
    OutputStream os = new LogOutputStream();
    PrintStream ps = new PrintStream(os);
    System.setOut(ps);