`
zys0523
  • 浏览: 31825 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

减少日志的错误堆栈

 
阅读更多

最近为了避免线上日志量过多,我们团队采用了多种方法去减少日志,其中减少/删除日志堆栈是一个还算不错的方法

在这里总结下减少/消除Exception堆栈深度的三个方法

1.生成Exception时不生成堆栈

异常的层次如下

Throwable

Exception

RuntimeException

当new Exception时都会调用父类的构造方法,而错误堆栈的填充他是存在与Throwable的构造方法中

 /**
     * Constructs a new throwable with {@code null} as its detail message.
     * The cause is not initialized, and may subsequently be initialized by a
     * call to {@link #initCause}.
     *
     * <p>The {@link #fillInStackTrace()} method is called to initialize
     * the stack trace data in the newly created throwable.
     */
    public Throwable() {
        fillInStackTrace();
    }

 而fillInStackTrace是一个public的方法可以通过继承的方式覆盖掉

public class MyRunntimeException extends RuntimeException{
    public Throwable fillfillInStackTrace(){
        return this;
    }
}

 这样就可以完全不生成堆栈信息了可以极大的提升性能,不过对于框架来说那些Exception你无法定制所以不能用如上的方法

2.改写Log4J的Layout的ignoresThrowable方法,当该方法返回的值为false时不会渲染堆栈信息

public class PatternLayoutWithOutStackTrace extends PatternLayout {
    @Override
    public boolean ignoresThrowable() {
        return false;
    }
}    

3.改变堆栈长度

   Log4J在处理LogEvent的时候提供了一个FilterChain(org.apache.log4j.spi.Filter)

   那我们就可以在设置appender的时候添加一个我们定制的Filter来减少或者关闭堆栈深度

package learn.log4j;


import org.apache.log4j.spi.Filter;
import org.apache.log4j.spi.LoggingEvent;

public class LogStackTraceFilter extends Filter {
    //调整后的堆栈深度,-1表示不调整
    private int logLevel = -1;

    public void setLogLevel(int logLevel) {
        this.logLevel = logLevel;
    }

    @Override
    public int decide(LoggingEvent event) {
        Throwable throwable = event.getThrowableInformation().getThrowable();
        while (throwable != null) {
            //获取堆栈信息
            StackTraceElement[] stackTraceElements = throwable.getStackTrace();
            //截短堆栈
            if (logLevel > -1 && stackTraceElements != null && stackTraceElements.length > logLevel) {
                StackTraceElement[] truncateStackTraceElement = new StackTraceElement[logLevel];
                for (int currLevel = 0; currLevel < logLevel; currLevel++) {//只需要最上层的堆栈信息就好
                    truncateStackTraceElement[currLevel] = stackTraceElements[currLevel];
                }
                throwable.setStackTrace(truncateStackTraceElement);
            }
            throwable = throwable.getCause() != throwable ? throwable.getCause() : null;
        }
        return Filter.NEUTRAL;  
    }
}

 在log4j.xml中配置上这个filter即可

<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
        </layout>
        //控制堆栈深度的Filter
        <filter class="learn.log4j.LogStackTraceFilter">
            //堆栈深度设置为10
            <param name="logLevel" value="10"/>
        </filter>
    </appender>
 
分享到:
评论

相关推荐

    Logback 异常日志减少打印内容

    总的来说,通过合理配置Logback的日志级别、使用过滤器、控制异常堆栈轨迹的输出以及利用MDC,可以有效地减少异常日志的打印内容,同时确保关键信息的可读性和可用性。记得根据实际需求调整这些设置,以达到最佳的...

    将android客户端的错误日志压缩上传到服务器

    1. 使用日志等级过滤:只上传ERROR及以上级别的日志,减少无用信息传输。 2. 上传频率控制:设置上传条件,如仅在应用退出、用户手动触发或日志文件达到一定大小时上传。 3. 异步处理:将日志上传操作放在后台线程,...

    App崩溃日志保存在本地或者上传到服务器

    2. **崩溃日志(Crash Log)**:当应用程序因异常情况导致崩溃时,系统会生成崩溃日志,其中包含导致崩溃的堆栈跟踪信息、错误代码、设备状态等关键数据,用于分析问题原因。 3. **本地存储**:App崩溃日志可以被...

    BugTrap - C++程序崩溃堆栈信息收集

    2. **初始化BugTrap**:在程序启动时调用初始化函数,通常是在`main()`函数之前,这会设置BugTrap的基本行为,如错误报告的发送方式(邮件、网络、本地日志等)。 3. **捕获异常**:一旦初始化完成,BugTrap会在...

    Android(安卓)系统手机日志抓取

    - 日志信息可能会很大,使用过滤器筛选特定应用或日志级别(如ERROR、WARNING)可以减少无用信息。 - 抓取日志时尽量复现问题,以便获取问题发生时的日志信息。 - 保存的日志文件通常为`.txt`或`.log`格式,方便用...

    vc++ c++ mfc 日志 log 记录

    - 在异常捕获点记录堆栈跟踪信息,帮助定位错误发生的具体位置。 - 结合`__FUNCTION__`,`__LINE__`和`__FILE__`宏,获取异常发生时的上下文信息。 10. **日志的优化** - 对于性能敏感的应用,考虑异步写入日志...

    c++记录日志到文件里面

    日志系统可以帮助我们追踪程序运行过程中的错误、异常和关键事件,以便于后期分析和解决问题。本篇将深入探讨如何在C++中实现日志记录到文件的功能。 首先,我们需要了解基本的日志记录概念。日志通常包含时间戳、...

    BREW 生成日志代码

    这可能意味着避免不必要的字符串操作,使用预编译的宏来减少运行时开销,或者在内存紧张时限制日志输出。 5. **日志存储**:考虑到手机的存储空间有限,日志文件可能需要定期清理或压缩。开发者需要考虑如何在不...

    后台错误日志

    ### 后台错误日志分析 #### 一、概述 后台错误日志是记录系统运行过程中出现异常情况的重要文档,对于排查问题、定位错误源有着不可替代的作用。本篇文章将根据给定的日志内容,详细解析其中涉及的技术知识点,...

    应用程序日志记录log.zip

    此外,良好的日志设计原则包括但不限于:保持日志格式的一致性,使用有意义的错误码和消息,记录上下文信息(如调用堆栈、用户ID),并控制日志级别以平衡信息量和性能。在分布式系统中,日志的集中管理和分布式追踪...

    android 工程 日志输出 附

    不同的级别适用于不同的场景,例如在开发阶段通常使用`d`和`v`,而发布时则应尽量减少`v`级别的日志,只保留必要的`d`和`i`级别。 2. **自定义日志标签和过滤器** - 开发者可以设置自定义的日志标签,便于区分...

    强大的日志框架,能记录程序中出现的异常

    通过日志框架,我们可以设置不同级别的日志输出,如DEBUG、INFO、WARN、ERROR和FATAL,这样就可以在发生异常时立即得知,并记录下异常的详细信息,包括堆栈跟踪,这对于后期分析问题原因非常有帮助。 描述中提到的...

    c++开源日志库GLOG

    4. **堆栈跟踪**:当发生严重错误,如`FATAL`级别日志时,GLOG会自动打印出堆栈跟踪信息,帮助开发者定位问题发生的具体位置。 5. **崩溃恢复**:`FATAL`级别日志会触发程序的崩溃,但GLOG在崩溃前会尝试清理资源并...

    异常堆栈回溯 找出异常地址

    对于Java等高级语言,JVM提供了堆栈跟踪信息,开发者可以通过日志或专门的异常处理器获取。 在压缩包文件"说明.txt"和"Under the Hood"中,可能包含了更详细的步骤、示例和工具使用说明。阅读这些文件可以帮助你...

    日志类jar包

    - 使用异步日志处理机制可以减少日志记录对主线程的影响。 7. **日志分析工具** - 有许多工具可用于分析和可视化日志数据,如ELK(Elasticsearch、Logstash、Kibana)堆栈,它们可以帮助我们快速搜索、过滤和理解...

    .NET-BenDemystifier高性能的堆栈跟踪理解

    本文将深入探讨如何理解和利用高性能的堆栈跟踪,以提高错误日志的效率,以及在代码分析和度量中的应用。 堆栈跟踪是当程序抛出异常或通过其他方式触发时,系统记录的一系列方法调用的回溯。它显示了执行流程从发生...

    给你的VB程序增加错误日志

    在实际开发中,确保错误日志的详细性和可读性是至关重要的,这可以帮助你快速定位问题,减少调试时间。同时,合理地处理错误,避免因错误导致程序崩溃,可以提升用户体验。通过以上步骤,你可以在VB程序中构建一个...

    fastify框架的logger日志工具

    当发生错误时,`fastify-logger`会自动捕获并记录错误信息,包括堆栈跟踪。这对于诊断和修复问题非常有用。 8. **与其他插件的集成** 由于Fastify的插件架构,`fastify-logger`可以与其他插件无缝集成,共同提供...

    C++编写的写日志操作程序源代码

    - 日志:记录程序运行过程中的事件、错误、警告和其他相关信息的文本文件,用于后续分析和问题定位。 - 日志级别:通常包括DEBUG、INFO、WARNING、ERROR和FATAL,不同级别对应不同的严重程度。 2. **C++日志库**...

    多线程的日志记录.rar

    7. **日志格式和内容**:为了便于后期分析,日志应包含足够的上下文信息,如线程ID、时间戳、调用堆栈等。这可以帮助开发者快速定位问题所在。 8. **分布式日志系统**:在大型分布式系统中,可能需要使用分布式日志...

Global site tag (gtag.js) - Google Analytics