Java SE 学习笔记(十三)—— 日志框架
目录
- 1 日志技术概述
- 2 日志技术体系
- 3 Logback 日志框架
- 3.1 Logback 概述
- 3.2 Logback 快速入门
- 3.3 Logback 配置详解
- 3.3.1 输出位置与格式设置
- 3.3.2 日志级别设置
1 日志技术概述
当我们想清楚的知道系统的一些运行情况,比如:
- 希望系统能记住某些数据是被谁操作的,比如被谁删除了?
- 想分析用户浏览系统的具体情况,以便挖掘用户的具体喜好?
- 当系统在开发或者上线后出现了
bug
,崩溃了,该通过什么去分析、定位bug
?
之前我们会采用输出语句的方式,但是该方式会有一些弊端:
- 想取消记录的信息需要修改代码才可以完成
- 信息只能展示在控制台,不能将其记录到其他的位置(文件,数据库)
采用日志的方式即可避免上述弊端
- 用来记录程序运行过程中的信息,并可以进行永久存储
- 可以将系统执行的信息,方便的记录到指定的位置(控制台、文件中、数据库中)
- 可以随时以开关的形式控制是日志的记录和取消,无需侵入到源代码中去进行修改。
日志与输出语句的区别:
2 日志技术体系
日志体系结构:
日志接口:一些规范,提供给日志的实现框架设计的标准。
日志框架:牛人或者第三方公司已经做好的实现代码,后来者直接可以拿去使用。
因为对 Commons Logging
接口不满意,有人就搞了 SLF4J
。因为对 Log4j
的性能不满意,有人就搞了 Logback
, Logback
是基于 SLF4J
的日志规范实现的框架。
3 Logback 日志框架
3.1 Logback 概述
Logback
是由 Log4j
创始人设计的另一个开源日志组件,性能比 Log4j
要好, Logback
是基于 SLF4J
的日志规范实现的框架。
Logback官方网站
Logback
日志框架分为以下模块:
logback-core
: 该模块为其他两个模块提供基础代码。 (必须有)logback-classic
:是Log4j
的一个改良版本,完整实现了SLF4J
API 的模块。(必须有)logback-access
:该模块与Tomcat
和Jetty
等Servlet
容器集成,以提供 HTTP 访问日志功能(可选模块)
要想使用 Logback 日志框架,至少需要在项目中整合如下三个模块:
slf4j-api
:日志接口logback-core
:基础模块logback-classic
:功能模块,它完整实现了SLF4J
API
Java日志的三大jar包以及配置文件的下载流程
3.2 Logback 快速入门
需求:使用
Logback
日志框架,记录系统的运行信息。
实现步骤:
- 导入
Logback
框架到项目中去。在项目下新建文件夹lib
,导入Logback
的jar
包到该文件夹下
-
将存放
jar
文件的lib
文件夹添加到项目依赖库中去(Add as Library…
)。 -
将
Logback
的核心配置文件 logback.xml 直接拷贝到src
目录下(必须是src
下)。 -
创建
Logback
框架提供的Logger
日志对象,后续使用其方法记录系统的日志信息
public static final Logger LOGGER = LoggerFactory.getLogger("类名.class ");
项目目录结构:
Test.java
代码实现:
/*
目标:快速搭建logback日志框架,记录程序的执行情况到控制台、文件
*/
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Test {
// 创建logback日志对象
public static final Logger LOGGER = LoggerFactory.getLogger("Test.class");
public static void main(String[] args) {
try {
LOGGER.debug("main方法执行了");
LOGGER.info("开始记录第二行日志");
int a = 10;
int b = 0;
LOGGER.trace("a=" + a);
LOGGER.trace("b=" + b);
System.out.println(a / b);
} catch (Exception e) {
LOGGER.error("功能异常" + e);
}
}
}
同时,在logback.xml
文件中设置的日志文件存放路径中会保存上述程序的日志内容
3.3 Logback 配置详解
3.3.1 输出位置与格式设置
logback 日志系统的特性都是通过核心配置文件logback.xml
控制的
- 通过配置文件中的
<appender>
标签可以设置输出位置和日志信息的详细格式 - 通常可以设置2个日志输出位置:一个是控制台,一个是系统文件中
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--
CONSOLE :表示当前的日志信息是可以输出到控制台的。
-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--输出流对象 默认 System.out(正常输出) 改为 System.err(终端字体为红色)-->
<target>System.out</target>
<encoder>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度
%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %c [%thread] : %msg%n</pattern>
</encoder>
</appender>
<!-- File是输出的方向通向文件的 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!--日志输出路径-->
<file>D:/StudyTools/Idea/logs/data.log</file>
<!--指定日志文件拆分和压缩规则-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--通过指定压缩文件名称,来确定分割文件方式-->
<fileNamePattern>D:/StudyTools/Idea/logs/data-%d{yyyy-MMdd}.log%i.gz</fileNamePattern>
<!--文件拆分大小-->
<maxFileSize>1MB</maxFileSize>
</rollingPolicy>
</appender>
<!--
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
, 默认debug
<root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
-->
<!--如果这里不配置关联打印日志,改位置则不会记录日志-->
<root level="ALL">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE" />
</root>
</configuration>
日志文件超过1MB会自动拆分,不知道为啥实现不了
3.3.2 日志级别设置
如果系统上线后,我们只想记录一些错误的日志信息或者是不想记录了,怎么办?
- 可以通过设置日志的输出级别来控制哪些日志信息输出或者不输出
日志级别程度依次是:TRACE<DEBUG<INFO<WARN<ERROR
,默认的级别是 debug(忽略大小写)。
- 用于控制系统中哪些日志级别是可以输出的,只输出不低于设定级别的日志信息。
ALL
和 OFF
分别是打开全部的日志信息、关闭全部的日志信息
具体是在<root level="INFO">
标签的 level
属性中设置日志级别