在本系列《第四章:日志管理》中,因为工做中日志这块都是走默认配置,也没有深刻了解过,由于部署过程当中直接使用了
linux
中的输出重定向
功能,如java -jar xx.jar > app.log 2>&1 &
,直接输出到某个日志文件了。因此也就没有认真关心过默认的日志格式了。系列文章出来后,也看见有网友反馈说如何进行日志的相关配置,或者配置失效问题。本着负责的原则,本文就来详细介绍下SpringBoot
中日志管理相关配置问题。也是最近熟悉了下,有不足之处,还望指出!html
细说各日志框架整合配置前,咱们先来大体了解下,最多见的日志的几个级别:ERROR
, WARN
, INFO
, DEBUG
和TRACE
。像其余的,好比ALL
、OFF
和FATAL
之类的开发过程当中应该基本上是不会涉及的。因此如下从低到高一次介绍下常见的日志级别。java
若是将日志设置在某个等级,则比此级别高的都能打印出来。好比,设置了INFO
,那么ERROR
, WARN
等都能输出打印了,而DEBUG
、TRACE
等就被忽略了。linux
而为了能很好的对各日志框架的支持,开发过程当中,通常上都是使用Commons Logging
或者SL4J
这些门面
日志工具。其底层封装了统一日志的操做,屏蔽了不一样日志组件之间的差别。使得咱们使用或者切换某个日志框架时,只须要引入相关的依赖包就可替换完毕,而无需去修改源码。其最后日志的实际操做仍是由像log4j2
、logback
这些日志框架去实现的。git
从前面章节,咱们知道。SpringBoot
中,内部日志也是使用Commons Logging
,同时默认配置也提供了对经常使用日志的支持,如:Java Util Logging
,Log4J
, Log4J2
和Logback
。每种Logger
均可以经过配置使用控制台或者文件输出日志内容。github
关于日志的自定义配置等相关知识点,这里就不阐述了,可直接移步《Spring Boot | 第四章:日志管理》了解。本章节主要就探讨下经常使用的log4j2
及logback
相关配置。web
log4j2
是log4j
的升级版本,号称比初版具备更高的性能,固然如今也慢慢被logback
替代了。spring
0.移除SpringBoot默认的logback
依赖包。因为咱们直接引入了spring-boot-starter-web
,因此直接排除了相应包。apache
题外话:真正引入spring-boot-starter-logging
包的是spring-boot-starter
依赖,因此咱们也能够直接在spring-boot-starter
下排除便可。json
<!-- 排除logging --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency>
或者springboot
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency>
log4j2
依赖。<!-- 引入log4j2 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>
按官网的说明,默认是支持
XML
,JSON
,YAML
和properties
格式。
按SpringBoot官网的说明,咱们命名一个log4j2-spring.xml
文件做为默认的日志配置文件。
log4j2-spring.xml(本配置改造自:聊一聊log4j2配置文件log4j2.xml):
<?xml version="1.0" encoding="UTF-8"?> <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --> <!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,能够不设置,当设置成trace时,你会看到log4j2内部各类详细输出--> <!--monitorInterval:Log4j可以自动检测修改配置 文件和从新配置自己,设置间隔秒数--> <configuration status="WARN" monitorInterval="30"> <!--先定义全部的appender--> <appenders> <!--这个输出控制台的配置--> <console name="Console" target="SYSTEM_OUT"> <!--输出日志的格式--> <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> </console> <!--文件会打印出全部信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用--> <File name="log" fileName="log/test.log" append="false" > <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/> </File> <!-- 这个会打印出全部的info及如下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份创建的文件夹下面并进行压缩,做为存档--> <RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/info.log" filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log"> <!--控制台只输出level及以上级别的信息(onMatch),其余的直接拒绝(onMismatch)--> <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> <Policies> <TimeBasedTriggeringPolicy/> <SizeBasedTriggeringPolicy size="100 MB"/> </Policies> </RollingFile> <RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/warn.log" filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log"> <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> <Policies> <TimeBasedTriggeringPolicy/> <SizeBasedTriggeringPolicy size="100 MB"/> </Policies> <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 --> <DefaultRolloverStrategy max="20"/> </RollingFile> <RollingFile name="RollingFileError" fileName="${sys:user.home}/logs/error.log" filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log"> <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> <Policies> <TimeBasedTriggeringPolicy/> <SizeBasedTriggeringPolicy size="100 MB"/> </Policies> </RollingFile> </appenders> <!--而后定义logger,只有定义了logger并引入的appender,appender才会生效--> <loggers> <!--过滤掉spring和mybatis的一些无用的DEBUG信息--> <logger name="org.springframework" level="INFO"></logger> <logger name="org.mybatis" level="INFO"></logger> <!-- 自定义包下设置为INFO,则能够看见输出的日志不包含debug输出了 --> <logger name="cn.lqdev.learning" level="INFO"/> <root level="all"> <appender-ref ref="Console"/> <appender-ref ref="RollingFileInfo"/> <appender-ref ref="RollingFileWarn"/> <appender-ref ref="RollingFileError"/> </root> </loggers> </configuration>
我以为这个配置步骤就是:先配置appenders
,按需求进行个性化配置,如按天记录等等,而后可使用logger
个性化配置一些包的level
日志等级,最后配置下root
的appender
。
从官网文档获悉,从2.4版本后才提供了经过配置文件的支持,这使用时要注意。详细使用语法可查看官网:Configuration with Properties,这里以官网的例子简单说明下:
# log4j2内部自身的日志级别 status = error # 配置日志信息输出到哪里:err表示做为标准错误输出,还能够是一个文件路径或者一个URL dest = err # 配置名称 name = PropertiesConfig # 自定义属性名称,以便在以后的配置中使用,如${filename} property.filename = target/rolling/rollingtest.log # 级别过滤(过滤日志记录) filter.threshold.type = ThresholdFilter # 只记录debug级别以上的日志,大小写均可以 filter.threshold.level = debug # 控制台类型的日志输出源 appender.console.type = Console # 名称 :惟一 appender.console.name = STDOUT # 布局类型 appender.console.layout.type = PatternLayout # 输出模板格式 这是springboot appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} -%5p ${PID:-} [%15.15t] %C{1.} [%t]: %m%n # 过滤级别 ThresholdFilter:低于级别的不输出 appender.console.filter.threshold.type = ThresholdFilter # 记录日志的级别 appender.console.filter.threshold.level = info # 滚动文件,会根据配置如文件大小或者时间自动生成一个新文件 appender.rolling.type = RollingFile appender.rolling.name = RollingFile # 日志文件名称 appender.rolling.fileName = ${filename} # 日志回滚的文件命名规则 appender.rolling.filePattern = target/rolling2/test1-%d{MM-dd-yyyy}-%i.log.gz appender.rolling.layout.type = PatternLayout # 输出格式 appender.rolling.layout.pattern = %d %p %C{1.} [%t] %m%n # 滚动日志的策略,即设置什么时候新建日志文件输出日志 appender.rolling.policies.type = Policies # 设置时间 appender.rolling.policies.time.type = TimeBasedTriggeringPolicy # 指定多久滚动一次 单位跟着filePattern配置精度最后一位 ,这里就是2秒了 appender.rolling.policies.time.interval = 2 appender.rolling.policies.time.modulate = true # 日志文件的大小 appender.rolling.policies.size.type = SizeBasedTriggeringPolicy # 为了测试设置小一点 appender.rolling.policies.size.size=1kb ## 还有其余的触发条件如:CronTriggeringPolicy 按Cron表达式进行的 具体使用可自行搜索 # 指定同一个文件夹下最多有几个日志文件时开始删除最旧的,建立新的 appender.rolling.strategy.type = DefaultRolloverStrategy # 最多5个文件,其实仍是看filePattern的i的值,当大于5后,就会自动覆盖了 appender.rolling.strategy.max = 5 rootLogger.level = info rootLogger.appenderRef.stdout.ref = STDOUT
此处须要额外设置配置文件属性值(logging.config
),本地测试时,就目录rolling
会生成文件,但里面是空的。加上后就正常了:
logging.config=classpath:log4j2.properties
题外话:设置完,对properties配置规则仍是不太了解。。感受怎么配好像均可以输出,还望有网友能分享下具体的配置规则。对比完,仍是以为xml
格式比较直观也容易理解。
按官网说明,还能够以
json
和yml
格式进行配合,但须要加入相应依赖。
格式 | 依赖包 | 文件名 |
---|---|---|
YAML | com.fasterxml.jackson.core:jackson-databind 、com.fasterxml.jackson.dataformat:jackson-dataformat-yaml |
log4j2.yaml 、log4j2.yml |
JSON | com.fasterxml.jackson.core:jackson-databind |
log4j2.json 、log4j2.jsn |
按须要添加相应依赖包便可。这里就不细说了。
对于格式化输出时,会看见有不一样的格式化符号,起初看了也是一头雾水,下面搜索相关资料后进行简单整理概括下。
题外话:SpringBoot
默认的log4j2配置文件在:spring-boot-1.5.15.RELEASE.jar/org/springframework/boot/logging/log4j2/log4j2.xml
。
具体官网有说明:http://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout
######### 常见参数 ######### // %c{参数} 或 %logger{参数} ##输出日志名称 %C{参数} 或 %class{参数 ##输出类型 %d{参数}{时区te{参数}{时区} ##输出时间,如:%d{yyyy-MM-dd HH:mm:ss, SSS} %F|%file ##输出文件名 highlight{pattern}{style} ##高亮显示 %l ##输出错误的完整位置 %L ##输出错误行号 %m 或 %msg 或 %message ##输出错误信息 %M 或 %method ##输出方法名 %n ##输出换行符 %level{参数1}{参数2}{参数3} ##输出日志的级别 %t 或 %thread ##建立logging事件的线程名 */ ######### 特殊符号 ############ #有些特殊符号不能直接打印,须要使用实体名称或者编号 // & —— & 或者 & < —— < 或者 < > —— > 或者 > “ —— " 或者 " ‘ —— ' 或者 ' */ ######## pattern对齐修饰 ########## // 对齐修饰,能够指定信息的输出格式,如是否左对齐,是否留空格等。 ## 编写格式为在任何pattern和%之间加入一个小数,能够是正数,也能够是负数。 ## 整数表示右对齐,负数表示左对齐; ## 整数位表示输出信息的最小n个字符,若是输出信息不够n个字符,将用空格补齐; ## 小数位表示输出信息的最大字符数,若是超过n个字符,则只保留最后n个字符的信息 ## (注意:保留的是后20个字符,而不是前20个字符) */ #示例以下 // %20 —— 右对齐,不足20个字符则在信息前面用空格补足,超过20个字符则保留原信息 %-20 —— 左对齐,不足20个字符则在信息后面用空格补足,超过20个字符则保留原信息 %.30 —— 若是信息超过30个字符,则只保留最后30个字符 %20.30 —— 右对齐,不足20个字符则在信息前面用空格补足,超过30个字符则只保留最后30个字符 %-20.30 —— 左对齐,不足20个字符则在信息后面用空格补足,超过30个字符则只保留最后30个字符
可直接经过多环境配置文件,设置logging.config
的值,如 application-test.properties
logging.config=classpath:log4j2-test-spring.xml
application-prod.properties
logging.config=classpath:log4j2-prod-spring.xml
logback
是由log4j创始人设计的又一个开源日志组件。同时也是SpringBoot
默认记录日志的框架。
因为默认就是使用logback
,因此只须要配置一个logback-spring.xml
文件在resources
目录便可,会自动识别的。
logback-spring.xml(修改自:logback.xml详解):
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径 --> <property name="LOG_HOME" value="/home" /> <!-- 控制台输出 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 --> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </encoder> </appender> <!-- 按照天天生成日志文件 --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件输出的文件名 --> <FileNamePattern>${LOG_HOME}/TestoKong.log.%d{yyyy-MM-dd}.log </FileNamePattern> <!--日志文件保留天数 --> <MaxHistory>30</MaxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 --> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </encoder> <!--日志文件最大的大小 --> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>10MB</MaxFileSize> </triggeringPolicy> </appender> <!-- 自定义包下设置为INFO,则能够看见输出的日志不包含debug输出了 --> <logger name="cn.lqdev.learning" level="INFO" /> <!-- 日志输出级别 --> <root level="INFO"> <appender-ref ref="STDOUT" /> <appender-ref ref="FILE" /> </root> </configuration>
使用扩展属性 springProfile
与 springProperty
让 logback-spring.xml
配置实现多环境配置的效果。
<!-- 生产环境生效 --> <springProfile name="prod"> <root level="error"> <appender-ref ref="STDOUT" /> <appender-ref ref="FILE" /> </root> </springProfile> <!-- 测试和开发环境日志级别为INFO/而且记录日志文件 --> <springProfile name="dev,test"> <!-- 日志输出级别 --> <root level="INFO"> <appender-ref ref="STDOUT" /> <appender-ref ref="FILE" /> </root> </springProfile>
springProfile
还支持读取Spring Environment
的属性值
<!-- 读取 spring.application.name 属性来生成日志文件名 scope:做用域 name:在 logback-spring.xml 使用的键 source:application.properties 文件中的键 defaultValue:默认值 --> <springProperty scope="context" name="logName" source="spring.application.name" defaultValue="myapp.log"/>
以后就能够直接使用${logName}
获取到变量值了。
和
log4j2
相似,具体可去官网查看:PatternLayout。
题外话:SpringBoot
默认的logback配置文件在:spring-boot-1.5.15.RELEASE.jar/org/springframework/boot/logging/logback/defaults.xml
。
关于详细属性配置,你们能够自行搜索下。如下是编写此文时,参考的一些网站信息。
https://docs.spring.io/spring-boot/docs/1.5.15.RELEASE/reference/htmlsingle/#boot-features-logging
http://logging.apache.org/log4j/2.x/manual/configuration.html
本文主要是简单介绍了日志相关知识点,同时对于经常使用的
log4j2
和logback
相关配置进行了简单介绍。对于详细的配置信息,可去官网查阅下。另外,对于日志而言,不是越多越好,毕竟日志输出是会有性能损坏的。我的是建议,记录该记录的,保留事故现场的及一些错误都是须要进行日志记录的。而像一些无心义的输出,自己就是多余的。最后,**不要随意打日志!打印日志时也注意不能用字符串拼接,须要使用占位符或者先判断日志级别!不要让日志拖慢了你的系统!**下一章节,主要会介绍下利用AOP
实现统一的访问日志管理。
目前互联网上不少大佬都有
SpringBoot
系列教程,若有雷同,请多多包涵了。本文是做者在电脑前一字一句敲的,每一步都是本身实践和理解的。若文中有所错误之处,还望提出,谢谢。
499452441
lqdevOps
我的博客:http://blog.lqdev.cn
完整示例:https://github.com/xie19900123/spring-boot-learning/tree/master/chapter-23
原文地址:http://blog.lqdev.cn/2018/08/22/springboot/chapter-twenty-three/