文章目录
- 1. 日志的作用
- 2. 日志怎么用
- 3. 自定义日志打印
- 3.1 程序中得到日志对象
- 3.2 使用日志对象打印日志
- 3.3 日志格式说明
- 4. 日志级别
- 4.1 日志级别的作用
- 4.2 日志级别的分类与使用
- 4.3 日志级别的设置
- 4.4 综合练习
- 5. 日志的持久化
- 5.1 配置日志文件的保存路径:
- 5.2 配置日志文件的文件名:
- 5.3 综合练习:
- 5.4 不同批次的日志是覆盖还是追加?
- 6. 更简单的日志输出
1. 日志的作用
日志是程序的重要组成部分 , 虽然不是必须的 , 但如果不打开控制台查看日志 , 将很难排查错误.
除了发现和定位问题之外 , 我们还可以通过日志实现以下功能:
- 记录用户登录日志 , 方便分析用户是正常登录还是恶意破解用户.
- 记录系统的操作日志 , 方便恢复数据和定位操作人.
- 记录程序的执行时间 , 方便以后优化程序提供数据支持.
日志真实使用案例:
- 应用程序日志记录:开发人员在应用程序中添加日志记录功能,以便在应用程序运行时跟踪和调试问题。例如,当应用程序出现错误时,开发人员可以查看日志文件以了解错误的原因。
- 安全日志记录:安全管理员可以使用安全日志记录来跟踪系统中的安全事件。例如,当系统出现入侵尝试时,安全管理员可以查看日志文件以了解入侵者的行为和尝试的目的。
- 网络日志记录:网络管理员可以使用网络日志记录来跟踪网络活动。例如,当网络出现故障时,网络管理员可以查看日志文件以了解故障的原因。
- 应用程序性能分析:开发人员可以使用日志记录来分析应用程序的性能。例如,他们可以记录应用程序中的每个操作的执行时间,并使用这些信息来查找性能瓶颈。
- 运维日志记录:运维人员可以使用日志记录来跟踪系统的运行状况。例如,当系统出现故障时,运维人员可以查看日志文件以了解故障的原因,并采取适当的措施来解决问题。
2. 日志怎么用
Spring Boot 框架中内置了日志框架 , 因此我们每次在项目启动的时候就能看到日志输出.
通过上述日志信息可以得出三个问题:
- Spring Boot 内置的日志框架是什么?
- 开发中如何在项目中自定义打印日志?
- 日志输出默认是在控制台的 , 如何将日志永久的保存起来?
3. 自定义日志打印
开发者自定义打印日志的实现步骤:
- 在程序中得到日志对象.
- 使用日志对象的相关语法输出要打印的内容.
3.1 程序中得到日志对象
每个类都有自己专属的日志 , 期望这个日志是唯一的不被他人修改 final
private static final Logger log = LoggerFactory.getLogger();
Tips: 一定要选择 slf4j 中的 Logger.
Spring 内置日志框架为 SLF4J 和 logback , 可以在 Maven 的内置扩展中查看.
其中:
-
SLF4J 是一个 Java 日志 API,它提供了一个抽象层,使得应用程序可以在不改变代码的情况下使用不同的日志实现。(类似于房屋中介)
-
Logback 是一个开源的 Java 日志框架 , 可以满足各种应用程序的日志需求。
SLF4J 的实现原理就是 门面模式 , 门面模式与代理模式非常相似 , 用户发送的日志请求 , 首先会来到SLF4J , 之后SLF4J 会自动匹配适合的日志框架 , 这样的设计方式会大大增强代码的灵活性和可移植性 , 程序员可以通过 SLF4J 的抽象层 , 轻松切换日志框架.
3.2 使用日志对象打印日志
@RequestMapping("/sayHi") // = @WebServlet("/url")
public String sayHi(){
// System.out.println("打印日志");
log.trace("i'm trace");//所有的痕迹都打印
log.debug("i'm debug");
log.info("i'm info");
log.warn("i'm warn");
log.error("i'm error");
return "Hello world!" + "->" + myconfigration;
}
执行结果如下:
我们发现没有看到 trace 和 debug 日志. 这是因为 info 为日志的默认级别 , 因此只输出 >= info 的日志.
3.3 日志格式说明
4. 日志级别
4.1 日志级别的作用
- 日志级别可以帮你筛选出重要的信息 , 比如设置日志的级别为 ERROR, 开发中只查看程序的报错信息 , 可以节省开发者筛选信息的时间.
- 调试和故障排查:在开发和测试阶段,可以将日志级别设置为DEBUG或TRACE,记录应用程序的详细运行信息,以便在出现问题时进行调试和故障排查。
- 监控和性能分析:在生产环境中,可以将日志级别设置为INFO或WARN,记录应用程序的重要事件和异常情况,以便进行监控和性能分析。
- 安全审计和合规性检查:在安全审计和合规性检查中,可以将日志级别设置为ERROR或FATAL,记录应用程序的安全事件和故障情况,以便进行安全审计和合规性检查。
- 日志管理和存储:根据不同的日志级别进行日志管理和存储,将不同级别的日志存储到不同的日志文件中,以便进行日志管理和分析。
综上所述,日志级别的作用主要是在应用程序中记录日志时,根据不同的重要程度将日志分为不同级别,以便在不同场景下对日志进行筛选和过滤,从而实现调试和故障排查、监控和性能分析、安全审计和合规性检查等功能。
4.2 日志级别的分类与使用
日志的级别分为:
- TRACE:最详细的日志级别,用于记录应用程序的详细运行信息,包括方法调用、变量值等。
- DEBUG:用于调试应用程序,记录应用程序的调试信息,包括变量值、方法调用等。
- INFO:记录应用程序的重要事件和状态信息,例如应用程序启动、关闭、配置信息等。
- WARN:记录应用程序的警告信息,例如应用程序出现异常但不影响正常运行的情况。
- ERROR:记录应用程序的错误信息,例如应用程序出现异常并影响了正常运行的情况。
- FATAL:记录应用程序的严重错误信息,例如应用程序崩溃或无法继续运行的情况。
不同的日志级别对应不同的日志内容,包含的信息也不同。通常,可以根据应用程序的需要选择合适的日志级别进行记录,以便在不同场景下对日志进行筛选和过滤,从而实现调试和故障排查、监控和性能分析、安全审计和合规性检查等功能。
级别越高能收到的消息就越少 , 如果把日志级别设为 warn , 那么就只能收掉 warn , error 和 fatal 的信息.
4.3 日志级别的设置
日志级别的设置只需在配置文件中设置"logging.level"配置项即可.
配置根路径级别的日志:
# 日志级别设置
# 所有项目设置为 error
logging:
level:
root: error
@RestController // = @Controller + @ResponseBody
public class testController {
//1.得到日志对象
private static final Logger log = LoggerFactory.getLogger(testController.class);
//注册一个路由
@RequestMapping("/sayHi") // = @WebServlet("/url")
public String sayHi(){
//System.out.println("打印日志");
log.trace("i'm trace");
log.debug("i'm debug");
log.info("i'm info");
log.warn("i'm warn");
log.error("i'm error");
return "Hello world!" + "->" ;
}
}
结果显示:
明显只打印 error 及 error 以上的日志信息.
Tips: 如果不设置日志输出级别 , 默认为 info
4.4 综合练习
将所有项目的日志级别设置为 error , 而 controller 类中设置为 trace
logging:
level:
root: error
com:
example:
demo:
controller: trace
5. 日志的持久化
以上日志都是输出在控制台上 , 然而生产环境中需要我们把日志保存起来 , 以便后续回溯定位问题 , 将日志保存起来的过程就叫做持久化.
5.1 配置日志文件的保存路径:
Tips: 路径一定要写绝对路径
logging:
file:
path: D:\\java\\
5.2 配置日志文件的文件名:
系统会自动在指定路径下创建一个 spring_log 文件 , 里面存储 日志文件.
logging:
file:
path: D:\\java\\spring_log
5.3 综合练习:
将 controller 包下 error 级别以上的⽇志保存到 log_all.log 下,将 service包 下 warn 级别以上的⽇志保存到 log_all.log 下
logging:
level:
com:
example:
demo:
controller: error
service: warn
file:
path: D:\\java\\log_all.log
5.4 不同批次的日志是覆盖还是追加?
观察得出结论 , 日志文件一旦产生 , 那么日志文件及其内容就会永久的保存 , 不会出现文件或内容的丢失 , 所以不同批次的日志是追加.
6. 更简单的日志输出
每次写日志时 , 都要写下面代码 , 当业务过于复杂就会很麻烦:
private static final Logger log = LoggerFactory.getLogger(testController.class);
因此我们可使用 lombok 框架
lombok 是一个编译期的框架 , 在编译期 , lombok 的注解处理器会自动扫描 Java 源代码 , 并根据注解生成 Java 代码 , 最终与源代码合并 , 生成 Java 类文件. 生成的 Java 类文件可以像原 Java 文件一样被 编译 , 打包 , 部署.
@RestController
@Slf4j //给当前的类添加一个叫 log 的日志对象
public class LogController {
@RequestMapping("/log")
public String log(){
log.info("我是 info");
log.warn("我是 warn");
log.error("我是 error");
return "log sayhi";
}
}