一、概述
什么是日志?
日志好比生活中的日记,可以记录程序的运行过程信息,并且可以永久保存。
前面我们记录程序运行过程是用输出语句的形式打印到控制台,这种方式的弊端是:
- 信息只能展示控制台上
- 不能将其记录到其他的位置(例如:文件中或者数据库中)
- 当我们不想记录信息时,我们需要修改代码,删除输出语句。
日志技术优势:
- 可以将系统执行的过程的信息选择性记录到指定位置(控制台,文件,数据库中)
- 可以随时用开关的形式控制是否记录日志,不需要修改源代码
输出语句 | 日志技术 | |
---|---|---|
输出位置 | 只能是控制台 | 可以是任意文件、控制台、数据库 |
取消日志 | 需要修改源代码,灵活性差 | 无需修改源代码,灵活性好 |
多线程 | 性能较差 | 性能较好 |
二、体系架构
日志规范的接口:JCL或者slf4j。
日志实现框架:Log4j、JUL,Logback(重点)、以及其他实现的框架。
什么是日志规范?
- 日志规范就是一些接口,提供给日志实现框架制定的一个标准。
什么是日志框架?
- 牛人或者第三方公司已经做好的日志记录实现代码,后来者可直接拿来使用。
- 因为对JCL的接口不满意,有人就搞出了slf4j接口,因为对Log4j的性能不满意,有人就高了Logback。
三、Logback
3.1 概述
Logback日志框架
- Logback由log4j创始人设计的另一个开源日志组件,性能比log4j要好
- 官方网站:https://logback.qos.ch/index.html
- Logback是基于slf4j的日志规范实现的框架
Logback的主要技术模块:
至少需要前三个模块
slf4j-api:日志规范,必须有。
logback-core:logback-core模块为其他两个模块奠定了基础,必须有。
logback-classic:它是log4j的一个改良版本,同时完整实现了slf4j API,必须有。
logback-access:该模块与Tomcat和Jetty等Servlt容器集成,以提供Htpp访问日志功能。(可视化日志)
3.2 使用
若要使用Logback日志技术,需要先导入Logback相关技术
- 在项目下创建一个文件夹(lib),导入Logback的相关jar包(至少 slf4j-api、logback-core、logback-classic),并将其添加到依赖库。
- 导入成功后,再将Logback的核心配置文件logback.xml拷贝到src目录下(必须是src下)
- 在代码中获取日志对象
//获取日志对象 public static final Logger LOGGER = LoggerFactory.getLogger("类名.class");
- 使用日志对象调用其方法输出日志信息,先将logback.xml文件中的D:/code/Logback-data.log路径改为你想将日志存储在哪个地方,这里该成ALL,后面会介绍这些地方的作用。
//运行以下代码 public static void main(String[] args) { //运行后,控制台就会打印这些日志,且在你设置的路径下也会生成日志文件,文件内容就是运行中的日志。 try { LOGGER.debug("第一行代码Debug日志"); LOGGER.warn("第二行代码warn日志"); LOGGER.info("第三行代码info日志"); LOGGER.info("开始除法"); int a = 10, b = 0; LOGGER.trace("a = " + a); LOGGER.trace("b = " + b); LOGGER.info(("a/b = " + a / b)); }catch (Exception e){ e.printStackTrace(); LOGGER.error("错误信息为:" + e); } }
3.3 Logback配置详解
3.3.1 输出位置、格式设置
<!--
CONSOLE :表示当前的日志信息是可以输出到控制台的。
class:后面是类
-->
<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:/code/Logback-data.log</file>
<!--指定日志文件拆分和压缩规则-->
<rollingPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--通过指定压缩文件名称,来确定拆分后的文件格式-->
<fileNamePattern>D:/code/Logback-data2-%d{yyyy-MMdd}.log%i.gz</fileNamePattern>
<!--当日志文件达到1MB,就将日志文件拆分-->
<maxFileSize>1MB</maxFileSize>
</rollingPolicy>
</appender>
3.3.2 日志级别设置
项目上线后,我们指向记录一些error日志,其他级别的不记录,那么我们就需要设置日志的输出级别来控制输出和不输出。
日志级别(从小到大,书写时忽略大小写)
TRACE<DEBUG<INFO<WARN<ERROR
ALL和OFF表示打开全部日志信息和关闭所有日志信息。
<!--
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
, 默认debug
<root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
-->
<root level="ALL">
<!-- 这里可控制日志希望在哪里打印,若不想在控制台打印,只需要将<appender-ref ref="CONSOLE"/>删掉即可 -->
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE" />
</root>