日志系统与Logback

358 阅读3分钟

日志系统设计

日志需求

  1. 日志消息输出方式多样:除了能打印到控制台, 还可以输出到文件,甚至可以通过邮件发送出去(例如生成环境出错的消息)
  2. 日志内容格式化:例如变成纯文本,XML, HTML格式等等
  3. 类或包可自定义输出不同文件:对于不同的Java class,不同的 package , 还有不同级别的日志,应该可以灵活地输出到不同的文件中
    • 如对于com.foo 这个package,所有的日志都输出到 foo.log 文件中
    • 对于com.bar 这个package ,所有文件都输出到bar. log文件中
    • 对于所有的ERROR级别的日志,都输出到 errors.log文件中
  1. 日志进行分级:有些日志纯属debug , 在本机或者测试环境使用, 方便程序员的调试, 生产环境完全不需要。有些日志是描述错误(error)的, 在生产环境下出错的话必须要记录下来,帮助后续的分析。

系统设计

1、 Appender 接口: 可以控制日志输出地址

2、 Formatter 接口: 格式化消息

Appender 引用Formatter ,对LoggingEvent记录格式化后发送

3、 Logger 接口: 可指定对应的包或类

4 、 日志分级: Priority 类(DEBUG、INFO、WARN、ERROR、FATAL)

Appender与Logger上加Priority 属性,按日志级别控制输出

系统设计的正交性

将以上接口看做坐标系中XYZ轴,变化都被封装在一个维度上,可以把这些概念任意组合

系统扩展性

SLF4J(Simple Logging Facade for Java):日志工具使用存在差别,如果想更换日志组件,就要更改代码,SLF4J通过门面模式,将市面上的日志组件接口统一,做到代码层面无感知切换底层实现

Logback 配置详解

logback 架构

Logger, Appenders and Layouts

Logback日志框架分为三部分:

  • logback-core: logback的基础模块,是其他两个模块的基础
  • logback-classic:log4j 1.x 的显著改进版本,并且实现了原生的SLF4J API
  • logback-access:与Tomcat和Jetty等Servlet容器集成,以提供HTTP访问日志功能

logback主要由下面三部分组成:

  • Logger —— 日志记录器,定义日志类型、级别;
  • Appender —— 指定日志的输出方式和目的地;
  • Encoder/Layout —— 格式化日志信息;

Logger Context 上下文

任何日志 API 的优势在于它能够禁止某些日志的输出,但是又不会妨碍另一些日志的输出。

在 logback-classic 中,分类是 logger 的一部分,每一个 logger 都依附在 LoggerContext 上,它负责产生 logger,并且通过一个树状的层级结构来进行管理

如果一个 logger 的名字加上一个 . 作为另一个 logger 名字的前缀,那么该 logger 就是另一个 logger 的祖先。如果一个 logger 与另一个 logger 之间没有其它的 logger ,则该 logger 就是另一个 logger 的父级

Effective Level aka Level Inheritance 有效级别与级别继承

Logger 能够被分成不同的等级。不同的等级(TRACE, DEBUG, INFO, WARN, ERROR)

对于一个给定的名为 L 的 logger,它的有效层级为从自身一直回溯到 root logger,直到找到第一个不为空的层级作为自己的层级

日志层级与打印规则

日志的打印级别为 p,Logger 实例的级别为 q,如果 p >= q,则该条日志可以打印出来。

各级别的排序为:TRACE < DEBUG < INFO < WARN < ERROR

日志打印规范

1. DEBUG:打印一些数据违反约束的事件以及不太调用不太成熟的API
	(即使调用结果返回成功),DEBUG级别日志在生产环境中应减少使用,
	只留下有意义的部分
2. INFO:打印程序开始或者退出的消息;
	删除及更新等DML类型的操作,注意查询类的操作不建议记录日志,
	需要审计的信息
3. ERROR:打印异常日志如网络不通,
	数据库连接失败,或者说比较成熟的API调用结果返回错误等等

参考链接:

mp.weixin.qq.com/s/8VvBdRH_Y…

logback.qos.ch/manual/intr…

github.com/YLongo/logb…