【SSM基础】Logback日志管理

其他文章: bookcase微服务实战

1、前言

这篇我们说下日志管理,业界常用的日志管理一共有几种: java.util.Logging,Log4j,Log4j2,Logback,Slf4j。

各个日志管理的关系。具体可以查看博客: https://www.cnblogs.com/suger43894/p/9543685.html
其中 java.util.Logging是原生的日志工具,log4j 框架比较旧, logback是在log4j的优化,log4j2是对log4j的重构并吸收了logback的功能。 slf4j 是对常用的几种日志的门面封装。

logback 官网是这样介绍的,Logback 旨在作为流行的 log4j 项目的继承者。它是由 log4j 的创始人 Ceki Gülcü 设计的。

2、应用

Logback 的基本架构足够通用,可以在不同的情况下应用。目前,logback分为三个模块,logback-core、logback-classic和logback-access。

核心模块为其他两个模块奠定了基础。经典模块扩展了核心。经典模块对应于 log4j 的显着改进版本。Logback-classic 原生实现了SLF4J API,因此您可以轻松地在 logback 和其他日志系统之间来回切换,例如 JDK
1.4 中引入的 log4j 或 java.util.logging (JUL)。第三个模块access与 Servlet 容器集成以提供 HTTP 访问日志功能。

2.1、基本应用

  • 添加依赖

Logback也是SpringBoot的默认日志框架,可以直接使用,具体spring-boot-starter中依赖为:


<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId><version>2.3.7.RELEASE</version><scope>compile</scope>
</dependency>
  • 日志测试

@RestController
@RequestMapping("/book")
@Api(value = "书籍管理", tags = "书籍管理")
@RequiredArgsConstructor
public class BookController {private static Logger logger = LoggerFactory.getLogger(BookController.class);private final IBookService bookService;@GetMapping(value = "/getByName")@ApiOperation(value = "根据名称查询书籍信息", notes = "根据名称查询书籍信息")@ApiImplicitParams({@ApiImplicitParam(name = "name", value = "书籍名称", required = true)})public IPage<Book> getBookById(@RequestParam String name) {logger.info("logger.info");logger.warn("logger.warn");logger.error("logger.error");logger.trace("logger.trace");logger.debug("logger.debug");return bookService.selectBooksByName(name);}
}

通过swagger 访问之前的数据,就可以看到打印的日志:

2022-04-07 15:26:16.314  INFO 16212 --- [nio-8081-exec-9] com.fans.bk1.controller.BookController   : logger.info
2022-04-07 15:26:16.314  WARN 16212 --- [nio-8081-exec-9] com.fans.bk1.controller.BookController   : logger.warn
2022-04-07 15:26:16.314 ERROR 16212 --- [nio-8081-exec-9] com.fans.bk1.controller.BookController   : logger.error

日志级别分别对应 trace > debug > info > warn > error,具体可以查看class : ch.qos.logback.classic.Level
这里可以得到结论,springboot 默认的日志级别是info级别。

private static Logger logger = LoggerFactory.getLogger(BookController.class);
也可以使用lombok注解@slf4j代替。lombok 使用的时候使用log 命名当前class Logger对象。

注意:

例如使用的时候我们可以通过 log.info 输出日志,这个时候可以编写String.format方式的写法:
第二种写法是第一种效率的30倍。

The following two lines will yield the exact same output. However, in case of a disabled logging statement,the second variant will outperform the first variant by a factor of at least 30.logger.debug("The new entry is "+entry+".");
logger.debug("The new entry is {}.", entry);

所以我们日常种添加日志要使用{} 代替要输入的变量,并通过逗号依次输入。

2.2、扩展应用

开发工作中的日志基本工作日志已经足够使用,我们可以通过日志进行开发中的问题定位。
但是我们还有一些需求是默认配置无法实现的:

  1. 开发过程中想要打印出SQL,如何配置。
  2. 我们完成开发部署到服务器,需要定位运行中的异常问题,这个时候需要日志输出到文件中。
  3. 服务器中日志过多,占用磁盘过多的空间,日志需要进行压缩。
  4. 我们想调用自定义的服务,或者第三方服务,例如通过kafka写入ES集群,用于大数据分析。

以上logback 都可以实现,当logback进行扫描的时候,会先找classpath下,logback-test.xml,然后找logback.xml。
而SpringBoot进行封装的时候,我们可以通过logback-spring.xml进行配置。其中的内容是相同的。

此处展示当前配置:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false"><!-- 定义日志文件名称,与工程名一致 --><property name="APP_NAME" value="bookcase" /><!-- 定义日志的根目录 --><property name="LOG_HOME" value="./logs" /><!-- 正常文件输出设置 --><!-- 样例:[ INFO ]     [2019-01-19 15:15:59]      org.apache.tomcat.util.net.NioSelectorPool [179] - Using a shared selector for servlet[ %-5level]  [%date{yyyy-MM-dd HH:mm:ss}]  %logger{96}                             [%line]   %msg%n、level日志级别  时间                          打印日志所处包.类                          出现代码行  日志信息--><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><File>${LOG_HOME}/${APP_NAME}.log</File><!-- 配置日志所生成的目录以及生成文件名的规则  --><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><FileNamePattern>${LOG_HOME}/${APP_NAME}/${APP_NAME}-%d{yyyy-MM-dd}-%i.zip</FileNamePattern><maxFileSize>10MB</maxFileSize><!-- 日志文件过大会使的编辑器打开非常慢,因此设置日志最大50MB --><maxHistory>30</maxHistory><!-- 保存30天 --><totalSizeCap>10GB</totalSizeCap><!-- 总日志大小 --></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>[ %-5level ] [%date{yyyy-MM-dd HH:mm:ss}] [%thread-%logger{96}-%mdc{client}-%line line]  - %msg%n</pattern><charset>UTF-8</charset> <!-- 此处设置字符集,防止中文乱码 --></encoder><!-- 不接受错误日志 --><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>ERROR</level><onMatch>DENY</onMatch><onMismatch>NEUTRAL</onMismatch></filter><!-- 不接受警告日志--><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>WARN</level><onMatch>DENY</onMatch><onMismatch>NEUTRAL</onMismatch></filter><!--如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false。--><prudent>false</prudent></appender><!-- 异常文件输出设置,将异常堆栈另外保存一份到单独的文件中,方便查找 --><appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"><File>${LOG_HOME}/${APP_NAME}.error.log</File><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><FileNamePattern>${LOG_HOME}/${APP_NAME}/${APP_NAME}.error-%d{yyyy-MM-dd}-%i.zip</FileNamePattern><maxFileSize>50MB</maxFileSize><maxHistory>30</maxHistory><totalSizeCap>10GB</totalSizeCap><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><!-- 文件达到 最大128MB时会被压缩和切割 --><maxFileSize>128 MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>[ %-5level ] [%date{yyyy-MM-dd HH:mm:ss}] [%thread-%logger{96}-%mdc{client}-%line line]  - %msg%n</pattern><charset>UTF-8</charset> <!-- 此处设置字符集 --></encoder><!-- 过滤器,可以过滤掉不符合条件的日志,INFO及以上的日志被处理,其它的拒绝,执行一个过滤器会有返回个枚举值,即DENY,NEUTRAL,ACCEPT其中之一。返回DENY,日志将立即被抛弃不再经过其他过滤器;返回NEUTRAL,有序列表里的下个过滤器过接着处理日志;返回ACCEPT,日志会被立即处理,不再经过剩余过滤器。--><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只接受错误日志 --><level>ERROR</level><onMatch>ACCEPT</onMatch><onMismatch>NEUTRAL</onMismatch></filter><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只接受警告日志 --><level>WARN</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><!--控制台输出的格式设置 --><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><!-- 控制台输出的日志 的格式 --><encoder><pattern>[%(%-5level)] %([%date{yyyy-MM-dd HH:mm:ss}]) %([%logger{0}])  - %msg%n</pattern><charset>UTF-8</charset> <!-- 此处设置字符集 --></encoder><!-- 只是DEBUG级别以上的日志才显示 --><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>DEBUG</level></filter></appender><!--  <logger name="com.fans.bk1.mapper" level="DEBUG" />--><root level="debug"><appender-ref ref="CONSOLE" /></root><root level="info"><appender-ref ref="FILE" /><appender-ref ref="FILE_ERROR" /></root>
</configuration>
  • xml 标签解析
  1. configuration 是文档配置根节点,scan=true 当配置文件发生变动,会重新加载,时间范围是scanPeriod,debug: 当此属性设置为true时,将打印出logback内部日志信息,默认false。
  2. property 配置key-value 常量,可以通过${key}在当前文档种引用value。
  3. root 是根节点,属性level设置日志级别,当子节点未设置级别时使用。通过appender-ref 指向子节点。
  4. appender 时输出日志指向地址,可以是console,file等,这里只列常用的console和file。输出的时候异常日志和正常日志分开,并根据文件时间和大小进行分割文件。具体可以参考上述示例。
  5. logger 节点可以自定义级别,其中属性name的值可以是class或者package,level属性设置class或package的日志级别。logger可以和root一样包含appender-ref标签。

3、总结

简单开发测试使用默认级别即可,正式项目中还是需要配置自定义配置文件。
需要配置自定义包级别,可以使用logger标签。
编写日志的时候使用 {} 代替变量输入。

【SSM基础】Logback日志管理相关推荐

  1. SSM配置logback日志

    SSM配置logback日志 添加logback,slf4j依赖 <!--日志--> <dependency><groupId>org.slf4j</grou ...

  2. SpringBoot基础篇日志管理之logback配置文件

    1.美图 2.概述 SpringBoot默认选用logback进行日志管理,前一篇讲述了默认配置日志的参数,然而这些内容比较初级,并不一定能满足我们更加特殊的需求(比如输出到多个不同的配置文件,不同的 ...

  3. Linux基础:日志管理

    一.日志管理简介 1. 日志服务: 在CentOS 6.x中日志服务已经由rsyslogd取 代了原先的syslogd服务.rsyslogd日志服 务更加先进,功能更多.但是不论该服务 的使用,还是日 ...

  4. SpringBoot基础篇日志管理之默认配置

    1.美图 2.概述 创建一个SpringBoot项目,根据官方文档的说明,默认选择的是Logback来记录日志:logback也是相对来说用的比较多的框架了,下文全都默认以logback作为日志输出框 ...

  5. java 如何去掉http debug日志_Spring Boot手把手教学(3):从零配置logback日志

    前言 使用logback我们可以自定义控制台日志输出,可以实现对不同日志不同级别打印到不同的文件中,可以对日志进行归档保存,并定时删除: 对于一个应用来讲,一个好的日志系统,对于对问题的追溯有很大的帮 ...

  6. Spring Boot 2.x的默认日志管理与Logback配置详解

    前沿技术早知道,弯道超车有希望 积累超车资本,从关注DD开始 Spring Boot在所有内部日志中使用Commons Logging,但是对底层日志的实现是开放的.在Spring Boot生态中,为 ...

  7. logback日志pattern_Logback日志基础及自定义配置代码实例

    Logback日志基础配置 logback日志配置有很多介绍,但是有几个非常基础的,容易忽略的.下面是最简单的一个配置,注意加粗的描述 ${log.path}/errorlog.log %d{yyyy ...

  8. LINUX学习基础篇(三十五)日志管理

    LINUX学习基础篇(三十五)日志管理 日志管理 系统中常见的日志文件 日志文件格式 rsyslogd服务的配置文件 日志轮替 logrotate配置文件 配置文件夹 /etc/logrotate.d ...

  9. java程序日志管理

    初入软件开发这一行的人,可能对日志管理的概念并不是很明确,大概是由于经验所限,以至于根本还考虑不到这个问题. 而从某种意义上来说,日志管理实际上也不需要初入这一行的人来管,他们只需要负责实现自己的主要 ...

最新文章

  1. 大量数据转移_大量数据
  2. 吴恩达深度学习 —— 2.16 关于python/numpy向量的说明
  3. nagios监控oralce数据库的表空间大小
  4. 微型计算机原理设计存储系统,微机原理存储器设计讨论报告
  5. 进程管理工具   htop
  6. C语言中数组变量和指针变量
  7. VSCode调试Python时终端输出中文乱码解决方法2
  8. css中正确设置微软雅黑字体
  9. 收款收据设计html,统一收款收据打印软件怎么制作收据 制作打印的方法
  10. 终端数据防泄漏解决方案
  11. C/C++ getcwd 获取项目的运行路径
  12. PAT乙级—1053. 住房空置率 (20)-native
  13. 基于Spring+SpringMVC+MyBatis博客系统的开发教程(十六)
  14. 大型网站具备的9大特点
  15. setsockopt用法描述
  16. 关于如何通过信息系统监理师的自我心得
  17. Ubuntu 20.04安装使用Rime双拼输入法
  18. OV2SLAM 安装运行
  19. 最新传奇木马及其防范全攻略
  20. 需求调研报告模板_2020年全球TAC薄膜行业市场现状调研报告-国内需求增速超世界水平...

热门文章

  1. C++实例:抽奖程序实现
  2. Android 动态更新Menu菜单
  3. 听迅雷COO程浩先生演讲有感
  4. 微信直播带货效果怎么样
  5. aptana使用php,用Aptana Studio 1.5开发PHP,很强的PHP IDE,Aptana PHP,简介,安装教程
  6. 未来已来:算力如何改变世界丨文末有赠书
  7. 良心安利吸顶灯ies光域网素材网站
  8. cocos2dx 面试题
  9. 计算机科学技术与工程技术,科学技术与工程
  10. java final修饰符_浅谈JAVA中的final修饰符