springboot(四十三)springboot配置log
1、同步异步分析
同步记录日志方式如下:
多个业务线程打印日志时候要等把内容写入磁盘后才会返回,所以打日志的rt就是写入磁盘的耗时。
而异步记录日志方式如下:
多个业务线程打印日志时候是把打印任务放入内存队列后就直接返回了,而具体打印日志是有日志系统的一个日志线程去队列里面获取然后执行,可见这种打印rt就是写入内存队列的耗时。2、异步配置方式
springboot使用logback记录日志,在resources下创建logbackspring。xml文件来配置
整体配置文件如下:lt;?xmlversion1。0encodingUTF8?configurationcontextNamestcpub日志配置contextNamepropertynameLOGPATHvaluelogs!设置系统日志目录propertynameAPPDIRvaluenewframe!日志记录器,日期滚动记录!正在记录的日志文件的路径及文件名file{LOGPATH}{APPDIR}logerror。logfile!日志记录器的滚动策略,按日期,按大小记录rollingPolicyclassch。qos。logback。core。rolling。TimeBasedRollingPolicy!归档的日志文件的路径,例如今天是20131221日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。而20131221的日志文件在由fileNamePattern指定。d{yyyyMMdd}指定日期格式,i指定索引fileNamePattern{LOGPATH}{APPDIR}errorlogerrord{yyyyMMdd}。i。logfileNamePattern!除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,命名日志文件,例如logerror20131221。0。logtimeBasedFileNamingAndTriggeringPolicyclassch。qos。logback。core。rolling。SizeAndTimeBasedFNATPmaxFileSize2MBmaxFileSizetimeBasedFileNamingAndTriggeringPolicyrollingPolicy!追加方式记录日志trueappend!日志文件的格式encoderclassch。qos。logback。classic。encoder。PatternLayoutEncoderpatternd{yyyyMMddHH:mm:ss。SSS}5levelloggerLine:3Lmsgnpatterncharsetutf8charsetencoder!此日志文件只记录info级别的filterclassch。qos。logback。classic。filter。LevelFilterlevelerrorlevelonMatchACCEPTonMatchonMismatchDENYonMismatchfilterappender!日志记录器,日期滚动记录!正在记录的日志文件的路径及文件名file{LOGPATH}{APPDIR}logwarn。logfile!日志记录器的滚动策略,按日期,按大小记录rollingPolicyclassch。qos。logback。core。rolling。TimeBasedRollingPolicy!归档的日志文件的路径,例如今天是20131221日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。而20131221的日志文件在由fileNamePattern指定。d{yyyyMMdd}指定日期格式,i指定索引fileNamePattern{LOGPATH}{APPDIR}warnlogwarnd{yyyyMMdd}。i。logfileNamePattern!除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,命名日志文件,例如logerror20131221。0。logtimeBasedFileNamingAndTriggeringPolicyclassch。qos。logback。core。rolling。SizeAndTimeBasedFNATPmaxFileSize2MBmaxFileSizetimeBasedFileNamingAndTriggeringPolicyrollingPolicy!追加方式记录日志trueappend!日志文件的格式encoderclassch。qos。logback。classic。encoder。PatternLayoutEncoderpatternd{yyyyMMddHH:mm:ss。SSS}5levelloggerLine:3Lmsgnpatterncharsetutf8charsetencoder!此日志文件只记录info级别的filterclassch。qos。logback。classic。filter。LevelFilterlevelwarnlevelonMatchACCEPTonMatchonMismatchDENYonMismatchfilterappender!日志记录器,日期滚动记录!正在记录的日志文件的路径及文件名file{LOGPATH}{APPDIR}loginfo。logfile!日志记录器的滚动策略,按日期,按大小记录rollingPolicyclassch。qos。logback。core。rolling。TimeBasedRollingPolicy!归档的日志文件的路径,例如今天是20131221日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。而20131221的日志文件在由fileNamePattern指定。d{yyyyMMdd}指定日期格式,i指定索引fileNamePattern{LOGPATH}{APPDIR}infologinfod{yyyyMMdd}。i。logfileNamePattern!除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,命名日志文件,例如logerror20131221。0。logtimeBasedFileNamingAndTriggeringPolicyclassch。qos。logback。core。rolling。SizeAndTimeBasedFNATPmaxFileSize2MBmaxFileSizetimeBasedFileNamingAndTriggeringPolicyrollingPolicy!追加方式记录日志trueappend!日志文件的格式encoderclassch。qos。logback。classic。encoder。PatternLayoutEncoderpatternd{yyyyMMddHH:mm:ss。SSS}5levelloggerLine:3Lmsgnpatterncharsetutf8charsetencoder!此日志文件只记录info级别的filterclassch。qos。logback。classic。filter。LevelFilterlevelinfolevelonMatchACCEPTonMatchonMismatchDENYonMismatchfilterappender!当队列的剩余容量小于这个阈值并且当前日志level为TRACE,DEBUGorINFO,则丢弃这些日志。discardingThreshold0discardingThreshold!更改默认的队列的深度,该值会影响性能。默认值为256queueSize1024queueSize!新增这行为了打印栈堆信息includeCallerDatatrueincludeCallerData!添加附加的appender,最多只能添加一个appender!当队列的剩余容量小于这个阈值并且当前日志level为TRACE,DEBUGorINFO,则丢弃这些日志。discardingThreshold0discardingThreshold!更改默认的队列的深度,该值会影响性能。默认值为256queueSize1024queueSize!新增这行为了打印栈堆信息includeCallerDatatrueincludeCallerData!添加附加的appender,最多只能添加一个appender!当队列的剩余容量小于这个阈值并且当前日志level为TRACE,DEBUGorINFO,则丢弃这些日志。discardingThreshold0discardingThreshold!更改默认的队列的深度,该值会影响性能。默认值为256queueSize1024queueSize!新增这行为了打印栈堆信息includeCallerDatatrueincludeCallerData!添加附加的appender,最多只能添加一个appenderconversionRuleconversionWordclrconverterClassorg。springframework。boot。logging。logback。ColorConverterconversionRuleconversionWordwexconverterClassorg。springframework。boot。logging。logback。WhitespaceThrowableProxyConverterconversionRuleconversionWordwExconverterClassorg。springframework。boot。logging。logback。ExtendedWhitespaceThrowableProxyConverter!encoder默认配置为PatternLayoutEncoderencoderpattern{CONSOLELOGPATTERN:clr(d{yyyyMMddHH:mm:ss。SSS}){faint}clr({LOGLEVELPATTERN:5p})clr({PID:}){magenta}clr(){faint}clr(〔15。15t〕){faint}clr(40。40logger{39}){cyan}clr(:){faint}mn{LOGEXCEPTIONCONVERSIONWORD:wEx}}patterncharsetutf8charsetencoder!此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息filterclassch。qos。logback。classic。filter。ThresholdFilterleveldebuglevelfilterappenderloggernameorg。springframeworklevelINFO!loggernamejava。sqllevelDEBUGloggernameorg。apache。ibatislevelDEBUGloggernamecom。sxd。swapping。dao。mybatislevelDEBUGloggernameorg。apache。ibatislevelDEBUGloggernamecom。iscas。bizlevelDEBUGloggernamesun。rmi。transport。tcplevelINFOloggernameorg。apache。httplevelINFOloggernamecom。sun。mail。smtplevelINFOloggernamejavax。managementlevelINFOloggernamesun。rmilevelINFOloggernamede。codecentriclevelINFOloggernamedruid。sql。ConnectionlevelINFOloggernamedruid。sql。StatementlevelINFOloggernamedruid。sql。ResultSetlevelINFOloggernameorg。hibernate。validatorlevelINFOloggernameorg。mybatis。spring。mapperlevelINFOloggernameorg。xnio。niolevelINFOloggernamespringfox。documentationlevelINFOloggernamespringfox。beanlevelINFOloggernamecom。baomidou。mybatisplus。corelevelINFOloggernameio。undertowlevelINFOloggernameio。micrometer。corelevelINFOloggernamecom。baomidou。mybatisplus。extension。springlevelINFOloggernameValidatorlevelINFOloggernameio。lettucelevelINFOloggernameio。nettylevelINFOloggernameorg。springframework。boot。actuate。redis。RedisReactiveHealthIndicatorlevelERRORloggernameorg。neo4j。driverlevelINFOloggernameorg。apache。zookeeperlevelINFOloggernameorg。apache。curator。framework。recipes。cachelevelINFOloggernameoshi。util。platform。windowslevelINFOloggernameorg。quartz。corelevelINFOloggernameorg。quartz。simpllevelINFOloggernamenet。javacrumbs。shedlock。core。DefaultLockingTaskExecutorlevelINFOloggernamecom。atomikos。jdbc。AbstractDataSourceBeanlevelWARNloggernamecom。atomikos。jdbc。AtomikosConnectionProxylevelERRORloggernameorg。springframework。boot。actuate。maillevelERRORloggernamerootlevelDEBUG!生产环境下,将此级别配置为适合的级别,以免日志文件太多或影响程序性能rootlevelDEBUG!生产环境将请stdout去掉!rootconfiguration
以上的每项配置都有注释,可以通过注释了解配置的意义。
其中ASYNCFILEERROR、ASYNCFILEWARN、ASYNCFILEINFO三个appender是重点,每个appender中需要配置true,使之打印堆栈信息,不然3L不会打印行号。