我需要将创建的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);
}
};
}
}
4条答案
按热度按时间kupeojn61#
也许子系统复制了这些值,而你在切换时已经太晚了。试着先在你的主系统中这样做。
编辑
好吧-我完全错过了你的习惯用法。我认为你不应该使用这个内部类。你应该在OutputStream上定义一个PrintStream示例,在每个“\n”时创建一个新的日志条目。你现在这样做的方式错过了很多“打印”你的示例的可能性。
然后做了
您可能还想包括对前一个流的引用-作为exercise:-)
2o7dmzc52#
这是一个很长的尝试,但有可能仅仅覆盖
print(String)
是不够的。例如,还有print(Object)
等,更不用说各种append()
和format()
方法了。iyzzxitl3#
我在运行jdk 8的Tomcat 9应用程序中遇到了这个问题(源代码兼容级别为1.7,配置了LOG4J和Tomcat JULI日志记录),所以我的解决方案就是基于这个问题的,但是这个技巧是通用的:
始终检查文档并调查代码源。
通过一些特定的关键字从ssl跟踪日志中搜索,我发现系统属性“javax .NET.debug”在SSLLogger.java(较新的jdk,即11)和Debug.java(较旧的jdk,即7)中使用。我很幸运地首先找到了jdk 11的源代码,所以我在那里找到了描述性的注解(而较旧的没有):
如果系统属性“javax.net.debug”未定义,则调试日志记录将关闭。如果系统属性“javax.net.debug”定义为空,则调试记录器由System.getLogger指定(“javax .NET.ssl”),应用程序可以自定义和配置日志记录器或使用外部日志记录机制。如果系统属性“javax .NET.debug”已定义且为非空,使用在该类中实现的私有调试记录器。
我在Tomcat服务器中添加了“-Djavax .NET.debug”VM参数,SSL跟踪日志输出略有变化(变得不那么冗长)。
为了控制这个包记录器将输出什么,我修改了Tomcat server logging.properties:
5ssl.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
5ssl.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
个5ssl.org.apache.juli.FileHandler.prefix = ssl.
5ssl.org.apache.juli.FileHandler.maxDays = 2
handlers = 1catalina.org.apache.juli.FileHandler, 2localhost.org.apache.juli.FileHandler, 3manager.org.apache.juli.FileHandler, 4host-manager.org.apache.juli.FileHandler, 5ssl.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler
javax.net.ssl.level = FINEST
javax.net.ssl.handlers = 5ssl.org.apache.juli.FileHandler
现在,我的自定义记录器(几乎)与调试级别为“all”的本机SSLLogger的工作方式类似。
重要区别在于缺少更详细消息,如'ssl,trustmanager'或'ssl,plaintext'
本机记录器输出:
自定义记录器输出:
在检查本机日志记录器中标记的几个文件的源文件(即SSLSocketInputRecord.java、X509TrustManagerImpl.java)后,我注意到日志记录器帮助中提到的特定日志记录属性(纯文本、记录等)有额外的检查,检查如下:
而且,当使用自定义记录器时,SSLLogger.isOn为true,未定义本机日志记录属性,这意味着配置自定义记录器后,SSLLogger将不会输出特定的详细消息...
另外,我无法将log4j用作SSLLogger的自定义日志记录器(我想,要做到这一点,我需要将Tomcat配置为使用log4j,而不是java.util.logging,用于所有Tomcat的内部日志记录,如docs中所述)。
gwbalxhn4#
您需要log4j.properties在类路径(/WEB-INF/classes/)中包含www.example.com文件,并且该文件包含以下内容:
文件log4j.properties
这会将日志条目写入tomcat主目录/logs/custom. log
希望这对你有帮助。