类和成员名称的通用Java记录器输出null.null
我正在使用带有以下初始化行的general java.util.logging.Logger:类和成员名称的通用Java记录器输出null.null,java,logging,null,member,Java,Logging,Null,Member,我正在使用带有以下初始化行的general java.util.logging.Logger: private static final Logger _log = Logger.getLogger(Login.class.getName()); 然后我就这样使用它(只是一个例子): 在日志中,有时我可以看到以下内容: 2014年11月24日17:26:13.692罚款[http-nio-80-exec-1]空。空会话id:18BD6989930169F7755EA2D001A5759 但是,
private static final Logger _log = Logger.getLogger(Login.class.getName());
然后我就这样使用它(只是一个例子):
在日志中,有时我可以看到以下内容:
2014年11月24日17:26:13.692罚款[http-nio-80-exec-1]空。空会话id:18BD6989930169F7755EA2D001A5759
但是,大多数时候,它会正确地向我显示调用类和函数。这在其他类和成员中也会发生。我不明白为什么会这样?这是Loggger中的错误吗?输出看起来像来自“org.apache.juli.OneLineFormatter”,而“null.null”是源类和源方法名称。从文件中: 如果无法获得任何信息,则可能为空 可能无法确定或已经确定 查看“org.apache.juli.AsyncFileHandler”的源代码时,有一个错误,该代码没有捕获原始调用站点 您可以在AsynchFileHandler上创建和,以在线程转移之前强制计算方法和类名。以下是此类过滤器的示例:
public class InferCallerFilter implements Filter {
public boolean isLoggable(LogRecord record) {
record.getSourceMethodName(); //Infer caller.
return true;
}
}
甚至JDK中也包含了。根据日志记录文件:
因此,如果日志处理程序希望将日志记录传递给另一个线程,或通过RMI传输日志记录,并且如果希望随后获得方法名或类名信息,则应调用getSourceClassName或getSourceMethodName中的一个以强制填充值
我通过更改我的自定义LogFormatter来“解决”这个问题,以在format方法的最开始处获取源类名和源方法名
这些方法的返回值似乎有一个“过期日期”
到目前为止,在那次更改之后,我再也没有观察到任何null.null条目,而在我有很多条目之前。这是GlassFish的com.sun.enterprise.server.logging.UniformLogFormatter吗?如果是,GF的版本是什么?没有。对不起,我没有提到软件包的名称。它是java.util.logging.Logger。我在Tomcat中使用它,我在Tomcat中也体验到了这一点(不是在eclipse中)。我使用自己的自定义日志格式化程序。是的,这是非常可能的。我无法确定它何时显示null以及何时工作正常。在同一种方法中,大多数情况下日志工作正常,但有时会显示null。如果您使用AsynchFileHandler,则将代码切换为使用FileHander或安装InferrCallerFilter以排除切换错误。不是因为它过期,而是第一个调用的线程永远是赢家。这就是为什么javadocs在任何线程转移发生之前警告调用getSourceXXX。
public class InferCallerFilter implements Filter {
public boolean isLoggable(LogRecord record) {
record.getSourceMethodName(); //Infer caller.
return true;
}
}
@Override
public String format(LogRecord record)
{
String sourceClassName = record.getSourceClassName();
String sourceMethodName = record.getSourceMethodName();
...
}