日志规范

1、日志是什么

日志,维基百科中对其的定义是一个或多个由服务器自动创建和维护的日志文件,其中包含其所执行活动的列表。

一个打印良好的日志文件可为开发人员提供精确的系统记录,可辅助开发人员定位到系统错误发生的详情及根源。在Java应用程序中,通常使用日志文件来记录应用程序运行过程中的重要逻辑参数及异常错误,辅之日志采集系统(ELK、DTM)构建系统监控体系。

2、为什么记录日志

上文中提到日志可以提供精准的系统记录方便根因分析,那为什么要记录日志,记录日志有哪些作用呢?

  • 打印调试:用日志来记录变量或者某一段逻辑,记录程序运行的流程,即程序运行了哪些代码,方便排查逻辑问题。
  • 问题定位:程序出异常或者出故障时快速的定位问题,方便后期解决问题。因为线上生产环境无法 debug,在测试环境去模拟一套生产环境,费时费力。所以依靠日志记录的信息定位问题,这点非常重要。
  • 监控告警 & 用户行为审计:格式化后日志可以通过相关监控系统(AntMonitor)配置多维度的监控视图,让我们可以掌握系统运行情况或者记录用户的操作行为并对日志采集分析,用于建设业务大盘使用。

3、什么时候记录日志

上文说了日志的重要性,那么什么时候需要记录日志。

  • 代码初始化时或进入逻辑入口时:系统或者服务的启动参数。核心模块或者组件初始化过程中往往依赖一些关键配置,根据参数不同会提供不一样的服务。务必在这里记录 INFO 日志,打印出参数以及启动完成态服务表述。

  • 编程语言提示异常:这类捕获的异常是系统告知开发人员需要加以关注的,是质量非常高的报错。应当适当记录日志,根据实际结合业务的情况使用 WARN 或者 ERROR 级别。

  • 业务流程预期不符:项目代码中结果与期望不符时也是日志场景之一,简单来说所有流程分支都可以加入考虑。取决于开发人员判断能否容忍情形发生。常见的合适场景包括外部参数不正确,数据处理问题导致返回码不在合理范围内等等。

  • 系统/业务核心逻辑的关键动作:系统中核心角色触发的业务动作是需要多加关注的,是衡量系统正常运行的重要指标,建议记录 INFO 级别日志。

  • 第三方服务远程调用:微服务架构体系中有一个重要的点就是第三方永远不可信,对于第三方服务远程调用建议打印请求和响应的参数,方便在和各个终端定位问题,不会因为第三方服务日志的缺失变得手足无措。

4、日志规范

4.1、记录原则

  • 隔离性:日志输出不能影响系统正常运行;
  • 安全性:日志打印本身不能存在逻辑异常或漏洞,导致产生安全问题;
  • 数据安全:不允许输出机密、敏感信息,如用户联系方式、身份证号码、token等;
  • 可监控分析:日志可以提供给监控进行监控,分析系统进行分析;
  • 可定位排查:日志信息输出需有意义,需具有可读性,可供日常开发同学排查线上问题。

4.2、日志级别

  • DEBUG

DEUBG 级别的主要输出调试性质的内容,该级别日志主要用于在开发、测试阶段输出。该级别的日志应尽可能地详尽,开发人员可以将各类详细信息记录到 DEBUG 里,起到调试的作用,包括参数信息,调试细节信息,返回值信息等等,便于在开发、测试阶段出现问题或者异常时,对其进行分析。

  • INFO

INFO 级别的主要记录系统关键信息,旨在保留系统正常工作期间关键运行指标,开发人员可以将初始化系统配置、业务状态变化信息,或者用户业务流程中的核心处理记录到INFO日志中,方便日常运维工作以及错误回溯时上下文场景复现。建议在项目完成后,在测试环境将日志级别调成 INFO,然后通过 INFO 级别的信息看看是否能了解这个应用的运用情况,如果出现问题后是否这些日志能否提供有用的排查问题的信息。

  • WARN

WARN 级别的主要输出警告性质的内容,这些内容是可以预知且是有规划的,比如,某个方法入参为空或者该参数的值不满足运行该方法的条件时。在 WARN 级别的时应输出较为详尽的信息,以便于事后对日志进行分析。

  • ERROR

ERROR 级别主要针对于一些不可预知的信息,诸如:错误、异常等,比如,在 catch 块中抓获的网络通信、数据库连接等异常,若异常对系统的整个流程影响不大,可以使用 WARN 级别日志输出。在输出 ERROR 级别的日志时,尽量多地输出方法入参数、方法执行过程中产生的对象等数据,在带有错误、异常对象的数据时,需要将该对象一并输出。

4.3、日志格式

  • 摘要日志

摘要日志是格式化的标准日志文件,可用于监控系统进行监控配置和离线日志分析的日志,通常系统对外提供的服务以及集成的第三方服务都需要打印对应的服务摘要日志,摘要日志格式一般需包含以下几类关键信息:

// 调用时间、日志链路id(traceId、rpcId)、线程名、接口名、方法名、调用耗时、调用是否成功(Y/N)、错误码、系统上下文信息(调用系统名、调用系统ip、调用时间戳、是否压测(Y/N))

2022-12-12 06:05:05,129 [0b26053315407142451016402ee359 0.3 - /// - ] INFO [SofaBizProcessor-4-thread-333] - [(MerchantClassificationQueryFacade,queryByTargetAndKeys,1ms,Y,SUCCESS)(mrchprod,33.159.242.97,1670838702087,Y)
  • 详细日志

详细日志是用于补充摘要日志中的一些业务参数的日志文件,用于问题排查。详细日志一般包含以下几类信息:

// 调用时间、日志链路id(traceId、rpcId)、线程名、接口名、方法名、调用耗时、调用是否成功(Y/N)、错误码、系统上下文信息(调用系统名、调用系统ip、调用时间戳、是否压测(Y/N))、请求入参、请求出参

2022-12-12 06:05:05,129 [0b26053315407142451016402ee359 0.3 - /// - ] INFO [SofaBizProcessor-4-thread-333] - [(MerchantClassificationQueryFacade,queryByTargetAndKeys,1ms,Y,SUCCESS)(mrchprod,33.159.242.97,1670838702087,Y)(2088123456789,mid)(xxxx)
  • 业务执行日志

业务执行日志就是系统执行过程中输出的日志,一般没有特定格式,是开发人员用于跟踪代码执行逻辑而打印的日志,个人看来在摘要日志、详细日志、错误日志齐全的情况下,需要打印系统执行日志的地方比较少。如果一定要打印业务执行日志,需要关注以下几个点:

  1. 这个日志是否一定要打印?如果不打印是否会影响后续问题排查,如果打印这个日志后续输出频率是否会太高,造成线上日志打印过多。

  2. 日志格式是否辨识度高?如果后续对该条日志进行监控或清洗,是否存在无法与其他日志区分或者每次打印的日志格式都不一致的问题?

  3. 输出当前执行的关键步骤和描述,明确的表述出打印该条日志的作用,方便后续维护人员阅读。

  4. 日志中需包含明确的打印意义,当前执行步骤的关键参数。

[scene_bind_feature][feature_exists]功能已经存在[tagSource='MIF_TAG',tagValue='123']
posted @ 2023-07-01 11:47  生活是很好玩的  阅读(54)  评论(0编辑  收藏  举报