谈谈 Java 日志

点击下方关注我,然后右上角点击...“设为星标”,就能第一时间收到更新推送啦~~~

日志:就是介绍一个过程和经历的详细记录。项目日志:就是项目开发过程的详细记录,一般由项目经理记录。代码里的日志:就是程序员记录某个开发过程的详细情况,这是项目里每个程序员需要做的工作。

代码里的日志在项目中扮演着非常重要的角色,日志记录的详细程度决定系统是否容易维护,Java 项目中日志记录的框架有很多,在项目中如何选型也必将困惑。

1

日志在项目中的作用

73faca439817c7fa4bc346b63a028356.png

Log 日志,主要用于记录程序运行的情况,以便于程序在部署之后的排错调试等,也有利于将这些信息进行持久化(如果不将日志信息保存到文件或数据库,则信息便会丢失)。

1、查看程序当前运行状态

如果想了解程序当前的运行情况,我们通过实时查看应用日志的输出,就能进行分析。

比如,你在浏览器里输入一个 action 地址,该 url 负责执行一些批量处理,action 运行后,假设处理比较耗时,你再浏览器里无法直接看到程序的执行结果,此时,你可以打开系统日志,通过从日志输出信息就能轻松地分析该 url 的执行情况

2、查看程序历史运行轨迹

如果想了解历时程序的运行情况,我们通过查看应用历时日志的输出,就能进行分析。

比如,你想了解下上周周末用户访问量,你可以打开系统上周周末的日志记录,进行分析。你想了解昨天的某个定时任务是否正常执行,你可以打开昨天的系统日志,精确查找该定时任务的输出信息,从而判断定时任务是否执行。

3、排查系统问题

排查系统问题是程序员最熟悉的味道了,在项目维护过程中,出了任何问题,都需要程序员去进行排查。此时,如果没有清楚明了的日志记录,想要核查出问题的原因,难于上青天。

一个优秀的程序员一定是个日志记录高手,如果日志记录的好,处理得当,排查问题则易如反掌。

大家有没有遇到一种场景,一个问题发生了,有的人能迅速定位问题并解决,有的人搞了半天,还没发现问题的产生原因。

其实快速定位问题的人一定记录了详细的日志,因此当问题发生的时候,通过核查问题发生时候的日志,就能快速地找出问题产生的原因。

4、优化系统性能

通过记录程序运行的时间,就能判断程序从执行开始到执行结束消耗的时间,从而判断系统性能是否达标,为系统性能优化提供判断依据。

5、安全审计的基石

网络安全越来越受到大家的关注,所以系统安全目前是项目过程非常重要的一个环节,安全审计也是系统中非常重要的部分。

通过系统日志分析,可以判断一些非法攻击,非法调用,以及系统处理过程中的安全隐患。

比如,大家平时都在做运营系统,其中运营人员在通过界面处理一些数据的时候,如果没有清楚的日志操作记录,一条数据被删除或者修改,你是无法找到是谁操作的,但是如果你做了相应的记录,该数据被谁删除或者修改就会一目了然。

通过以上 5 点说明了日志在项目维护过程中的重要作用。

一个系统是否容易维护,很大程度上是基于程序员在程序开发过程中的代码日志是怎么记录的。

日志记录越清楚,维护起来就越容易,有的程序员没有日志记录意识,或者对日志记录认识不清,或者是不知道日志该如何记录,这势必会给项目后期的维护带来一个个大坑。

当项目经理让你解决一个线上问题的时候,正好遇到了一个没有日志记录习惯的人写的代码,你就能体会到那种痛苦,不由地想要爆粗口。

因此,作为一个程序员来说,掌握代码日志的记录方法,是程序员生涯的一项基本功。写代码时做好日志记录是“即利人又利己”的做法,不写日志记录就是“损人不利己”的做法。

2

Java 日志使用的困惑

6ad0288a900135b2e3866e3e5b8ffeb7.png

大多数的程序员都能认识到日志在项目中的重要性,可是对日志记录具体要怎么做,做到什么程度,日志记录用什么工具,会有很多困惑。

1、工具困惑

作为 Java 程序员,幸运的是,Java 拥有功能和性能都非常强大的日志库;不幸的是,这样的日志库有不止一个,相信每个人都会对JUL(Java Util Log)、JCL(Commons Logging)、Log4j、SLF4J、Logback、Log4j2 等等的日志工具,到底使用什么产生感到困扰。

想要解开这个困扰,需要了解 Java 日志演化历史。

最先出现的是 Apache 开源社区的 Log4j,这个日志确实是应用最广泛的日志工具,成为了 Java 日志的事实上的标准。

然而,当时 Java 的开发主体 Sun 公司认为自己才是正统,在 Jdk1.4中增加了 JUL(在java.util.logging包下)日志实现,企图对抗 Log4j,但是却造成了 Java 目前开发者记录日志局面的混乱,迄今为止仍饱受诟病。

当然也有其他日志工具的出现,基本都是各自为政,这些日志系统互相没有关联。

为什么 JUL 的出现会导致开发局面混乱呢?

想象下你的项目应用使用 Log4j,然后使用了一个第三方库,而第三方库使用了 JUL,那么,你的应用就得同时使用 Log4j 和JUL两个日志工具了,然后又有需要使用另外一个第三方库,但是这个第三方库使用了 Log4j 和 JUL 之外的 simplelog。这个时候你的应用里各种 log 工具满天飞,这势必会使你的程序员感到崩溃。因为这些日志工具互相没有关联,替换和统一日志工具也就变成了比较棘手的一件事情。

如果你遇到了这种问题,你该如何解决呢?

解决这个问题,我们会用到一个设计模式——“适配器模式”,即把这个问题进行抽象,抽象出一个接口层,对每个日志实现都进行适配,这样这些提供给别人的库都直接使用抽象的接口层即可。

为了搞定这个日常开发中比较棘手的问题,Apache 开源社区提供了一个日志框架作为日志的抽象,叫 commons-logging,也被称为 JCL(java common logging),JCL 对各种日志接口进行抽象,抽象出一个接口层,对每个日志实现都进行适配,这样这些提供给别人的库都直接使用抽象层即可,确实出色地完成了兼容主流的日志实现(Log4j、JUL、simplelog 等),较好的解决了上述问题,基本一统江湖,就连顶顶大名的 spring 也是依赖了 JCL。

但是美好的日子并不长,作为元老级日志 Log4j 的作者 (Ceki Gülcü),他觉得 JCL 不够优秀,所以他再度出山,搞出了一套更优雅的日志框架 SLF4J(这个也是抽象层),即简单日志门面(Simple Logging Facade for Java),并为 SLF4J 实现了一个亲儿子——logback,确实更加优雅了。

最后,Ceki Gülcü 觉得还是得照顾下自己的 “大儿子”——Log4j,又把 Log4j 进行了改造,就是所谓的 Log4j2,同时支持 JCL 以及 SLF4J。

SLF4J 的出现,又使 Java 日志体系变得混乱起来。

下面是一张目前 Java 日志体系的示意图:

谈谈 Java 日志_第1张图片

日志库 Log4j,JUL,logback 是互相不兼容的,没有共同的 Interface,所以 commons-logging、SLF4J 通过适配器模式,抽象出来一个共同的接口,然后根据使用的具体日志框架来实现日志。

java common logging 和 SLF4J 都是日志的接口,供用户使用,而没有提供实现,Log4j,JUL,logback 等等才是日志的真正实现。

当我们调用日志接口时,接口会自动寻找恰当的实现,返回一个合适的实例给我们服务。这些过程都是透明化的,用户不需要进行任何操作。

下面是几个常用日志工具的官方网站。

工具 官方网站
Log4j http://logging.apache.org/log4j/1.2
JCL http://commons.apache.org/proper/commons-logging/
SLF4J http://www.slf4j.org
logback http://logback.qos.ch
Log4j2 https://logging.apache.org/log4j/2.x/

2、使用困惑

有的程序员即使知道写 Java 程序用什么日志工具,可能对日志记录具体应该怎么写,写什么东西,什么情况下要写,这些仁者见仁智者见智的东西也会产生困扰。

项目中日志记录遵守哪些原则:

1) 阿里巴巴 Java 开发手册的日志规约

大家可以参考阿里推出的《阿里巴巴 Java 开发手册(终极版).pdf》里的第二章第二节“日志规约”部分的内容。

2)记录项目日志要注意以下几点:

  • 注意日志级别,尤其是 info 和 error 不能用混。

  • 注意记录信息的准确性,切忌日志表达不清楚。

  • 注意不同的代码段日志说明不能重复。

  • 捕获异常后,要及时记录异常详细信息,并把异常传递到外部。

  • 时刻铭记,日志的记录是为了后期查询问题带来方便,因此重要的代码务必要记录日志。

有的程序员知道了该用哪个 Java 框架,也知道了日志记录的原则,可能还会对具体在项目中到底该如何操作产生困惑。

后面将为大家介绍 Java 项目日志实例基础。

你可能感兴趣的:(谈谈 Java 日志)