经过自己研究,可以找到如下解决方案
- 利用MDC 日志传递属性,MDC是线程安全的,但是在线程池的时候要执行完成时候注意clean属性
- 自定义layout 扩展日志格式传递到elk里面进行分析
- 定义append只传递error等级日志
- 新建filter 向MDC 设置环境信息
- 全局绑定唯一traceId
上面的话基本可以解决web访问的跟踪,可以从错误日志里面看到相关的设备,用户信息,传递参数
但非web访问的错误记录怎样记录呢,比如async,schedule 这些执行出现错误怎么跟踪
继承 ThreadPoolTaskScheduler,重写schedule方法,生成唯一traceID
public ScheduledFuture<?> schedule(Runnable task, Trigger trigger) {
return super.schedule(ThreadMdcUtil.wrap(task,MDC.getCopyOfContextMap()), trigger);
}
怎样报警呢
- 策略1,如果再短时间发现多个用户(根据用户设备id判断-因为有可能用户未登录)发生同一个错误,马上告警
- 策略2 ,如果短时间发现同一个错误出现多次,马上告警
- 可以通过定义不用的异常类,那些要处理的,那些不用处理的,这样程序容易过滤,开发者只关心那些不能处理的异常
找到traceId,怎样快速再打日志文件查找上下文信息呢
- 后台可以可以每小时分割日志,这样通过时间点去找到日志再grep traceId就可以找到所有traceId的所有等级的日志,比如sql的查询语句