理论知识
1、为什么要用日志?你是否因为项目出现问题,查找日志文件定位错误花费N多时间,是否为此苦不堪言。
2、Spring Boot 默认集成Logback。日志输出内容元素具体如下:
·时间日期:精确到毫秒
·日志级别:ERROR, WARN, INFO, DEBUG or TRACE
·进程ID
·分隔符:— 标识实际日志的开始
·线程名:方括号括起来(可能会截断控制台输出)
·Logger名:通常使用源代码的类名
·日志内容
3、日志级别从低到高分为:
TRACE DEBUG INFO WARN ERROR FATAL
4、根据不同的日志系统,你可以按如下规则组织配置文件名,就能被正确加载:
Logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy
Log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml
Log4j2:log4j2-spring.xml, log4j2.xml
JDK (Java Util Logging):logging.properties
Spring Boot官方推荐优先使用带有-spring的文件名作为你的日志配置(如使用logback-spring.xml,而不是logback.xml),命名为logback-spring.xml的日志配置文件,spring boot可以为它添加一些spring boot特有的配置项。
理论知识很重要!!!
虽说实践出真知,但是没有理论做支持,实践只能是盲目的瞎摸,所以,在学好理论的前提下,结合实践,就能更好的为我们服务。
log很强大!
实际开发
1、我们先看项目目录:
2、在application.yml中需要这样配置以下内容:
spring:
profiles:
active: dev
logback:
appName: examplelog
fileType: out
3、在-dev.yml,-test.yml,-prod.yml中需要添加以下配置:
logback:
logDir: log/dev
logging:
level:
com.fengwenyi.log: debug
com.fengwenyi.log.service: error
4、我们来看一下logback-spring.xml写法:
!-- Logbackconfiguration. See http://logback.qos.ch/manual/index.html --
configuration scan=truescanPeriod=10 seconds
!--继承spring boot提供的logback配置--
!--include resource=org/springframework/boot/logging/logback/base.xml /--
!--设置系统日志目录--
!--property name=APP_DIR value=spring-boot-log/--
!--application.yml 传递参数,不能使用logback自带的property标签 --
springProperty scope=context name=logDirsource=logback.logDir/
springProperty scope=context name=appNamesource=logback.appName/
springProperty scope=context name=fileType source=logback.fileType/
!-- 彩色日志 --
!-- 彩色日志依赖的渲染类 --
conversionRule conversionWord=clr converterClass=org.springframework.boot.logging.logback.ColorConverter/
conversionRule conversionWord=wex converterClass=org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter/
conversionRule conversionWord=wEx converterClass=org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter/
!-- 彩色日志格式 --
property name=CONSOLE_LOG_PATTERN
value=${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}/
!-- 控制台输出 --
appender name=CONSOLE class="ch".qos.logback.core.ConsoleAppender
encoder
Pattern${CONSOLE_LOG_PATTERN}/Pattern
charsetUTF-8/charset !-- 此处设置字符集 --
/encoder
!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息--
filter class="ch".qos.logback.classic.filter.ThresholdFilter
leveldebug/level
/filter
/appender
!-- 时间滚动输出 level为 DEBUG 日志 --
appender name=DEBUG_FILE class="ch".qos.logback.core.rolling.RollingFileAppender
!-- 正在记录的日志文件的路径及文件名 --
file${logDir}/${appName}-debug.${fileType}/file
!--日志文件输出格式--
encoder
pattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n/pattern
charsetUTF-8/charset !-- 此处设置字符集 --
/encoder
!-- 日志记录器的滚动策略,按日期,按大小记录 --
rollingPolicy class="ch".qos.logback.core.rolling.TimeBasedRollingPolicy
!--
归档的日志文件的路径,例如今天是2017-04-26日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
而2017-04-26的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引
--
fileNamePattern${logDir}/${appName}-debug-%d{yyyy-MM-dd}.%i.${fileType}/fileNamePattern
!--
除按日志记录之外,还配置了日志文件不能超过500M,若超过500M,日志文件会以索引0开始,
命名日志文件,例如log-error-2017-04-26.0.log
--
timeBasedFileNamingAndTriggeringPolicy class="ch".qos.logback.core.rolling.SizeAndTimeBasedFNATP
maxFileSize500MB/maxFileSize
/timeBasedFileNamingAndTriggeringPolicy
!--日志文件保留天数--
maxHistory30/maxHistory
/rollingPolicy
!-- 此日志文件只记录debug级别的 --
filter class="ch".qos.logback.classic.filter.LevelFilter
leveldebug/level
onMatchACCEPT/onMatch
onMismatchDENY/onMismatch
/filter
/appender
!-- 时间滚动输出 level为 INFO 日志 --
appender name=INFO_FILE class="ch".qos.logback.core.rolling.RollingFileAppender
!-- 正在记录的日志文件的路径及文件名 --
file${logDir}/${appName}-info.${fileType}/file
!--日志文件输出格式--
encoder
pattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n/pattern
charsetUTF-8/charset !-- 此处设置字符集 --
/encoder
!-- 日志记录器的滚动策略,按日期,按大小记录 --
rollingPolicy class="ch".qos.logback.core.rolling.TimeBasedRollingPolicy
!--
归档的日志文件的路径,例如今天是2017-04-26日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
而2017-04-26的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引
--
fileNamePattern${logDir}/${appName}-info-%d{yyyy-MM-dd}.%i.${fileType}/fileNamePattern
!--
除按日志记录之外,还配置了日志文件不能超过500M,若超过500M,日志文件会以索引0开始,
命名日志文件,例如log-error-2017-04-26.0.log
--
timeBasedFileNamingAndTriggeringPolicy class="ch".qos.logback.core.rolling.SizeAndTimeBasedFNATP
maxFileSize500MB/maxFileSize
/timeBasedFileNamingAndTriggeringPolicy
!--日志文件保留天数--
maxHistory30/maxHistory
/rollingPolicy
!-- 此日志文件只记录info级别的 --
filter class="ch".qos.logback.classic.filter.LevelFilter
levelinfo/level
onMatchACCEPT/onMatch
onMismatchDENY/onMismatch
/filter
/appender
!-- 时间滚动输出 level为 WARN 日志 --
appender name=WARN_FILE class="ch".qos.logback.core.rolling.RollingFileAppender
!-- 正在记录的日志文件的路径及文件名 --
file${logDir}/${appName}-warn.${fileType}/file
!--日志文件输出格式--
encoder
pattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n/pattern
charsetUTF-8/charset !-- 此处设置字符集 --
/encoder
!-- 日志记录器的滚动策略,按日期,按大小记录 --
rollingPolicy class="ch".qos.logback.core.rolling.TimeBasedRollingPolicy
!--
归档的日志文件的路径,例如今天是2017-04-26日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
而2017-04-26的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引
--
fileNamePattern${logDir}/${appName}-warn-%d{yyyy-MM-dd}.%i.${fileType}/fileNamePattern
!--
除按日志记录之外,还配置了日志文件不能超过500M,若超过500M,日志文件会以索引0开始,
命名日志文件,例如log-error-2017-04-26.0.log
--
timeBasedFileNamingAndTriggeringPolicy class="ch".qos.logback.core.rolling.SizeAndTimeBasedFNATP
maxFileSize500MB/maxFileSize
/timeBasedFileNamingAndTriggeringPolicy
!--日志文件保留天数--
maxHistory30/maxHistory
/rollingPolicy
!-- 此日志文件只记录warn级别的 --
filter class="ch".qos.logback.classic.filter.LevelFilter
levelwarn/level
onMatchACCEPT/onMatch
onMismatchDENY/onMismatch
/filter
/appender
!-- 时间滚动输出 level为 ERROR 日志 --
appender name=ERROR_FILE class="ch".qos.logback.core.rolling.RollingFileAppender
!-- 正在记录的日志文件的路径及文件名 --
file${logDir}/${appName}-error.${fileType}/file
!--日志文件输出格式--
encoder
pattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n/pattern
charsetUTF-8/charset !-- 此处设置字符集 --
/encoder
!-- 日志记录器的滚动策略,按日期,按大小记录 --
rollingPolicy class="ch".qos.logback.core.rolling.TimeBasedRollingPolicy
!--
归档的日志文件的路径,例如今天是2017-04-26日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
而2017-04-26的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引
--
fileNamePattern${logDir}/${appName}-error-%d{yyyy-MM-dd}.%i.${fileType}/fileNamePattern
!--
除按日志记录之外,还配置了日志文件不能超过500M,若超过500M,日志文件会以索引0开始,
命名日志文件,例如log-error-2017-04-26.0.log
--
timeBasedFileNamingAndTriggeringPolicy class="ch".qos.logback.core.rolling.SizeAndTimeBasedFNATP
maxFileSize500MB/maxFileSize
/timeBasedFileNamingAndTriggeringPolicy
!--日志文件保留天数--
maxHistory30/maxHistory
/rollingPolicy
!-- 此日志文件只记录ERROR级别的 --
filter class="ch".qos.logback.classic.filter.LevelFilter
levelerror/level
onMatchACCEPT/onMatch
onMismatchDENY/onMismatch
/filter
/appender
logger name=org.springframework.web level=info/
logger name=org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor level=INFO/
!--开发环境:打印控制台--
springProfile name=dev
root level=info
appender-ref ref=CONSOLE/
appender-ref ref=DEBUG_FILE/
appender-ref ref=INFO_FILE/
appender-ref ref=WARN_FILE/
appender-ref ref=ERROR_FILE/
/root
/springProfile
!--测试环境:打印控制台和输出到文件--
springProfile name=test
root level=info
appender-ref ref=CONSOLE/
appender-ref ref=INFO_FILE/
appender-ref ref=WARN_FILE/
appender-ref ref=ERROR_FILE/
/root
/springProfile
!--生产环境:输出到文件--
springProfile name=prod
root level=error
appender-ref ref=CONSOLE/
appender-ref ref=DEBUG_FILE/
appender-ref ref=INFO_FILE/
appender-ref ref=ERROR_FILE/
/root
/springProfile
/configuration
5、他有什么功能呢?
·日志可以输出到指定文件
·日志可以按运行环境进行输出
·日志可以按日期进行输出
·不同包可以指定不同的输出级别