日志是程序的重要组成部分 , 虽然不是必须的 , 但如果不打开控制台查看日志 , 将很难排查错误.
除了发现和定位问题之外 , 我们还可以通过日志实现以下功能:
日志真实使用案例:
Spring Boot 框架中内置了日志框架 , 因此我们每次在项目启动的时候就能看到日志输出.
通过上述日志信息可以得出三个问题:
开发者自定义打印日志的实现步骤:
每个类都有自己专属的日志 , 期望这个日志是唯一的不被他人修改 final
private static final Logger log = LoggerFactory.getLogger();
Tips: 一定要选择 slf4j 中的 Logger.
Spring 内置日志框架为 SLF4J 和 logback , 可以在 Maven 的内置扩展中查看.
其中:
SLF4J 是一个 Java 日志 API,它提供了一个抽象层,使得应用程序可以在不改变代码的情况下使用不同的日志实现。(类似于房屋中介)
Logback 是一个开源的 Java 日志框架 , 可以满足各种应用程序的日志需求。
SLF4J 的实现原理就是 门面模式 , 门面模式与代理模式非常相似 , 用户发送的日志请求 , 首先会来到SLF4J , 之后SLF4J 会自动匹配适合的日志框架 , 这样的设计方式会大大增强代码的灵活性和可移植性 , 程序员可以通过 SLF4J 的抽象层 , 轻松切换日志框架.
@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 的日志.
综上所述,日志级别的作用主要是在应用程序中记录日志时,根据不同的重要程度将日志分为不同级别,以便在不同场景下对日志进行筛选和过滤,从而实现调试和故障排查、监控和性能分析、安全审计和合规性检查等功能。
日志的级别分为:
不同的日志级别对应不同的日志内容,包含的信息也不同。通常,可以根据应用程序的需要选择合适的日志级别进行记录,以便在不同场景下对日志进行筛选和过滤,从而实现调试和故障排查、监控和性能分析、安全审计和合规性检查等功能。
级别越高能收到的消息就越少 , 如果把日志级别设为 warn , 那么就只能收掉 warn , error 和 fatal 的信息.
日志级别的设置只需在配置文件中设置"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
将所有项目的日志级别设置为 error , 而 controller 类中设置为 trace
logging:
level:
root: error
com:
example:
demo:
controller: trace
以上日志都是输出在控制台上 , 然而生产环境中需要我们把日志保存起来 , 以便后续回溯定位问题 , 将日志保存起来的过程就叫做持久化.
Tips: 路径一定要写绝对路径
logging:
file:
path: D:\\java\\
系统会自动在指定路径下创建一个 spring_log 文件 , 里面存储 日志文件.
logging:
file:
path: D:\\java\\spring_log
将 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
观察得出结论 , 日志文件一旦产生 , 那么日志文件及其内容就会永久的保存 , 不会出现文件或内容的丢失 , 所以不同批次的日志是追加.
每次写日志时 , 都要写下面代码 , 当业务过于复杂就会很麻烦:
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";
}
}