最近为了避免线上日志量过多,我们团队采用了多种方法去减少日志,其中减少/删除日志堆栈是一个还算不错的方法
在这里总结下减少/消除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的日志级别、使用过滤器、控制异常堆栈轨迹的输出以及利用MDC,可以有效地减少异常日志的打印内容,同时确保关键信息的可读性和可用性。记得根据实际需求调整这些设置,以达到最佳的...
1. 使用日志等级过滤:只上传ERROR及以上级别的日志,减少无用信息传输。 2. 上传频率控制:设置上传条件,如仅在应用退出、用户手动触发或日志文件达到一定大小时上传。 3. 异步处理:将日志上传操作放在后台线程,...
2. **崩溃日志(Crash Log)**:当应用程序因异常情况导致崩溃时,系统会生成崩溃日志,其中包含导致崩溃的堆栈跟踪信息、错误代码、设备状态等关键数据,用于分析问题原因。 3. **本地存储**:App崩溃日志可以被...
2. **初始化BugTrap**:在程序启动时调用初始化函数,通常是在`main()`函数之前,这会设置BugTrap的基本行为,如错误报告的发送方式(邮件、网络、本地日志等)。 3. **捕获异常**:一旦初始化完成,BugTrap会在...
- 日志信息可能会很大,使用过滤器筛选特定应用或日志级别(如ERROR、WARNING)可以减少无用信息。 - 抓取日志时尽量复现问题,以便获取问题发生时的日志信息。 - 保存的日志文件通常为`.txt`或`.log`格式,方便用...
- 在异常捕获点记录堆栈跟踪信息,帮助定位错误发生的具体位置。 - 结合`__FUNCTION__`,`__LINE__`和`__FILE__`宏,获取异常发生时的上下文信息。 10. **日志的优化** - 对于性能敏感的应用,考虑异步写入日志...
日志系统可以帮助我们追踪程序运行过程中的错误、异常和关键事件,以便于后期分析和解决问题。本篇将深入探讨如何在C++中实现日志记录到文件的功能。 首先,我们需要了解基本的日志记录概念。日志通常包含时间戳、...
这可能意味着避免不必要的字符串操作,使用预编译的宏来减少运行时开销,或者在内存紧张时限制日志输出。 5. **日志存储**:考虑到手机的存储空间有限,日志文件可能需要定期清理或压缩。开发者需要考虑如何在不...
### 后台错误日志分析 #### 一、概述 后台错误日志是记录系统运行过程中出现异常情况的重要文档,对于排查问题、定位错误源有着不可替代的作用。本篇文章将根据给定的日志内容,详细解析其中涉及的技术知识点,...
此外,良好的日志设计原则包括但不限于:保持日志格式的一致性,使用有意义的错误码和消息,记录上下文信息(如调用堆栈、用户ID),并控制日志级别以平衡信息量和性能。在分布式系统中,日志的集中管理和分布式追踪...
不同的级别适用于不同的场景,例如在开发阶段通常使用`d`和`v`,而发布时则应尽量减少`v`级别的日志,只保留必要的`d`和`i`级别。 2. **自定义日志标签和过滤器** - 开发者可以设置自定义的日志标签,便于区分...
通过日志框架,我们可以设置不同级别的日志输出,如DEBUG、INFO、WARN、ERROR和FATAL,这样就可以在发生异常时立即得知,并记录下异常的详细信息,包括堆栈跟踪,这对于后期分析问题原因非常有帮助。 描述中提到的...
4. **堆栈跟踪**:当发生严重错误,如`FATAL`级别日志时,GLOG会自动打印出堆栈跟踪信息,帮助开发者定位问题发生的具体位置。 5. **崩溃恢复**:`FATAL`级别日志会触发程序的崩溃,但GLOG在崩溃前会尝试清理资源并...
对于Java等高级语言,JVM提供了堆栈跟踪信息,开发者可以通过日志或专门的异常处理器获取。 在压缩包文件"说明.txt"和"Under the Hood"中,可能包含了更详细的步骤、示例和工具使用说明。阅读这些文件可以帮助你...
- 使用异步日志处理机制可以减少日志记录对主线程的影响。 7. **日志分析工具** - 有许多工具可用于分析和可视化日志数据,如ELK(Elasticsearch、Logstash、Kibana)堆栈,它们可以帮助我们快速搜索、过滤和理解...
本文将深入探讨如何理解和利用高性能的堆栈跟踪,以提高错误日志的效率,以及在代码分析和度量中的应用。 堆栈跟踪是当程序抛出异常或通过其他方式触发时,系统记录的一系列方法调用的回溯。它显示了执行流程从发生...
在实际开发中,确保错误日志的详细性和可读性是至关重要的,这可以帮助你快速定位问题,减少调试时间。同时,合理地处理错误,避免因错误导致程序崩溃,可以提升用户体验。通过以上步骤,你可以在VB程序中构建一个...
当发生错误时,`fastify-logger`会自动捕获并记录错误信息,包括堆栈跟踪。这对于诊断和修复问题非常有用。 8. **与其他插件的集成** 由于Fastify的插件架构,`fastify-logger`可以与其他插件无缝集成,共同提供...
- 日志:记录程序运行过程中的事件、错误、警告和其他相关信息的文本文件,用于后续分析和问题定位。 - 日志级别:通常包括DEBUG、INFO、WARNING、ERROR和FATAL,不同级别对应不同的严重程度。 2. **C++日志库**...
7. **日志格式和内容**:为了便于后期分析,日志应包含足够的上下文信息,如线程ID、时间戳、调用堆栈等。这可以帮助开发者快速定位问题所在。 8. **分布式日志系统**:在大型分布式系统中,可能需要使用分布式日志...