日志技术
把程序运行的信息,记录到文件中,方便程序员定位 bug、并了解程序的执行情况等
- 希望系统能记住某些数据是被谁操作的,比如被谁删除了?
- 想分析用户浏览系统的具体情况,以便挖掘用户的具体喜好?
- 当系统在开发中或者上线后出现了 bug,崩溃了,该通过什么去分析、定位 bug?
好比生活中的日记,可以记录你生活中的点点滴滴。
程序中的日志,通常就是一个
文件,里面记录的是程序运行过程中的各种信息。
输出语句的弊端
输出会展示在控制台终端里
不能更方便的将日志记录到其他的位置(文件,数据库)
想取消输出语句,需要修改源代码才可以完成
日志技术优点
可以将系统执行的信息,方便的记录到指定的位置(控制台、文件中、数据库中)。
可以随时以开关的形式控制日志的启停,无需到源代码中去进行修改。
日志技术的体系结构
日志框架:牛人或者第三方公司已经做好的实现代码,后来者直接可以拿去使用。
日志接口:设计日志框架的一套标准,日志框架需要实现这些接口。
注意 1:因为对Commons Logging接口不满意,有人就搞了SLF 4 J;因为对 Log 4 j 的性能不满意,有人就搞了 Logback。
注意 2:Logback 是基于SLF4 j 的日志规范实现的框架。现在最常使用
Logback
我们对于这种日志框架一般是通过 maven 工具进行下载管理的
对于这个我们首先要导入三个包
核心配置文件的 logback. Xml 导入到 src 中, 导入后并不是不管了, 还是要修改这个 xml 文件中的部分内容呢
输出
创建一个日志对象, 公开的, 静态, 恒定, public static final
Logger xx = LoggerFactory.getLogger("文件名")
文件名是用来指明是哪一个文件的日志
然后我们通过 xx. Info 写入重点信息, xx. Error 写入这个错误信息
核心配置文件 logback. Xml
对 Logback 日志框架进行控制的。
日志的输出位置、输出格式的设置
通常可以设置 2 个输出日志的位置:一个是控制台、一个是系统文件中
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
开启日志(ALL),取消日志 (OFF)
<root level=“ALL">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE" />
</root>
<?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:/log/itheima-data.log</file>
<!--指定日志文件拆分和压缩规则,因为日志会越来越大,所以我们要尽量避免日志文件过大-->
<rollingPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--通过指定压缩文件名称,来确定分割文件方式-->
<fileNamePattern>D:/log/itheima-data-%i-%d{yyyy-MM-dd}-.log.gz</fileNamePattern>
<!--文件拆分大小-->
<maxFileSize>1MB</maxFileSize>
</rollingPolicy>
</appender>
<!--
1、控制日志的输出情况:如,开启日志,取消日志 off是关闭日志,all是开启日志
-->
<root level="debug">
<appender-ref ref="CONSOLE"/> <!--这个控制输出到控制台-->
<appender-ref ref="FILE" /> <!--这个控制输出到文件-->
</root>
</configuration>
测试
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class dayRoutine {
public static void main(String[] args) {
Logger logger = LoggerFactory
.getLogger(
"D:\\code\\vscode-java\\LearnJavaSE\\Learn\\src\\Metamorphosis\\day4\\SpecialFile\\RoutineInput.log");
int a = 10;
int b = 0;
try {
if (a / b != 0) {
System.out.println("ok");
}
} catch (Exception e) {
System.out.println("有异常");
logger.error("有异常");
logger.error("ceshi");
}
}
}
日志级别
就是我们核心配置文件中的最后一段代码
<root level="all">
<appender-ref ref="FILE" />
</root>
日志级别是指的是日志信息的类型,日志都会分级别,常见的日志级别如下 (优先级依次升高)
日志级别指的是日志信息的类型,日志都会分级别,常见的日志级别如下(优先级依次升高):
日志级别 | 说明 |
---|---|
trace | 追踪,指明程序运行轨迹 |
debug | 调试,实际应用中一般将其作为最低级别,而 trace 则很少使用 |
info | 输出重要的运行信息,数据连接、网络连接、IO 操作等等,使用较多 |
warn | 警告信息,可能会发生问题,使用较多 |
error | 错误信息, 使用较多 |
只有日志的级别是大于或等于核心配置文件配置的日志级别,才会被记录,否则不记录。
package com.itheima.d3_log;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 目标:掌握LogBack日志框架的使用。
*/
public class LogBackTest {
// 创建一个Logger日志对象
public static final Logger LOGGER = LoggerFactory.getLogger("LogBackTest");
public static void main(String[] args) {
//while (true) {
try {
LOGGER.info("chu法方法开始执行~~~");
chu(10, 0);
LOGGER.info("chu法方法执行成功~~~");
} catch (Exception e) {
LOGGER.error("chu法方法执行失败了,出现了bug~~~");
}
//}
}
public static void chu(int a, int b){
LOGGER.debug("参数a:" + a);
LOGGER.debug("参数b:" + b);
int c = a / b;
LOGGER.info("结果是:" + c);
}
}