1

出于某些故障排除原因,如果发生异常,我想在 TRACE 级别记录所有过去的消息(例如最后 20 条消息),但如果代码运行良好,我想从 INFO 级别记录以清除我的日志文件不必要的日志消息。

例如:

public void m( String arg ){
    log.trace( "arg value: " + arg );
    log.info( "Hi Bob!" );
    try{
        //code
    }catch( Exception e ){
         log.error( "error msg", e );
    }
}

我想登录类似:

*INFO* Hi Bob!

但是,如果发生错误,我想进入日志,例如:

*TRACE* arg value: test
*INFO* Hi Bob!
*ERROR* error msg //and stacktrace

换句话说,我希望有一个日志消息缓冲区,如果代码运行良好,它将从低级别消息中清除,并在出现错误时将其推送到日志文件中。java日志框架可以从盒子里做到这一点吗?

4

3 回答 3

2

不幸的是,我怀疑你可以用 log4j 做这样的事情。我认为你可以做另外两件事:

  1. 在错误消息中写下您需要的信息(并不总是实用)

    log.error( "error with arg value " + arg, e );
    
  2. 配置 log4j,使其在控制台或日志文件中打印到级别 INFO,并在另一个文件中打印到级别 TRACE,称为“detailed.log”,只有在出现错误时才会查看。有关如何执行此操作的详细信息,请参阅此问题

于 2013-02-20T22:55:14.833 回答
1

更新 说没有办法做到这一点是不正确的。看看 log4j MappedDiagnosticContext似乎是一个很好的指导


没有办法做到这一点。

考虑当前的跟踪级别是INFO并且代码进行以下日志调用:

  1. 痕迹
  2. 信息
  3. 错误

#1没有办法知道代码最终会在下游结束,ERROR所以唯一的解决方案是缓冲它。然后#2需要进行日志记录,因为当前级别是INFO.

#3发生错误时,INFO 日志#2已经发生。没有办法回滚并在#1之前插入跟踪#2

不登录#2并等待方法/函数执行完成通常是一个坏主意。它可能对您有用,但您最终可能会丢失日志行,这很糟糕。

您最好的选择是存储在内存中——比如在本地线程中——在出现错误时记录附加信息。所以输出将是:

10:15 INFO
10:20 ERROR
      10.10: TRACE

日志记录的一大开销是构造那些要从对象写入的字符串。因此,您不需要缓冲实际的字符串,而是需要说一些Callable或一些类似的东西。这一切都变得非常混乱。

于 2013-02-20T23:15:02.623 回答
1

我猜这没有标准配置,我会查看一个自定义附加程序,用一种缓冲区覆盖您最喜欢的附加程序,并在出现错误时仅附加元素。

在我看来,与尝试记录过去的事情相比,记录详细的错误消息可能会更好。

于 2013-02-20T22:51:18.837 回答