SpringBoot之旅第三篇-日志
一、前言
日志对于一个系统的重要性不言而喻,日志能帮我们快速定位线上问题,市场上存在非常多的日志框架,比较常见的有 JUL,JCL,Log4j,Log4j2,Logback、SLF4j、jboss-logging等。
spring-boot-starter-logging采用了slf4j+logback的形式,SLF4j(Simple Logging Facade for Java)是日志门面(日志抽象接口),logback是日志实现。我们开发的时候,日志记录方法的调用,不应该来直接调用日志的实现类,而是调用日志抽象层里面的方法。
这里我们想到一个问题,我们的系统也会依赖其他框架,比如Spring、Hibernate, 这些框架本身也存在自己的日志框架,但我们需要做到使用slf4j进行输出,这个可以通过适配器模式来实现的,首先我们排除原先框架使用的日志,然后用中间包来替换原有的日志框架,这个中间包去实现原先日志框架的API,这样我们只需要导入slf4j转换包的依赖就可以解决。如图
二、日志使用
日志的使用非常简单,只要用LogFactory.getLog(getClass()) 获取日志,然后记录信息。
- Log log = LogFactory.getLog(getClass());
- log.trace("这是trace日志");
- log.debug("这是debug日志");
- log.info("这是info日志");
- log.warn("这是warn日志");
- log.error("这是error日志");
日志级别由低到高,并且可以调整日志级别,日志就只会在这个级别以上(包括自己)的日志生效。springboot的默认级别是info, 我们可以针对包进行调整
- logging.level.com.yuanqinnan=trace
除了级别配置外,还有两个比较重要的配置,路径和格式
路径有两个配置方式:
- #当前项目下生成springlog.log
- #logging.file=springboot.log
- #完整的路径名称
- logging.file=G:/springboot.log
- #创建路径,由springboot生成默认的文件
- logging.path=G:/springlog
这两个是冲突配置,两个都写的话以logging.file为主。
我们可以对日志的输出进行格式配置:
- #在控制台输出的日志的格式
- logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
- # 指定文件中日志输出的格式
- logging.pattern.file=%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} ==== %msg%n
具体参数:
- %d表示日期时间,
- %thread表示线程名,
- %-5level:级别从左显示5个字符宽度
- %logger{50} 表示logger名字最长50个字符,否则按照句点分割。
- %msg:日志消息,
- %n是换行符
springboot的日志都有自己的默认文件,如果需要用自己的日志配置,只要增加一个相同文件,那么就会使用我们自己配置的文件。
Logging System | Customization |
---|---|
Logback | logback-spring.xml , logback-spring.groovy , logback.xml or logback.groovy |
Log4j2 | log4j2-spring.xml or log4j2.xml |
JDK (Java Util Logging) | logging.properties |
springboot推荐使用logback-spring.xml
来进行配置。
SpringBoot的有高级Profile功能,如:
- <springProfile name="staging">
- <!-- configuration to be enabled when the "staging" profile is active -->
- 可以指定某段配置只在某个环境下生效
- </springProfile>
日志的基本内容就是这些,另附上日志的一些常用配置供参考:
- <?xml version="1.0" encoding="UTF-8"?>
- <!--
- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒当scan为true时,此属性生效。默认的时间间隔为1分钟。
- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
- -->
- <configuration scan="false" scanPeriod="60 seconds" debug="false">
- <!-- 定义日志的根目录 -->
- <property name="LOG_HOME" value="/app/log" />
- <!-- 定义日志文件名称 -->
- <property name="appName" value="appName"></property>
- <!-- ch.qos.logback.core.ConsoleAppender 表示控制台输出 -->
- <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
- <!--
- 日志输出格式:
- %d表示日期时间,
- %thread表示线程名,
- %-5level:级别从左显示5个字符宽度
- %logger{50} 表示logger名字最长50个字符,否则按照句点分割。
- %msg:日志消息,
- %n是换行符
- -->
- <layout class="ch.qos.logback.classic.PatternLayout">
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
- </layout>
- </appender>
- <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->
- <appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
- <!-- 指定日志文件的名称 -->
- <file>${LOG_HOME}/${appName}.log</file>
- <!--
- 当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名
- TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。
- -->
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <!--
- 滚动时产生的文件的存放位置及文件名称 %d{yyyy-MM-dd}:按天进行日志滚动
- %i:当文件大小超过maxFileSize时,按照i进行文件滚动
- -->
- <fileNamePattern>${LOG_HOME}/${appName}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
- <!--
- 可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每天滚动,
- 且maxHistory是365,则只保存最近365天的文件,删除之前的旧文件。注意,删除旧文件是,
- 那些为了归档而创建的目录也会被删除。
- -->
- <MaxHistory>365</MaxHistory>
- <!--
- 当日志文件超过maxFileSize指定的大小是,根据上面提到的%i进行日志文件滚动 注意此处配置SizeBasedTriggeringPolicy是无法实现按文件大小进行滚动的,必须配置timeBasedFileNamingAndTriggeringPolicy
- -->
- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
- <maxFileSize>100MB</maxFileSize>
- </timeBasedFileNamingAndTriggeringPolicy>
- </rollingPolicy>
- <!-- 日志输出格式: -->
- <layout class="ch.qos.logback.classic.PatternLayout">
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern>
- </layout>
- </appender>
- <!--
- logger主要用于存放日志对象,也可以定义日志类型、级别
- name:表示匹配的logger类型前缀,也就是包的前半部分
- level:要记录的日志级别,包括 TRACE < DEBUG < INFO < WARN < ERROR
- additivity:作用在于children-logger是否使用 rootLogger配置的appender进行输出,
- false:表示只用当前logger的appender-ref,true:
- 表示当前logger的appender-ref和rootLogger的appender-ref都有效
- -->
- <!-- hibernate logger -->
- <logger name="com.yuanqinnan" level="debug" />
- <!-- Spring framework logger -->
- <logger name="org.springframework" level="debug" additivity="false"></logger>
- <!--
- root与logger是父子关系,没有特别定义则默认为root,任何一个类只会和一个logger对应,
- 要么是定义的logger,要么是root,判断的关键在于找到这个logger,然后判断这个logger的appender和level。
- -->
- <root level="info">
- <appender-ref ref="stdout" />
- <appender-ref ref="appLogAppender" />
- </root>
- </configuration>
SpringBoot之旅第三篇-日志的更多相关文章
- SpringBoot之旅第四篇-web开发
一.引言 有了自动配置,springboot使web开发变得简单,这个在springboot之旅中的第一篇中就有体现,实际的开发中当然不会这么简单,很多时候我们都需要自己去定制一些东西.web开发的东 ...
- SpringBoot入门系列:第三篇 日志输出
http://blog.csdn.net/lxhjh/article/details/51752419
- SpringBoot之旅第五篇-数据访问
一.引言 大部分系统都离不开数据访问,数据库包括SQL和NOSQL,SQL是指关系型数据库,常见的有SQL Server,Oracle,MySQL(开源),NOSQL是泛指非关系型数据库,常见的有Mo ...
- Mybatis之旅第三篇-SqlMapConfig.xml全局配置文件解析
一.前言 刚换工作,为了更快的学习框架和了解业务,基本每天都会加班,导致隔了几天没有进行总结,心里总觉得不安,工作年限越长越感到学习的重要性,坚持下去!!! 经过前两篇的总结,已经基本掌握了mybat ...
- SpringBoot之旅第六篇-启动原理及自定义starter
一.引言 SpringBoot的一大优势就是Starter,由于SpringBoot有很多开箱即用的Starter依赖,使得我们开发变得简单,我们不需要过多的关注框架的配置. 在日常开发中,我们也会自 ...
- Spring之旅第三篇-Spring配置详解
上一篇学习了IOC的概念并初步分析了实现原理,这篇主要学习Spring的配置,话不多说,让我们开始! 一.Bean元素配置 1.1 基本配置 看一个最基本的bean配置 <bean name=& ...
- SpringBoot之旅第七篇-Docker
一.引言 记得上大三时,要给微机房电脑安装系统,除了原生的操作系统外,还要另外安装一些必要的开发软件,如果每台电脑都重新去安装的话工作量就很大了,这个时候就使用了windows镜像系统,我们将要安装的 ...
- .net core使用ocelot---第三篇 日志记录
简介 .net core使用ocelot---第一篇 简单使用 .net core使用ocelot---第二篇 身份验证使用 上篇介绍使用asp.net core 创建API网关.本文将介绍Ocelo ...
- (转)SpringBoot非官方教程 | 第三篇:SpringBoot用JdbcTemplates访问Mysql
本文介绍springboot通过jdbc访问关系型MySQL,通过spring的JdbcTemplate去访问. 准备工作 jdk 1.8 maven 3.0 idea mysql 初始化mysql: ...
随机推荐
- Android 开发知识体系
知识体系 1.Unix/Linux平台技术:基本命令,Linux下的开发环境 2.企业级数据库技术:SQL语言.SQL语句调优.Oracle数据库技术 3.Java 语言核心技术:Java语言基础.J ...
- idea 整合ssm 启动页404问题
- 计算机的Cache和Memory访问时Write-back,Write-through及write allocate的区别
计算机的存储系统采用Register,Cache,Memory和I/O的方式来构成存储系统,无疑是一个性能和经济性的妥协的产物.Cache和Memory机制是计算机硬件的基础内容,这里就不再啰嗦.下面 ...
- Python微信公众号开发
最近老大叫我学习开发微信,试着玩了下.网上查了下文档.有点过时. 简单步骤: 1)申请服务器并完成环境配置 去腾讯云购买云服务器.当然你也可以购买其他产品,比如阿里云.因为我是学生,有优惠110一年. ...
- .NET开发微信小程序(基础配置)
1.微信小程序的必备Model public class WxConfig { /// <summary> /// 小程序的appId /// 登录小程序可以直接看到 /// </s ...
- python_黑洞数
>>> def main(n): start = 10**(n-1)+2 end = start*10-20 for i in range(start,end): i = str(i ...
- redis常见重要性能指标数据分析和相关问题解决方案
性能相关的数据指标 通过Redis-cli命令行界面访问到Redis服务器,然后使用info命令获取所有与Redis服务相关的信息.通过这些信息来分析文章后面提到的一些性能指标. info命令输出的数 ...
- dup和dup2应用实例(dup跟APUE有出入,close+dup=dup2?)
dup/dup2函数 有时我们希望把标准输入重定向到一个文件,或者把标准输出重定向到一个网络连接. dup()与dup2()能对输入文件描述符进行重定向. 函数原型如下: dup函数创建一个新的文件描 ...
- c++ 输出精度
1 保留小数点后**位 cout.flags(ios::fixed); cout.precision(4); //设置输出精度,
- 可能是迄今为止最好的GitHub代码浏览插件--赞
https://chrome.google.com/webstore/category/extensions?hl=zh-CN 搜索"insight.io" chrome://ex ...