日志系统规范

日志系统规范

一、日志通用类型

日志消息可以分成下面的几种通用类型:

  • 信息:这种类型的消息被设计成告诉用户和管理员一些没有风险的事情发生了。例如应用重启的时候生成消息。不过,需要注意的是,如果重启发生在非正常维护时间或是业务时间,就有发出报警的理由。
  • 调试:软件系统在应用程序代码运行时发生调试信息,是为了给软件开发人员提供故障检测和定位问题的帮助。
  • 警告:警告消息是在系统需要或者丢失东西,而又不影响操作系统的情况下发生的。
  • 错误:错误日志消息是用来传达在计算机系统中出现的各种级别的错误。
  • 警报:警报是指用户针对特殊性质的事件需要额外的通知的情况,并不是硬性规定,例如有非法连接、爬虫等。

二、日志系统信息

2.1. 基本信息

  • 打印时间
  • 线程名
  • 日志级别
  • 日志名
  • 主体打印信息

2.2. 可选信息,但可能影响性能

  • 全限定类名
  • java源文件名
  • 行号
  • 方法名

2.3. 用户自定义附加信息

  • 主机IP
  • 主机名(可选)
  • 项目名(可选)
  • 服务名
  • 请求IP
  • 请求来源(web/安卓/ios)
  • 用户ID
  • 用户名(可选,用于方便查询)
  • 请求ID(需要链路追踪时必须,否则可选)

2.4. 信息打印pattern(以logback为例)

由于ELK采集日志可能需要进行多行匹配,多行匹配的匹配规则一般是以一个行起始标志${start_flag}开始,故存在该标志时,该标志必须排序行首,一般默认为[,而除此之外其他信息的排序以及分隔符均可自定义,只需要打印的顺序与logstash处理时的grok表达式对应即可。logback的pattern例子如下:

[%d{yyyy-MM-dd HH:mm:ss.SSSZZ}] %-5level %thread %logger - [%msg] %F,%L,%C,%M ## '%ex' %X{hostName} %X{hostIp} %X{applicationName} %X{...}%n

三、日志框架的日志级别及其留存期

因不同日志级别可能输出不同的日志文件,不同级别日志文件有不同的打印量级,故需要设置不同的留存期,具体建议如下:

日志级别留存期(建议范围,可按项目实际减少或增加)
TRACE1d-3d
DEBUG1d-3d
INFO3d-15d
WARN30d-90d
ERROR30d-90d

为了实现留存期,需要进行定时删除过期日志文件及其持久化数据

  • 通过日志框架的留存期控制日志文件留存期
  • 通过crontab添加sh脚本定时删除超过留存期的index
  • kafka消息按上述日志级别最大的留存期

四、ELK日志系统中的数据流动

下面命名中"-“可按需替换成其他符号,如”_"。

日志类型filebeat采集后存储到kafka的topiclogstash消费kafka的topic后存储到es的index名(看情况需要增加日志级别)
非docker容器日志${project}-${app}-log${project}-${app}-log-${env}(-${level})
docker容器日志${project}-docker-log / ${project}-${app}-log${project}-docker-log-${env}(-${level}) /${project}-${app}-log-${env}(-${level})
mysql慢sql日志${project}-mysql-slow-log${project}-mysql-slow-log
mysql错误日志${project}-mysql-error-log${project}-mysql-error-log
nginx访问日志${project}-mysql-access-log${project}-mysql-access-log
nginx错误日志${project}-mysql-error-log${project}-mysql-error-log

其中docker容器日志在没有用户自定义附加信息-服务名的情况下,无法区分日志是产生自哪个微服务容器的,故可能需要统一存储在一个index中。如果日志打印附带了微服务的应用名,那么在logstash处理时可以存储到指定服务名的index中。

五、日志存储按日期与不按日期的比较

5.1. 按日期存储日志

  • index样式为:${log-name}-${yyyy-MM-dd}
  • 方便直接清除超过留存期的日志
  • 跨天日志查询不太方便
  • 无法直接聚合分析多天的日志数据,需要分开每个index进行聚合分析

5.2. 不按日期存储日志

  • index样式为:${log-name}
  • 难以直接清除超过留存期的日志,需要删除index中的过时数据
  • 所有查询均可
  • 可直接聚合分析连续多天的日志数据

版权声明:本文为a7151593原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。