有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在所有级别上记录过去的一些日志消息(在异常情况下),在正常情况下记录信息级别

出于某些故障排除原因,如果发生异常,我希望从跟踪级别记录所有过去的消息(例如last 20),但如果代码运行良好,我希望从信息级别记录,以清除日志文件中不必要的日志消息

例如:

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) 个答案

  1. # 1 楼答案

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


    没有办法做到这一点

    考虑当前跟踪级别为^ {< CD2>},代码执行以下日志调用:

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

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

    #3发生错误时,#2的信息日志已经发生。无法将其回滚并在#2之前插入#1跟踪

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

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

    10:15 INFO
    10:20 ERROR
          10.10: TRACE
    

    日志记录的一大开销是构造从对象写入的字符串。因此,不需要缓冲实际字符串,而是需要放置一些Callable之类的字符串。一切都变得一团糟