2013-02-20 51 views
1

登录信息水平对于某些故障的原因,我想记录所有过去的信息(例如最近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日志框架可以从框中执行此操作吗?

回答

1

我猜测,有这个问题并没有标准配置,我会查看自定义添加器重写你最喜欢用一种缓冲和附加在错误的情况下,只有元素。

在我看来,你可能比记录过去的事情更好的记录详细的错误信息。

2

不幸的是,我怀疑你可以用log4j做这样的事情。我觉得你可以做其他两两件事:

  1. 写你在错误信息所需要的信息(并不总是可行的)

    log.error("error with arg value " + arg, e); 
    
  2. 配置log4j,使其最多可打印在地级信息控制台或日志文件,并在另一个文件中打印多达级别的跟踪,叫什么“detailed.log”,你会考虑只在一个错误的情况下。详情如何做到这一点see this question

+0

您也可以使用MDC来追踪整个执行轨迹 – user1428716 2013-02-21 01:44:38

1

UPDATE 这是不正确的说是没有办法做到这一点。看看log4j的MappedDiagnosticContextthis似乎是一个不错的指令


有没有办法做到这一点。

认为,当前跟踪级别INFO和代码作如下记录来电:

  1. TRACE
  2. 信息
  3. ERROR

#1没有办法为,以知道代码将在ERROR下游落得,所以唯一的解决办法是缓冲器吧。然后在#2记录需要发生,因为当前的水平是INFO

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

不记录在#2并等待方法/功能执行完成通常是一个坏主意。它可能适用于你,但你最终可能会丢失日志行,这是不好的。

最好的选择是存储在内存中 - 比如在本地线程中 - 附加信息以便在出现错误时登录。因此,输出将是:

10:15 INFO 
10:20 ERROR 
     10.10: TRACE 

记录的一笔大开销是构建这些字符串从对象写。所以,而不是缓冲实际的字符串,你需要说一些Callable或一些这样的。这一切都变得非常混乱。