[英]how to configure log4j.xml to get the debug info of “javax.net.debug”
我想獲取LDAP connect ssl握手調試信息,因此我將系統屬性“ javax.net.debug”的值設置為“ ssl,handshake”,如下所示:
System.property("javax.net.debug" , "ssl,handshake");
但是我沒有得到ssl調試信息。在我的項目中,使用log4j.xml來控制調試信息,所以我想知道如何配置log4j.xml來獲取“ javax.net.debug”的調試信息? 謝謝你的幫助!
javax.net
包中的類不會寫入Log4J appenders
(實際上它們根本不使用Log4J庫)。 他們很可能會將調試消息STDOUT
到正在運行的Java進程的STDOUT
或STDERR
流。 將這些流重定向到磁盤上的文件,然后您可以將這些消息記錄在文件中。 如果使用的是某些服務器(例如Tomcat或JBoss),請閱讀服務器的文檔,了解如何從這些進程控制I / O流。
Log4j.xml
與此處無關。
編輯:如果您使用的是Tomcat(或Jboss),則可能需要檢查log4j.xml
ConsoleAppender
的日志閾值。 默認情況下,它設置為INFO
並重定向到logs目錄中的console.log
文件。
SunJSSE具有內置的調試工具,並由系統屬性javax.net.debug (-Djavax.net.debug = all)激活。 調試消息打印到STDOUT。
我擴展了java.io.PrintStream類,並通過轉發所有System.out.print方法調用以打印到記錄器,我在由log4j配置的應用程序文件日志中獲得了JSSE調試消息。
我僅在應用程序的記錄器處於調試級別時才激活重定向:
if (logger.isDebugEnabled())
StdOutLogger.enable();
通過調用以下方式停用重定向:
StdOutLogger.disable();
請查看StdOutLogger類:
package com.mydomain.util.log4j;
import java.io.PrintStream;
import java.util.Locale;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class StdOutLogger extends PrintStream
{
private static Logger logger =
LoggerFactory.getLogger(StdOutLogger.class);
private static volatile StdOutLogger systemOutLogger;
private static PrintStream originalStream = System.out;
private static boolean isEnabled = false;
private StringBuilder builder;
private String lineSeparator = System.getProperty("line.separator");
private StdOutLogger(PrintStream original)
{
super(original);
builder = new StringBuilder();
logger.debug("Reassign standard output stream to log" + lineSeparator);
}
public static StdOutLogger getInstance()
{
if(systemOutLogger == null)
{
synchronized(StdOutLogger.class)
{
if(systemOutLogger == null)
systemOutLogger = new StdOutLogger(originalStream);
}
}
return systemOutLogger;
}
/**
* Enable forwarding System.out.println calls to the logger
*/
public static void enable()
{
if (isEnabled)
return;
systemOutLogger = StdOutLogger.getInstance();
try
{
System.setOut(systemOutLogger);
isEnabled = true;
}
catch (Exception e)
{
logger.error("Failed to reassign the standard output stream to log: " + e.getMessage());
}
}
/**
* Disable forwarding to the logger resetting the standard output to the console
*/
public static void disable()
{
if (!isEnabled)
return;
try
{
System.setOut(originalStream);
isEnabled = false;
}
catch (Exception e)
{
logger.error("Failed to reassign the standard output stream: " + e.getMessage());
}
systemOutLogger = null;
}
@Override
public void println()
{
originalStream.println();
printToLogger(lineSeparator, false);
}
@Override
public void print(final String s)
{
originalStream.print(s);
printToLogger(s, false);
}
@Override
public void print(final int i)
{
originalStream.print(i);
printToLogger(String.valueOf(i), false);
}
@Override
public void print(final long l)
{
originalStream.print(l);
printToLogger(String.valueOf(l), false);
}
@Override
public void print(final float f)
{
originalStream.print(f);
printToLogger(String.valueOf(f), false);
}
@Override
public void print(final double d)
{
originalStream.print(d);
printToLogger(String.valueOf(d), false);
}
@Override
public void print(final Object obj)
{
originalStream.print(obj);
printToLogger(String.valueOf(obj), false);
}
@Override
public void print(char c)
{
originalStream.print(c);
printToLogger(String.valueOf(c), false);
}
@Override
public void print(boolean b)
{
originalStream.print(b);
printToLogger(String.valueOf(b), false);
}
@Override
public void println(final String s)
{
originalStream.println(s);
printToLogger(s, true);
}
@Override
public void println(final int i)
{
originalStream.println(i);
printToLogger(String.valueOf(i), true);
}
@Override
public void println(final long l)
{
originalStream.println(l);
printToLogger(String.valueOf(l), true);
}
@Override
public void println(final float f)
{
originalStream.println(f);
printToLogger(String.valueOf(f), true);
}
@Override
public void println(final double d)
{
originalStream.println(d);
printToLogger(String.valueOf(d), true);
}
@Override
public void println(final Object obj) {
originalStream.println(obj);
printToLogger(String.valueOf(obj), true);
}
@Override
public void println(char c) {
originalStream.println(c);
printToLogger(String.valueOf(c), true);
}
@Override
public void println(boolean b) {
originalStream.println(b);
printToLogger(String.valueOf(b), true);
}
@Override
public PrintStream append(CharSequence csq, int start, int end)
{
CharSequence cs = (csq == null ? "null" : csq);
printToLogger(cs.subSequence(start, end).toString(), false);
return this;
}
@Override
public void write(int b)
{
originalStream.write(b);
printToLogger(String.valueOf((char)b), false);
}
@Override
public void write(byte buf[], int off, int len)
{
originalStream.write(buf, off, len);
if (buf == null)
{
throw new NullPointerException();
}
else if ((off < 0) || (off > buf.length) || (len < 0) ||
((off + len) > buf.length) || ((off + len) < 0)) {
throw new IndexOutOfBoundsException();
}
else if (len == 0) {
return;
}
byte[] pb = new byte[len];
for (int i = 0 ; i < len ; i++) {
pb[i] = (buf[off + i]);
}
String str = new String(pb);
printToLogger(str, false);
}
@Override
public PrintStream printf(String format, Object ... args)
{
return format(format, args);
}
@Override
public PrintStream format(String format, Object ... args)
{
originalStream.format(format, args);
printToLogger(String.format(format, args), false);
return this;
}
@Override
public PrintStream format(Locale l, String format, Object ... args)
{
originalStream.format(l, format, args);
printToLogger(String.format(format, args), false);
return this;
}
@Override
public void flush()
{
originalStream.flush();
if (builder.length() > 0)
{
logger.debug(builder.toString());
builder = new StringBuilder();
}
//builder.append(lineSeparator);
}
private void printToLogger(String str, boolean isNewLine)
{
if (str.endsWith(lineSeparator))
{
int endIndex = str.lastIndexOf(lineSeparator);
str = str.substring(0, endIndex);
isNewLine = true;
}
builder.append(str);
if (isNewLine)
{
logger.debug(builder.toString());
builder = new StringBuilder();
}
}
}
如果使用的是JBoss,則可以配置jboss-log4j.xml以將所有STDOUT消息打印到stdout.log。
解決方案摘錄自: https : //access.redhat.com/solutions/68949
將以下內容添加到$ JBOSS_HOME / server / $ PROFILE / conf / jboss-log4j.xml
<appender name="STDOUTLOG" class="org.jboss.logging.appender.DailyRollingFileAppender">
<errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
<param name="File" value="${jboss.server.log.dir}/stdout.log"/>
<param name="Append" value="false"/>
<param name="DatePattern" value="'.'yyyy-MM-dd"/>
<layout class="org.apache.log4j.PatternLayout">
<!-- The default pattern: Date Priority [Category] (Thread) Message\n -->
<param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n"/>
</layout>
</appender>
<appender name="STDERRLOG" class="org.jboss.logging.appender.DailyRollingFileAppender">
<errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
<param name="File" value="${jboss.server.log.dir}/stderr.log"/>
<param name="Append" value="false"/>
<param name="DatePattern" value="'.'yyyy-MM-dd"/>
<layout class="org.apache.log4j.PatternLayout">
<!-- The default pattern: Date Priority [Category] (Thread) Message\n -->
<param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n"/>
</layout>
</appender>
...(snip)...
<category name="STDOUT" additivity="false">
<priority value="INFO" />
<appender-ref ref="STDOUTLOG"/>
</category>
<category name="STDERR" additivity="false">
<priority value="INFO" />
<appender-ref ref="STDERRLOG"/>
</category>
PS:不要在上面的代碼片段中包含分隔符文本...(snip)...。 僅用於告訴您將配置插入配置文件的正確部分。
您是否配置了記錄儀? (除了您的System.property)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//LOGGER" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p %c.%M:%L - %m%n" />
</layout>
</appender>
<appender name="file" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="/var/opt/log/mylogs.log" />
<param name="maxBackupIndex" value="5" />
<param name="maxFileSize" value="5MB" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{dd/MMM/yyyy HH:mm:ss} %-5p %C{2}.%M - %m%n" />
</layout>
</appender>
<logger name="javax.net.debug">
<level value="DEBUG" />
<appender-ref ref="STDOUT" />
<appender-ref ref="file" />
</logger>
</log4j:configuration>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.