一.为什么要学习日志⽇志对我们来说并不陌⽣, 从JavaSE部分, 我们就在使⽤System.out.print来打印⽇志了. 通过打印⽇志来发现和定位问题, 或者根据⽇志来分析程序的运⾏过程. 在Spring的学习中, 也经常根据控制台的⽇志来分析和定位问题.随着项⽬的复杂度提升, 我们对⽇志的打印也有了更⾼的需求, ⽽不仅仅是定位排查问题.⽐如需要记录⼀些⽤⼾的操作记录(⼀些审计公司会要求), 也可能需要使⽤⽇志来记录⽤⼾的⼀些喜好,把⽇志持久化, 后续进⾏数据分析等. 但是 System.out.print不能很好的满⾜我们的需求, 我们就需要使⽤⼀些专⻔⽇志框架(专业的事情交给专业的⼈去做).二.日志的用途通过前⾯的学习, 我们知道⽇志主要是为了发现问题, 分析问题, 定位问题的, 但除此之外, ⽇志还有很多⽤途1.系统监控监控现在⼏乎是⼀个成熟系统的标配, 我们可以通过⽇志记录这个系统的运⾏状态, 每⼀个⽅法的响应时间, 响应状态等, 对数据进⾏分析, 设置不同的规则, 超过阈值时进⾏报警. ⽐如统计⽇志中关键字的数量并在关键字数量达到⼀定条件时报警这也是⽇志的常⻅需求之⼀2.数据采集数据采集是⼀个⽐较⼤的范围, 采集的数据可以作⽤在很多⽅⾯, ⽐如数据统计, 推荐排序等.•数据统计: 统计⻚⾯的浏览量(PV), 访客量(UV), 点击量等, 根据这些数据进⾏数据分析, 优化公司运营策略•推荐排序: ⽬前推荐排序应⽤在各个领域, 我们经常接触的各⾏各业很多也都涉及推荐排序, ⽐如购物, ⼴告, 新闻等领域. 数据采集是推荐排序⼯作中必须做的⼀环, 系统通过⽇志记录⽤⼾的浏览历史, 停留时⻓等, 算法⼈员通过分析这些数据, 训练模型, 给⽤⼾做推荐.下图中的数据源, 其中⼀部分就来⾃于⽇志记录的数据.3.日志审计随着互联⽹的发展众多企业的关键业务越来越多的运⾏于⽹络之上. ⽹络安全越来越受到⼤家的关注, 系统安全也成为了项⽬中的⼀个重要环节, 安全审计也是系统中⾮常重要的部分. 国家的政策法规、⾏业标准等都明确对⽇志审计提出了要求. 通过系统⽇志分析可以判断⼀些⾮法攻击, ⾮法调⽤以及系统处理过程中的安全隐患.三.日志使用Spring Boot 项⽬在启动的时候默认就有⽇志输出如下图所⽰它打印的⽇志和System.out.print有什么不同呢观察⽇志输出可以看到, 我们通过System.out.print打印的⽇志, ⽐SpringBoot打印的⽇志缺少了很多信息.四.打印日志打印⽇志的步骤:•在程序中得到⽇志对象.•使⽤⽇志对象输出要打印的内容.在程序中获取⽇志对象需要使⽤⽇志⼯⼚ LoggerFactory如下代码所⽰private staticLogger logger LoggerFactory.getLogger(LoggerController.class);LoggerFactory.getLogger 需要传递⼀个参数, 标识这个⽇志的名称. 这样可以更清晰的知道是哪个类输出的⽇志. 当有问题时, 可以更⽅便直观的定位到问题类⽇志对象的打印⽅法有很多种我们可以先使⽤ info() ⽅法来输出⽇志如下代码所⽰1importorg.slf4j.Logger;2importorg.slf4j.LoggerFactory;3importorg.springframework.web.bind.annotation.RequestMapping;4importorg.springframework.web.bind.annotation.RestController;56RestController7public classLoggerController{8private staticLogger logger LoggerFactory.getLogger(LoggerController.class);910RequestMapping(/logger)11publicStringlogger(){12logger.info(--------------要输出⽇志的内容----------------);13return打印⽇志;14}1516}打印⽇志效果展⽰五.⽇志框架介绍SLF4J不同于其他⽇志框架, 它不是⼀个真正的⽇志实现, ⽽是⼀个抽象层, 对⽇志框架制定的⼀种规范,标准, 接⼝. 所有SLF4J并不能独⽴使⽤, 需要和具体的⽇志框架配合使⽤1.⻔⾯模式(外观模式)⻔⾯模式定义:⻔⾯模式Facade Pattern⼜称为外观模式, 提供了⼀个统⼀的接⼝, ⽤来访问⼦系统中的⼀群接⼝. 其主要特征是定义了⼀个⾼层接⼝, 让⼦系统更容易使⽤.⻔⾯模式主要包含2种⻆⾊:外观⻆⾊(Facade): 也称⻔⾯⻆⾊系统对外的统⼀接⼝.⼦系统⻆⾊(SubSystem): 可以同时有⼀个或多个 SubSystem. 每个 SubSytem 都不是⼀个单独的类,⽽是⼀个类的集合. SubSystem 并不知道 Facade 的存在, 对于 SubSystem ⽽⾔, Facade 只是另⼀个客⼾端⽽已(即 Facade 对 SubSystem 透明)⻔⾯模式的优点•减少了系统的相互依赖. 实现了客⼾端与⼦系统的耦合关系, 这使得⼦系统的变化不会影响到调⽤它的客⼾端•提⾼了灵活性, 简化了客⼾端对⼦系统的使⽤难度, 客⼾端⽆需关⼼⼦系统的具体实现⽅式, ⽽只需要和⻔⾯对象交互即可.•提⾼了安全性. 可以灵活设定访问权限, 不在⻔⾯对象中开通⽅法, 就⽆法访问六.⽇志格式的说明从上图可以看到⽇志输出内容元素具体如下1.时间⽇期精确到毫秒2.⽇志级别ERROR, WARN, INFO, DEBUG 或TRACE3.进程ID4.线程名5.Logger名(通常使⽤源代码的类名)6.⽇志内容七.⽇志级别⽇志级别代表着⽇志信息对应问题的严重性, 为了更快的筛选符合⽬标的⽇志信息.有了⽇志级别之后就可以过滤⾃⼰想看到的信息了, ⽐如只关注error级别的, 就可以根据级别过滤出来error级别的⽇志信息, 节约开发者的信息筛选时间.1.⽇志级别的分类⽇志的级别从⾼到低依次为: FATAL、ERROR、WARN、INFO、DEBUG、TRACE•FATAL: 致命信息表⽰需要⽴即被处理的系统级错误.•ERROR: 错误信息, 级别较⾼的错误⽇志信息, 但仍然不影响系统的继续运⾏.•WARN: 警告信息, 不影响使⽤, 但需要注意的问题•INFO: 普通信息, ⽤于记录应⽤程序正常运⾏时的⼀些信息, 例如系统启动完成、请求处理完成等.•DEBUG: 调试信息, 需要调试时候的关键信息打印.•TRACE: 追踪信息, ⽐DEBUG更细粒度的信息事件(除⾮有特殊⽤意否则请使⽤DEBUG级别替代)2.⽇志级别的使⽤⽇志级别是开发⼈员⾃⼰设置的. 开发⼈员根据⾃⼰的理解来判断该信息的重要程度针对这些级别, Logger 对象分别提供了对应的⽅法, 来输出⽇志./**2* 打印不同级别的⽇志3*return4*/5RequestMapping(/printLog)6publicStringprintLog() {7logger.trace( trace );8logger.debug( debug );9logger.info( info );10logger.warn( warn );11logger.error( error );1213return打印不同级别的⽇志;14}观察打印的⽇志结果:结果发现, 只打印了info, warn和error级别的⽇志这与⽇志级别的配置有关, ⽇志的输出级别默认是 info级别, 所以只会打印⼤于等于此级别的⽇志, 也就是info, warn和error八.⽇志配置⽇志级别配置只需要在配置⽂件中设置logging.level配置项即可如下所示Properties配置logging.level.rootdebugyml配置logging:level:root:debug1.⽇志持久化以上的⽇志都是输出在控制台上的, 然⽽在线上环境中, 我们需要把⽇志保存下来, 以便出现问题之后追溯问题. 把⽇志保存下来就叫持久化⽇志持久化有两种⽅式 配置⽇志⽂件名/配置⽇志的存储⽬录配置⽇志⽂件的路径和⽂件名Properties配置logging.file.namelogger/springboot.logyml配置logging: file: name:logger/springboot.log配置⽇志⽂件的保存路径:Properties配置logging.file.pathD:/tempyml配置logging: file: name:D:/temp九.总结⽇志是程序中的重要组成部分使⽤⽇志可以快速的发现和定位问题Spring Boot 内容了⽇志框架默认情况下使⽤的是 info ⽇志级别将⽇志输出到控制台的我们可以通过 lombok 提供的Slf4j注解和log对象快速的打印⾃定义⽇志⽇志包含 6 个级别, ⽇志级别越⾼收到的⽇志信息也就越少我们可以通过配置⽇志的保存名称或保存⽬录来将⽇志持久化.
阅读完成 · 觉得有帮助?