Spring Boot 日志

⽇志的⽤途

1. 系统监控

监控现在⼏乎是⼀个成熟系统的标配, 我们可以通过⽇志记录这个系统的运⾏状态, 每⼀个⽅法的响应时间, 响应状态等, 对数据进⾏分析, 设置不同的规则, 超过阈值时进⾏报警. ⽐如统计⽇志中关键字的数量,并在关键字数量达到⼀定条件时报警,这也是⽇志的常⻅需求之⼀

2. 数据采集

数据采集是⼀个⽐较⼤的范围, 采集的数据可以作⽤在很多⽅⾯, ⽐如数据统计, 推荐排序等.

数据统计: 统计⻚⾯的浏览量(PV), 访客量(UV), 点击量等, 根据这些数据进⾏数据分析, 优化公司运营策略

推荐排序: ⽬前推荐排序应⽤在各个领域, 我们经常接触的各⾏各业很多也都涉及推荐排序, ⽐如购

物, ⼴告, 新闻等领域. 数据采集是推荐排序⼯作中必须做的⼀环, 系统通过⽇志记录⽤⼾的浏览历

史, 停留时⻓等, 算法⼈员通过分析这些数据, 训练模型, 给⽤⼾做推荐.

下图中的数据源, 其中⼀部分就来⾃于⽇志记录的数据.

3. ⽇志审计

随着互联⽹的发展,众多企业的关键业务越来越多的运⾏于⽹络之上. ⽹络安全越来越受到⼤家的关注, 系统安全也成为了项⽬中的⼀个重要环节, 安全审计也是系统中⾮常重要的部分. 国家的政策法规、⾏业标准等都明确对⽇志审计提出了要求. 通过系统⽇志分析,可以判断⼀些⾮法攻击, ⾮法调⽤,以及系统处理过程中的安全隐患

⽇志使用

打印日志

打印⽇志的步骤:

在程序中得到⽇志对象.

使⽤⽇志对象输出要打印的内容

在程序中得到⽇志对象

在程序中获取⽇志对象需要使⽤⽇志⼯⼚ LoggerFactory,如下代码所⽰:

private static Logger logger = LoggerFactory.getLogger(LoggerController.class);

LoggerFactory.getLogger 需要传递⼀个参数, 标识这个⽇志的名称. 这样可以更清晰的知道是哪个类输出的⽇志. 当有问题时, 可以更⽅便直观的定位到问题类

注意:Logger 对象是属于 org.slf4j 包下的, 不要导⼊错包

使⽤⽇志对象打印⽇志

⽇志对象的打印⽅法有很多种,我们可以先使⽤ info() ⽅法来输出⽇志,如下代码所⽰

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class LoggerController {
 private static Logger logger = 
LoggerFactory.getLogger(LoggerController.class);
 @RequestMapping("/logger")
 public String logger(){
 logger.info("--------------要输出⽇志的内容----------------");
 return "打印⽇志";
 }
}
打印⽇志效果展⽰:

⽇志框架介绍(了解)

⻔⾯模式(外观模式)

⻔⾯模式(Facade Pattern)⼜称为外观模式, 提供了⼀个统⼀的接⼝, ⽤来访问⼦系统中的⼀群接⼝.
其主要特征是定义了⼀个⾼层接⼝, 让⼦系统更容易使⽤

⻔⾯模式主要包含2种⻆⾊:

外观⻆⾊(Facade): 也称⻔⾯⻆⾊,系统对外的统⼀接⼝.

⼦系统⻆⾊(SubSystem): 可以同时有⼀个或多个 SubSystem. 每个 SubSytem 都不是⼀个单独的类, ⽽是⼀个类的集合. SubSystem 并不知道 Facade 的存在, 对于 SubSystem ⽽⾔, Facade 只是另⼀个客⼾端⽽已(即 Facade 对 SubSystem 透明)

⻔⾯模式的优点

1.减少了系统的相互依赖. 实现了客⼾端与⼦系统的耦合关系, 这使得⼦系统的变化不会影响到调⽤它

的客⼾端;

2.提⾼了灵活性, 简化了客⼾端对⼦系统的使⽤难度, 客⼾端⽆需关⼼⼦系统的具体实现⽅式, ⽽只需

要和⻔⾯对象交互即可.

3.提⾼了安全性. 可以灵活设定访问权限, 不在⻔⾯对象中开通⽅法, 就⽆法访问

SLF4J 框架介绍

SLF4J 就是其他⽇志框架的⻔⾯. SLF4J 可以理解为是提供⽇志服务的统⼀API接⼝, 并不涉及到具体的⽇志逻辑实现.

不引⼊⽇志⻔⾯

存在问题:

1. 不同⽇志框架的API接⼝和配置⽂件不同, 如果多个⽇志框架共存, 那么不得不维护多套配置⽂件(这个配置⽂件是指⽤⼾⾃定义的配置⽂件).

2. 如果要更换⽇志框架, 应⽤程序将不得不修改代码, 并且修改过程中可能会存在⼀些代码冲突.

3. 如果引⼊的第三⽅框架, 使⽤了多套, 那就不得不维护多套配置

引⼊⽇志⻔⾯

引⼊⻔⾯⽇志框架之后, 应⽤程序和⽇志框架(框架的具体实现)之间有了统⼀的API接⼝(⻔⾯⽇志框架实现), 此时应⽤程序只需要维护⼀套⽇志⽂件配置, 且当底层实现框架改变时, 也不需要更改应⽤程序代码.

SLF4J 就是这个⽇志⻔⾯.
总的来说,SLF4J使你的代码独⽴于任意⼀个特定的⽇志API,这是⼀个对于开发API的开发者很好的思想.

⽇志格式的说明

从上图可以看到,⽇志输出内容元素具体如下:

1. 时间⽇期:精确到毫秒

2. ⽇志级别:ERROR, WARN, INFO, DEBUG 或TRACE

3. 进程ID

4. 线程名

5. Logger名(通常使⽤源代码的类名)

6. ⽇志内容

⽇志级别

⽇志级别的分类

⽇志的级别从⾼到低依次为: FATAL、ERROR、WARN、INFO、DEBUG、TRACE

FATAL: 致命信息,表⽰需要⽴即被处理的系统级错误.

ERROR: 错误信息, 级别较⾼的错误⽇志信息, 但仍然不影响系统的继续运⾏.

WARN: 警告信息, 不影响使⽤, 但需要注意的问题

INFO: 普通信息, ⽤于记录应⽤程序正常运⾏时的⼀些信息, 例如系统启动完成、请求处理完成等.

DEBUG: 调试信息, 需要调试时候的关键信息打印.

TRACE: 追踪信息, ⽐DEBUG更细粒度的信息事件(除⾮有特殊⽤意,否则请使⽤DEBUG级别替代)

⽇志级别的使⽤

/**
 * 打印不同级别的⽇志
 * @return
 */
@RequestMapping("/printLog")
public String printLog() {
 logger.trace("================= trace ===============");
 logger.debug("================= debug ===============");
 logger.info("================= info ===============");
 logger.warn("================= warn ===============");
 logger.error("================= error ===============");
 return "打印不同级别的⽇志" ;
}

SpringBoot 默认的⽇志框架是Logback, Logback没有 FATAL 级别, 它被映射到 ERROR .

出现fatal⽇志,表⽰服务已经出现了某种程度的不可⽤, 需要需要系统管理员紧急介⼊处理. 通常情

况下, ⼀个进程⽣命周期中应该最多只有⼀次FATAL记录.

观察打印的⽇志结果:

结果发现, 只打印了info, warn和error级别的⽇志

这与⽇志级别的配置有关, ⽇志的输出级别默认是 info级别, 所以只会打印⼤于等于此级别的⽇志, 也就是info, warn和error.

⽇志配置

配置⽇志级别

⽇志级别配置只需要在配置⽂件中设置"logging.level"配置项即可,如下所⽰

logging:
  level:
    root: debug

⽇志持久化

以上的⽇志都是输出在控制台上的, 然⽽在线上环境中, 我们需要把⽇志保存下来, 以便出现问题之后追溯问题. 把⽇志保存下来就叫持久化.

⽇志持久化有两种⽅式

1. 配置⽇志⽂件名

2. 配置⽇志的存储⽬录

配置⽇志⽂件的路径和⽂件名:

# 设置⽇志⽂件的⽂件名
logging:
  file:
    name: logger/springboot.log

注意:

logging.file.name logging.file.path 两个都配置的情况下, 只⽣效其⼀,

logging.file.name 为准.

配置⽇志⽂件分割

如果我们的⽇志都放在⼀个⽂件中, 随着项⽬的运⾏, ⽇志⽂件会越来越⼤, 需要对⽇志⽂件进⾏分割.

yml配置

logging:
 logback:
  rollingpolicy:
   max-file-size: 1KB
    file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i

配置⽇志格式

打印⽇志的格式, 也是⽀持配置的. ⽀持控制台和⽇志⽂件分别设置

配置项说明:

1. %clr(表达式){颜⾊} 设置输⼊⽇志的颜⾊

⽀持颜⾊有以下⼏种:

blue

cyan

faint

green

magenta

red

yellow

2. %d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}} ⽇期和时间--精确到毫秒

%d{} ⽇期

${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX} ⾮空表达式, 获取 系统属性 LOG_DATEFORMAT_PATTERN , 若属性 LOG_DATEFORMAT_PATTERN 不存在,则使⽤ -yyyy-MM-dd HH:mm:ss.SSSXXX 格式, 系统属性可以 System.getProperty("LOG_DATEFORMAT_PATTERN") 获取

3. %5p 显⽰⽇志级别ERROR,MARN,INFO,DEBUG,TRACE.

4. %t 线程名. %c 类的全限定名. %M method. %L 为⾏号. %thread 线程名称. %m 或者

%msg 显⽰输出消息. %n 换⾏符

5. %5 若字符⻓度⼩于5,则右边⽤空格填充. %-5 若字符⻓度⼩于5,则左边⽤空格填充. %.15

字符⻓度超过15,截去多余字符. %15.15 若字符⻓度⼩于15,则右边⽤空格填充. 若字符⻓度超

过15,截去多余字符

更多说明, 参考: https://logback.qos.ch/manual/layouts.html#conversionWord

yml配置

logging:
 pattern:
  console: '%d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n'
   file: '%d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n'

项⽬运⾏, 观察⽇志变化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值