打日志那点儿事(上)日志打印基本框架、门面介绍

163 阅读3分钟

「这是我参与2022首次更文挑战的第 1 天,活动详情查看:2022首次更文挑战

心血来潮,写一些实际开发过程中探索的问题和知识。

日志是什么

作为后端开发,我们通常说的日志指服务器日志,维基百科的定义是:一个或多个由服务器自动创建和维护的日志文件,其中包含其所执行活动的列表。简单的说,就是记录服务器执行动作的文件。

那么打日志,就是记录日志文件的过程。

为什么要打日志

程序在运行的过程中,如果运行结果不符合预期,怎么分析问题?此时就需要日志的辅助,我们知道服务器执行了哪些动作、没有执行哪些动作、执行结果是什么,才能判断问题出现在哪里。

简单的说,打日志就是为了问题排查

怎么打日志

首先了解下日志门面日志框架的概念。

  • 日志门面:只提供 Log API,不提供实现。作用:对应用和日志框架进行解耦,在应用中屏蔽框架的具体实现。
  • 日志框架:日志的具体实现。

日志门面与日志框架的关系如下:

1.png

一般以 Java 作为开发语言时,开发人员会通过日志门面去打印日志。

常见的日志框架

框架说明年代使用情况
Log4j即 log4j 1,Apache 的第一代开源日志组件1999~2015停止维护,不推荐使用
JULjava.util.logging 简称,是 Java 内置的日志模块,Java 1.4 引入2002 至今使用方便,不需要引入第三方类库,但大型应用几乎不用
Logbacklog4j 的作者离开 Apache 后开发的日志组件2006 至今常用
Log4j 2log4j 的升级版本,也吸收了 Logback 中的优秀设计2014 至今(最新)常用

*在 Log4j 被 Apache Foundation 收入门下之后,由于理念不合,Log4j 的作者 Ceki 离开并开发了 SLF4J 和 Logback。

常见的日志门面

门面说明原理使用情况
JCLApache 推出,原名 Jakarta Commons Logging动态查找机制,在程序运行时,使用自己的 ClassLoader 寻找和载入本地具体的实现由于效率和 API 设计等问题,很少使用
SLF4J即 Simple Logging Facade for Java编译期间,静态绑定本地的LOG库常用

更多差别见:Simplifying the distinction between SL4J and commons logging

日志打印实践:SLF4J+Log4j 2

日志级别

log4j 推荐使用的日志级别有如下 4 个。

级别说明使用情况
DEBUG相对详细的追踪,一般是开发人员调试使用很少使用
INFO对系统管理员有用的信息,一般是重要的应用处理流程常用
WARN应用处理流程可以继续,但存在潜在问题的情况较常用
ERROR发生了可能会影响应用执行的错误,需要开发人员马上处理常用

日志打印示例

class LogTest {
    private static final Logger LOGGER = LoggerFactory.getLogger(LogTest.class);
    
    public void process(long id) {
        LOGGER.info("process方法入参id:{}", id);
        try {
            //程序体
        } catch(Exception e) {
            //catch异常后,需要输出日志辅助判断
            LOGGER.error("process方法入参id:{},error:", id, e); //打印异常栈
            //异常处理程序段
        }
    }
}