版权声明:转载请注明出处与链接。 https://blog.csdn.net/With_Her/article/details/82184936
据说马上要开项目了,自己闲来无事就基于SpringBoot来搭建一套开发框架,在日志框架上,我本次选用了Slf4j+Logback的日志框架。特此在这里记录一下。
前景提要:
slf4j :定义了一套接口,是一个日志门面,可实现多个日志系统间快速切换(通过修改配置文件)。ps:Slf4j相当于一个接口,它没有具体的日志实现,但可以通过它来调用如log4j、logback等具体的log日志实现
Logback:和log4j是同一作者,是log4j的升级版,是日志框架的具体实现
logback 主要分为三个模块,分别是:
- logback-core:提供基础功能,是其他两个模块的基础
- logback-classic : log4j的升级,实现了self4j api
- logback-access:用于与sevlet容器进行集成、提供网络访问日志的功能
开始正文:
jar:
如果在你maven的pom.xml中,依赖了如下内容:
那么就不用再导入关于slf4j与logback的jar了。我们看看spring-boot-starter-web的依赖树:
logback.xml:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- %m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名,%i索引【从数字0开始递增】,,, --> <!-- appender是configuration的子节点,是负责写日志的组件。 --> <!-- ConsoleAppender:把日志输出到控制台 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d %p (%file:%line\)- %m%n</pattern> <!-- 控制台也要使用UTF-8,不要使用GBK,否则会中文乱码 --> <charset>UTF-8</charset> </encoder> </appender> <!-- RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 --> <!-- 以下的大概意思是:1.先按日期存日志,日期变了,将前一天的日志文件名重命名为XXX%日期%索引,新的日志仍然是sys.log --> <!-- 2.如果日期没有发生变化,但是当前日志的文件大小超过1KB时,对当前日志进行分割 重命名--> <appender name="INFO_LOGs" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>logs/Info/Info.log</File> <!-- 所有error日志都在这里--> <!--LevelFilter: 级别过滤器,根据日志级别进行过滤。只输出某一级别日志 ThresholdFilter: 临界值过滤器,过滤掉低于指定临界值的日志。 EvaluatorFilter: 求值过滤器,评估、鉴别日志是否符合指定条件。需要额外的两个JAR包,commons-compiler.jar和janino.jar--> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level><!--设置过滤级别--> <!--返回DENY,日志将立即被抛弃不再经过其他过滤器--> <!--返回NEUTRAL,有序列表里的下个过滤器过接着处理日志--> <!--返回ACCEPT,日志会被立即处理,不再经过剩余过滤器--> <onMatch>ACCEPT</onMatch><!--用于配置符合过滤条件的操作--> <onMismatch>DENY</onMismatch><!--用于配置不符合过滤条件的操作--> </filter> <!-- rollingPolicy:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。 --> <!-- TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 活动文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 --> <!-- 文件名:log/sys.2017-12-05.0.log --> <fileNamePattern>logs/Info/Info.%d.%i.log</fileNamePattern> <!-- 每产生一个日志文件,该日志文件的保存期限为30天 --> <maxHistory>500</maxHistory> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <!-- maxFileSize:这是活动文件的大小,默认值是10MB,本篇设置为1KB,只是为了演示 --> <maxFileSize>30MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <encoder> <!-- pattern节点,用来设置日志的输入格式 --> <pattern> %d %p (%file:%line\)- %m%n </pattern> <!-- 记录日志的编码 --> <charset>UTF-8</charset> <!-- 此处设置字符集 --> </encoder> </appender> <!--错误日志--> <appender name="ERROR_LOGs" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>logs/Error/Error.log</File> <!-- 所有error日志都在这里--> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>logs/Error/Error.%d.%i.log</fileNamePattern> <maxHistory>500</maxHistory> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <encoder> <pattern>%d %p (%file:%line\)- %m%n</pattern> <charset>UTF-8</charset> </encoder> </appender> <!--警告日志--> <appender name="WARN_LOGs" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>logs/warn/warn.log</File> <!-- 所有warn日志都在这里--> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>WARN</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>logs/warn/warn.%d.%i.log</fileNamePattern> <maxHistory>500</maxHistory> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>30MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <encoder> <pattern>%d %p (%file:%line\)- %m%n</pattern> <charset>UTF-8</charset> </encoder> </appender> <!--主日志--> <appender name="FILE_LOGs" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>logs/File/File.log</File> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>logs/File/File.%d.%i.log</fileNamePattern> <maxHistory>500</maxHistory> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>30MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <encoder> <pattern>%d %p (%file:%line\)- %m%n</pattern> <charset>UTF-8</charset> </encoder> </appender> <!-- 控制台输出日志级别 --> <root level="DEBUG"> <appender-ref ref="STDOUT" /> <!--<appender-ref ref="FILE_LOGs" />--> </root> <!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 --> <!-- com.appley为根包,也就是只要是发生在这个根包下面的所有日志操作行为的权限都是DEBUG --> <!-- additivity:是否向上级传递打印信息,默认true --> <!-- 级别依次为【从高到低】:FATAL > ERROR > WARN > INFO > DEBUG > TRACE --> <logger name="com.lvjia" level="INFO" additivity="false"> <appender-ref ref="INFO_LOGs" /> <appender-ref ref="ERROR_LOGs"/> <appender-ref ref="FILE_LOGs"/> <appender-ref ref="WARN_LOGs"/> </logger> </configuration>
该logback.xml实现的内容是:
- 在控制台打印DEBUG级别及以上的信息
- 对于INFO、ERROR、WARN级别的日志分别保存到专属的文件夹下
- 对于INFO级别及以上的所有日志都保存到File文件内
- 自动将今天之前的log分别保存到不同日期的文件内
注:
- 在SpringBoot下,如果logback配置文件名为:logback.xml,无需在application中初始化(也可以去配置初始化,但个人觉得没意义)
- 如果想扩展logback的配置文档,则配置文档的命名必须为:logback-XXX.xml,且需在application.xml中进行初始化
#在application.properties文件中引入日志配置文件 #===================================== log ============================= logging.config=classpath:logback-boot.xml
总结:
对于log以前很少关注,上次自己配了一下,但当时对于里面的配置与生产log文件等还是有些许疑惑。
现在在新项目上重新搭建slf4j+logback的log框架,之前遗留了疑惑问题,都通通解决。所以实践永远是检验真理的唯一标准啊。
总的来说,配置slf4j+logback的日志框架,就两步,1.引入jar,2.配置logback.xml配置文件
如果想再丰富更多关于log日志框架,可在此基础上继续塞进一些自己的东西
彩笔一枚,如有错误不足,希望及时评论指正!
参考文档:
https://blog.csdn.net/appleyk/article/details/78717388#commentsedit、
https://blog.csdn.net/a314773862/article/details/79808407#t4