日志的几大类:调试日志、业务日志、错误日志。一个软件产品上线后,都会关闭调试日志。本文的日志,重点讨论尝试以一种相对灵活的方法呈现监控和错误日志,满足技术/运维侧发现技术层面的一些问题。

以前的业务日志,主要是审计用途的,描述的内容如果用自然语言来说的话,就是:谁在什么时候、什么地方(IP等)、以什么方式(PC端、移动端、短信应答等)、对什么对象、做了一个怎样的操作、结果如何(成功还是失败)。

今天的问题已经远比以前复杂了,而且也对日志提出了更多要求,期望从日志中能够挖掘更多的信息,总结过去并能展望未来。

日志的内容:

根据这些内容,是完全可以胜任以前的那种审计工作的,但同时具备更多的信息:

  1. 错误码(或者返回码,参考《接口的返回码》)可以指导这个为何出错,并能传递给各个环节均是因为这个原因出错
  2. 跟踪信息,可以把分布式环境下的运行日志穿起来,看问题的来龙去脉,看系统运行的过程
  3. 入参和出参和异常,分析和重现问题发生的场景

这些信息在不同的场景下输出内容不尽相同:

  1. 只有错误日志或者特定调试时才需要打印入参、出参
  2. 正常场景下只需要打印监控信息即可
  3. 避免一个线程中的一个异常被不同的嵌入调用的过程中反复打印

日志发生的对象

我们把日志的对象分成两类,区别在于不同的对象记录日志过程中的处理方式存在较大差别,如下:

入口类的特殊性在于,他是一段日志的开始也是日志的结束,对日志的处理与过程不同。而过程类主要是记录监控日志以及错误的时候处理错误日志。

使用AOP实现日志,前面讲的挺多了,就不过分罗列代码了

1、定义日志注解

@Target({Elemen}) @Retention) @Documented @Order) public @interface LogPoint { String businessTag(); Format format() default Format.TEXT; Level level() default Level.INFO; String[] encryptArgs() default ""; boolean isEntrance() default false; enum Format { JSON, TEXT } enum Level { ERROR, INFO } }

2、定义注解拦截器

@Aspect public class LogRecorder { private final static DateTimeFormatter DF = Da("yyyy-MM-dd HH:mm:ss.SSS"); private final static AtomicLong COUNTER = new AtomicLong(1000000); @Value("${}") private String applicationName; @Around("@annotation(LogPoint)") public Object log(ProceedingJoinPoint pjp) throws Throwable { final long start = Sy(); final long end; final long count = COUNTER.incrementAndGet(); Throwable t = null; Object result = null; Class<?> classTarget = ().getClass(); Method currentMethod = LogU(pjp); Object[] args = (); Logable log = curren); Logger detailLogger = LogU() + "-detail"); try { result = (); } catch (Throwable t1) { t = t1; } finally { end = Sy(); } String businessCode = "-"; If(t!= null && t instanceof AppException) { businessCode=((AppException)t).getCode(); } //已经准备好全部信息了,可以打印日志了,可以输出json或者text的日志,可以打印到文件或者放入kafka队列,或者根据不同的级别输出不同的内容 if (t == null) { return result; } else { throw t; } }

3、在业务上使用注解

@LogPoint("User") Public User create(String username, String nickname){ u(xxxx); }

4、日志样例

日志的处理

日志生成后,可以使用flume等工具进行汇聚,进而使用Spark等大数据框架分析和挖掘,后续继续讲这些。

日志的一些应用场景

  1. 追踪业务的调用过程,分析和优化不合理的地方,前些时候,我们系统发现一笔订单调用另一个系统10多次,分析发现,双方接口粒度太小,果断重构优化
  2. 监控方法的执行时长,发现系统变更趋势,优化系统对受限资源的访问
  3. 异常时,打印输入参数,重现异常场景
  4. 监控各种异常码,并针对异常码优化,例如,某某上游失败明显增加、从某某银行的卡片发出的快捷支付失败率增加

欢迎留言交流,一起构建高效可用的业务系统日志。

1.《日志数据如何设计与实现、如何查询日志数据?》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《日志数据如何设计与实现、如何查询日志数据?》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/keji/3299585.html