「这是我参与2022首次更文挑战的第 1 天,活动详情查看:2022首次更文挑战」
心血来潮,写一些实际开发过程中探索的问题和知识。
日志是什么
作为后端开发,我们通常说的日志指服务器日志,维基百科的定义是:一个或多个由服务器自动创建和维护的日志文件,其中包含其所执行活动的列表。简单的说,就是记录服务器执行动作的文件。
那么打日志,就是记录日志文件的过程。
为什么要打日志
程序在运行的过程中,如果运行结果不符合预期,怎么分析问题?此时就需要日志的辅助,我们知道服务器执行了哪些动作、没有执行哪些动作、执行结果是什么
,才能判断问题出现在哪里。
简单的说,打日志就是为了问题排查。
怎么打日志
首先了解下日志门面
和日志框架
的概念。
- 日志门面:只提供 Log API,不提供实现。作用:对应用和日志框架进行解耦,在应用中屏蔽框架的具体实现。
- 日志框架:日志的具体实现。
日志门面与日志框架的关系如下:
一般以 Java 作为开发语言时,开发人员会通过日志门面去打印日志。
常见的日志框架
框架 | 说明 | 年代 | 使用情况 |
---|---|---|---|
Log4j | 即 log4j 1,Apache 的第一代开源日志组件 | 1999~2015 | 停止维护,不推荐使用 |
JUL | java.util.logging 简称,是 Java 内置的日志模块,Java 1.4 引入 | 2002 至今 | 使用方便,不需要引入第三方类库,但大型应用几乎不用 |
Logback | log4j 的作者离开 Apache 后开发的日志组件 | 2006 至今 | 常用 |
Log4j 2 | log4j 的升级版本,也吸收了 Logback 中的优秀设计 | 2014 至今(最新) | 常用 |
*在 Log4j 被 Apache Foundation 收入门下之后,由于理念不合,Log4j 的作者 Ceki 离开并开发了 SLF4J 和 Logback。
常见的日志门面
门面 | 说明 | 原理 | 使用情况 |
---|---|---|---|
JCL | Apache 推出,原名 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); //打印异常栈
//异常处理程序段
}
}
}