日志系统设计
日志需求
- 日志消息输出方式多样:除了能打印到控制台, 还可以输出到文件,甚至可以通过邮件发送出去(例如生成环境出错的消息)
- 日志内容格式化:例如变成纯文本,XML, HTML格式等等
- 类或包可自定义输出不同文件:对于不同的Java class,不同的 package , 还有不同级别的日志,应该可以灵活地输出到不同的文件中
-
- 如对于com.foo 这个package,所有的日志都输出到 foo.log 文件中
- 对于com.bar 这个package ,所有文件都输出到bar. log文件中
- 对于所有的ERROR级别的日志,都输出到 errors.log文件中
- 日志进行分级:有些日志纯属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调用结果返回错误等等
参考链接: