通用Java Logger为类和成员名输出null.null

时间:2014-11-25 01:35:59

标签: java logging null member

我使用通用的java.util.logging.Logger和以下初始化行:

private static final Logger _log = Logger.getLogger(Login.class.getName());

然后我像这样使用它(只是一个例子):

    _log.log(Level.FINE, "Session id: {0}.", session.getId());

有时我会在日志中看到以下内容:

2014年11月24日17:26:13.692 FINE [http-nio-80-exec-1] null.null 会话编号:18BD6989930169F77565EA2D001A5759。

然而,大多数时候它会向我显示调用类和函数。这也发生在其他类和成员中。我无法弄清楚为什么会这样?它是Loggger中的一个错误吗?

2 个答案:

答案 0 :(得分:3)

输出看起来像是来自'org.apache.juli.OneLineFormatter'而'null.null'是源类和源方法名称。来自LogRecord.getSourceMethodName文档:

  

如果无法获得任何信息,则可以为空。

可能无法确定或已forced to null.

查看'org.apache.juli.AsyncFileHandler'的源代码,有一个错误,即该代码没有捕获原始调用点。

您可以在AsynchFileHandler上创建和install a filter,以在线程切换之前强制计算方法和类名。以下是此类过滤器的示例:

    public class InferCallerFilter implements Filter {

        public boolean isLoggable(LogRecord record) {
            record.getSourceMethodName(); //Infer caller.
            return true;
        }
    }

即使是JDK MemoryHandler中包含的gets this wrong。根据LogRecord文档:

  

因此,如果日志记录处理程序想要将LogRecord传递给另一个线程,或者通过RMI传输它,并且如果它希望随后获取方法名称或类名信息,则它应该调用getSourceClassName或getSourceMethodName中的一个来强制要填写的值。

答案 1 :(得分:0)

我"解决了#34;这可以通过更改我的自定义LogFormatter来获取格式方法一开始的源类名和源方法名。

这些方法的返回值似乎有一个"到期日期" ...

def user_params
  params.require(:user).permit(:first_name, :last_name, :username, :email, :password)
end

到目前为止,在那次改变之后,我还没有观察到任何null.null条目,在我有很多这些条目之前。