Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 发生异常时转储调试日志_Java_Logging_Slf4j_Logback_Error Logging - Fatal编程技术网

Java 发生异常时转储调试日志

Java 发生异常时转储调试日志,java,logging,slf4j,logback,error-logging,Java,Logging,Slf4j,Logback,Error Logging,我正在编写一个java web应用程序。我正在使用slf4j和logback进行日志记录。我使用调试级别来输出一些信息,这些信息可能有助于查找bug,但通常没有用处,而且非常冗长 我可以在应用程序中捕获所有异常并记录它们。我想做的是从请求开始捕获该线程中以前的所有日志输出,并将其保存在单独的事件文件中。所以,我将有干净的日志,以便系统在没有错误的情况下运行,并且在发生异常时有详细的事件日志 这个问题有现成的解决办法吗?可能有稍微不同的方法吗 现在,我正在将所有调试输出保存到存储了7天的文件中,但

我正在编写一个java web应用程序。我正在使用slf4j和logback进行日志记录。我使用调试级别来输出一些信息,这些信息可能有助于查找bug,但通常没有用处,而且非常冗长

我可以在应用程序中捕获所有异常并记录它们。我想做的是从请求开始捕获该线程中以前的所有日志输出,并将其保存在单独的事件文件中。所以,我将有干净的日志,以便系统在没有错误的情况下运行,并且在发生异常时有详细的事件日志

这个问题有现成的解决办法吗?可能有稍微不同的方法吗


现在,我正在将所有调试输出保存到存储了7天的文件中,但在需要时,将此文件变为灰色并不是最简单的任务。

您可以创建一个自定义附加器来存储所有日志消息,然后在需要时写入另一个附加器。在请求开始时调用
clearLog
,如果出现错误则调用
writeLog

import java.util.ArrayList;
import java.util.List;

import ch.qos.logback.core.Appender;
import ch.qos.logback.core.AppenderBase;

public class SavingAppender<E> extends AppenderBase<E> {
    private final ThreadLocal<List<E>> events = new ThreadLocal<List<E>>() {
        protected List<E> initialValue() {
            return new ArrayList<>();
        }
    };

    protected void append(E event) {
        events.get().add(event);
    }

    public void clearLog() {
        events.get().clear();
    }

    public void writeLog(Appender<E> other) {
        for(E event:events.get()) {
            other.doAppend(event);
        }
    }
}
import java.util.ArrayList;
导入java.util.List;
导入ch.qos.logback.core.Appender;
导入ch.qos.logback.core.AppenderBase;
公共类SavingAppender扩展了AppenderBase{
私有最终ThreadLocal事件=新ThreadLocal(){
受保护列表初始值(){
返回新的ArrayList();
}
};
受保护的无效附加(E事件){
events.get().add(事件);
}
public void clearLog(){
events.get().clear();
}
公共无效书面记录(附录其他){
for(E事件:events.get()){
其他。完成(事件);
}
}
}
将所有日志消息配置为转到appender,并为事件日志创建另一个appender:

<configuration> 
    <appender name="savingAppender" class="SavingAppender"> 
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="outputError" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 
            <level>error</level>
        </filter>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="incidentAppender" class="ch.qos.logback.core.FileAppender">
        <file>output.log</file>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="info">
        <appender-ref ref="savingAppender"/>
        <appender-ref ref="outputError"/>
    </root>

    <logger name="incident">
        <appender-ref ref="incidentAppender"/>
    </logger>
</configuration>

%d{yyyy-MM-dd HH:MM:ss.SSS}%-5级%logger{36}-%msg%n
错误
%d{yyyy-MM-dd HH:MM:ss.SSS}%-5级%logger{36}-%msg%n
output.log
%d{yyyy-MM-dd HH:MM:ss.SSS}%-5级%logger{36}-%msg%n
测试等级:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.Appender;

public class Main {
    public static void main(String[] args) {
        Logger rootLogger = LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
        Appender<ILoggingEvent> savingAppender = ((ch.qos.logback.classic.Logger)rootLogger).getAppender("savingAppender");

        Logger incidentLogger = LoggerFactory.getLogger("incident");
        Appender<ILoggingEvent> incidentAppender = ((ch.qos.logback.classic.Logger)incidentLogger).getAppender("incidentAppender");

        ((SavingAppender<ILoggingEvent>)savingAppender).clearLog();

        LoggerFactory.getLogger(Main.class).error("Error 1...");
        LoggerFactory.getLogger(Main.class).error("Error 2...");
        LoggerFactory.getLogger(Main.class).error("Error 3...");
        LoggerFactory.getLogger(Main.class).info("Info 1...");
        LoggerFactory.getLogger(Main.class).info("Info 2...");
        LoggerFactory.getLogger(Main.class).info("Info 3...");

        ((SavingAppender<ILoggingEvent>)savingAppender).writeLog(incidentAppender);
    }
}
import org.slf4j.Logger;
导入org.slf4j.LoggerFactory;
导入ch.qos.logback.classic.spi.ILoggingEvent;
导入ch.qos.logback.core.Appender;
公共班机{
公共静态void main(字符串[]args){
Logger rootLogger=LoggerFactory.getLogger(Logger.ROOT\u Logger\u NAME);
Appender savingAppender=((ch.qos.logback.classic.Logger)rootLogger.getAppender(“savingAppender”);
Logger incidentLogger=LoggerFactory.getLogger(“事件”);
Appender incidentAppender=((ch.qos.logback.classic.Logger)incidentLogger.getAppender(“incidentAppender”);
((SavingAppender)SavingAppender).clearLog();
LoggerFactory.getLogger(Main.class).error(“error 1…”);
LoggerFactory.getLogger(Main.class).error(“error 2…”);
LoggerFactory.getLogger(Main.class).error(“error 3…”);
LoggerFactory.getLogger(Main.class).info(“信息1…”);
LoggerFactory.getLogger(Main.class).info(“信息2…”);
LoggerFactory.getLogger(Main.class).info(“INFO3…”);
(SavingAppender)SavingAppender.书面记录(附带附加者);
}
}