运维那些事之日志
日志定义与类型
日志:用于保存系统事件信息和操作信息的管理对象;是我们了解程序运行轨迹的重要手段。
日志按照使用基本场景划分为操作日志、运行日志、安全日志、调试日志等类别。
操作日志:记录设备操作维护人员(包括系统管理员、操作维护员、系统监控人员等)下发或通过设置相关的自动化任务下发的命令(非安全类命令)。
运行日志:记录系统的运行状况或执行流程中的一些关键信息。
安全日志:记录系统用户(包括系统管理员、操作维护员、系统监控员等)登录、注销和鉴权,增加、删除用户,用户的锁定和解锁,角色权限变更,系统相关安全配置(如安全日志内容配置)变更等活动。
调试日志:记录调试级别的相关信息,一般用于跟踪运行路径,如记录函数的进入和退出等,大部分为代码级的信息输出,调试日志用于产品研发人员定位复杂的问题。
日志记录的事件信息用于有效支撑后续的故障定界定位,亚健康检测等维护活动;日志数据还可用于挖掘、聚类等智能分析活动;为方便后续统一处理对日志内容格式、存储等制定格式规范 以运行日志为例:
字段名称
约束(必选M/可选O)
字段说明
时间(Time)
M
日志发生时间,格式遵守《华为公司软件本地化规范V2.0》,为网元本地时间+与UTC的时间偏移+夏令时标记(可选),如:
2015-07-20 15:02:01+05:30 或
2015-07-20 15:02:01.012+05:30
级别(Severity)
M
包括:CRITICAL(紧急)、ERROR(错误)、WARN(警告)、INFO(信息)、DEBUG(调试)五个级别。
源(Source)
O
如设备的名称或设备的IP地址等唯一标识设备的信息。本字段条件可选,如果在日志名称中未包含此信息,则需要在日志中包含此字段。
服务/模(Service/Module)
O
创建该日志记录的服务名称或模块名称。
运行信息(Info)
M
记录的系统运行中的所发生的相关事件和信息。
附加信息(AdditionInfo)
O
附加信息,对上述运行信息的补充,如错误码,如果没有可不填。附加信息需按照key=value格式记录。
日志点:系统中需要打印输出日志的位置;日志点设计中首先需要明确日志点设置的原则,一般对系统、业务逻辑有重要影响的地方都需要考虑日志点打印。包括但不限于:
任务、线程等启动、关闭处;
操作入口处和设置预置条件处;
状态设置、状态迁移处;
消息收发、编解码处;
资源创建、存取、释放、大小改变、并发处理(如临界点)等处;
业务相关资源统计处等;
接口调用、函数调用等所有调用入口或出口处
常用日志通用打印框架
日志是我们了解系统运行状况和故障定界定位的重要手段,各大主流语言都提供了日志打印框架下面以java 为例介绍主要的日志打印框架:
j.u.l
j.u.l是java.util.logging包的简称,是JDK在1.4版本中引入的Java原生日志框架。Java Logging API提供了七个日志级别用来控制输出。这七个级别分别是:SEVERE、WARNING、INFO、CONFIG、FINE、FINER、FINEST。
Log4j
Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;
通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。Log4也有七种日志级别:OFF、FATAL、ERROR、WARN、INFO、DEBUG和TRACE。可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
LogBack
LogBack也是一个很成熟的日志框架,其实LogBack和Log4j出自一个人之手,这个人就是Ceki Gülcü。
logback当前分成三个模块:logback-core,logback- classic和logback-access。
logback-core是其它两个模块的基础模块。
logback-classic是Log4j的一个改良版本。此外logback-classic完整实现SLF4J API使你可以很方便地更换成其它日记系统如Log4j或j.u.l。级别包括:TRACE、DEBUG、INFO、WARN 和 ERROR,定义于ch.qos.logback.classic.Level类
logback-access访问模块与Servlet容器集成提供通过Http来访问日记的功能。
Log4j2
前面介绍过Log4j,这里要单独介绍一下Log4j2,之所以要单独拿出来说,而没有和Log4j放在一起介绍,是因为作者认为,Log4j2已经不仅仅是Log4j的一个升级版本了,而是从头到尾被重写的,这可以认为这其实就是完全不同的两个框架。
关于Log4j2解决了Log4j的哪些问题,Log4j2相比较于Log4j、j.u.l和logback有哪些优势 我会单独写篇文章记录。
常用日志门面打印框架
前面介绍了四种日志框架,也就是说,我们想要在应用中打印日志的时候,可以使用以上四种类库中的任意一种。比如想要使用Log4j,那么只要依赖Log4j的jar包,配置好配置文件并且在代码中使用其API打印日志就可以了。
但看过《阿里巴巴Java开发手册》同学可以发现,其中有一条规范做了『强制』要求:
![1f641a7db67ea38b408359e8aaa72306.png](https://i-blog.csdnimg.cn/blog_migrate/09b6e37a952b7565932030cd08d634a7.jpeg)
先了解下什么是 门面模式(Facade Pattern),也称之为外观模式,其核心为:外部与一个子系统的通信必须通过一个统一的外观对象进行,使得子系统更易于使用。终极目标是实现架构解耦,防止模块内部细节的变化影响其应用者。
![321d267fb6567b9fe33c7f6e8ccca3e9.png](https://i-blog.csdnimg.cn/blog_migrate/9131b5493d853559e736404f07a10dd1.jpeg)
就像前面介绍的几种日志框架一样,每种日志框架都有自己单独的API,要使用对应的框架就要使用其对应的API,这就大大的增加应用程序代码对于日志框架的耦合性。我们看看Java生态体系中有哪些好的日志门面的实现可供选择。
Apache Commons Logging (JCL)
Jakarta Commons-logging(JCL)是apache最早提供的日志的门面接口。提供简单的日志实现以及日志解耦功能。
JCL能够选择使用Log4j或JDK Logging,但是他不依赖Log4j,JDK Logging的API。如果项目的classpath中包含了log4j的类库,就会使用log4j,否则就使用JDK Logging。使用commons-logging能够灵活的选择使用那些日志方式,而且不需要修改源代码。(类似于JDBC的API接口)
SLF4J
Java简易日志门面(Simple Logging Facade for Java,缩写SLF4J),是一套包装Logging 框架的界面程式,以外观模式实现。可以在软件部署的时候决定要使用的 Logging 框架,目前主要支援的有Java Logging API、Log4j及logback等框架。以MIT 授权方式发布。SLF4J 的作者就是 Log4j和Logback 的作者 Ceki Gülcü,他宣称 SLF4J 比 Log4j 更有效率,而且比 Apache Commons Logging (JCL) 简单、稳定。其实,SLF4J其实只是一个门面服务而已,他并不是真正的日志框架,真正的日志的输出相关的实现还是要依赖Log4j、logback等日志框架的。
总结:关于日志打印框架 主要两类框架,一类是日志框架,主要用来进行日志的输出的,比如输出到哪个文件,日志格式如何等。 另外一类是日志门面,主要一套通用的API,用来屏蔽各个日志框架之间的差异的。
写在最后:最佳实践就是在应用中使用如Log4j + SLF4J 这样的组合来进行日志输出。这样做的最大好处,就是业务层的开发不需要关心底层日志框架的实现及细节,在编码的时候也不需要考虑日后更换框架所带来的成本。这也是门面模式所带来的好处。