Spring与日志
一、日志框架:
JUL、JCL、Jboss-logging、logback、log4j、log4j、log4j2、slf4j
日志抽象层 | 日志实现 |
JCL、SLF4J、jboos-logging | Log4J、JUL、Log4j2、Logback |
springBoot 底层是spring框架 spring框架默认是用jcl,springBoot选用 SLF4j和logback
二、SLF4J使用
在开发的时候,日志记录方法调用的应该是抽象层而不是具体实现层 ,在实际观察到代码实现中开发也是这么做的
每个日志的实现框架 都有自己的配置文件 使用slf4j以后 配置文件还是做成日志实现框架的配置文件
三、遗留问题
例如a系统使用 slf4j+logback,spring(commons-logging)、Hibernate(jboss-logging) 、MyBatis、xxx
统一日志记录,即使是别的框架统一使用 slf4j 进行输出
jcl-over-slf4j 又做了一层适配
如何让系统中所有的日志 都统一到slf4j
1、将系统中其他日志框架先排除出去
2、用中间包来替换原有的日志框架
3、我们导入slf4j其他的实现
创建springboot项目 根据maven的依赖关系,springboot已经自动引入了中间的适配层
四、如果我们要引入其他框架
一定要把这个框架的默认日志依赖移除掉
五、配置
1、properties文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | server.port= 17777 logging.level.com.example = trace # 指定日志文件输入 路径 如果不指定路径则在当前项目下生成 springboot.log日志 #logging.file.path=/logs #logging.file.name=springBootLog ## 在控制台输出的日志格式 #logging.pattern.console=%d{yyyy-MM-dd} [%thread%] %-5level %logger{ 50 } - %msg%m # ## 指定文件汇总日志输入的格式 #logging.pattern.file=%d{yyyy-MM-dd} === [%thread%] === %-5level === %logger{ 50 } === %msg%m |
2、使用 logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="true" scanPeriod="1 seconds">
<contextName>logback</contextName>
<property name="log.path" value="/Users/yuanxu/IdeaProjects/slf4j-demo/logs/sit.log" />
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!-- <filter class="com.example.logback.filter.MyFilter" /> -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<!-- <level>ERROR</level> 可以省略不写 -->
<!-- <level>ERROR</level>-->
</filter>
<encoder>
<!--
日志输出格式
%d 表示日期时间
%thread 表示线程名
%-5level 级别从左显示5个字符宽度
%logger{50} 标识logger名字最长50个长度 否则按照句点分割
%msg 日志消息
%n 换行符
-->
<pattern>%d{yyyy-MM-dd} %contextName [%thread] %-5level %logger{36} ---> [%file : %line]- %msg%n
</pattern>
</encoder>
</appender>
<appender name="file"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}</file>
<!-- rollingPolicy 指定文件是滚动的-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}.%d{yyyy-MM-dd}.zip</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>
%date %level [%thread] %logger{36} [%file : %line]- %msg%n
</pattern>
<!-- <pattern>-->
<!-- ${log.path}.[%file : %line]-->
<!-- </pattern>-->
</encoder>
</appender>
<root level="info">
<appender-ref ref="console" />
<appender-ref ref="file" />
</root>
<logger name="com.example.slf4j-demo" level="warn" />
</configuration>
logback-spring.xml 则变成由spring识别 可以使用spring配置文件(yml)中的profiles
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | <?xml version= "1.0" encoding= "UTF-8" ?> <configuration debug= "false" scan= "true" scanPeriod= "1 seconds" > <contextName>logback</contextName> <property name= "log.path" value= "/Users/yuanxu/IdeaProjects/slf4j-demo/logs/sit.log" /> <appender name= "console" class = "ch.qos.logback.core.ConsoleAppender" > <!-- <filter class = "com.example.logback.filter.MyFilter" /> --> <filter class = "ch.qos.logback.classic.filter.ThresholdFilter" > <!-- <level>ERROR</level> 可以省略不写 --> <!-- <level>ERROR</level>--> </filter> <encoder> <pattern>%d{yyyy-MM-dd} %contextName [%thread] %-5level %logger{ 36 } ---> [%file : %line]- %msg%n </pattern> </encoder> </appender> <appender name= "file" class = "ch.qos.logback.core.rolling.RollingFileAppender" > <file>${log.path}</file> <!-- rollingPolicy 指定文件是滚动的--> <rollingPolicy class = "ch.qos.logback.core.rolling.TimeBasedRollingPolicy" > <fileNamePattern>${log.path}.%d{yyyy-MM-dd}.zip</fileNamePattern> </rollingPolicy> <encoder> <springProfile name= "dev" > <pattern> %date %level [%thread] %logger{ 36 } [%file : %line]- %msg%n </pattern> <!-- <pattern>--> <!-- ${log.path}.[%file : %line]--> <!-- </pattern>--> </springProfile>> <springProfile name= "!dev" > <pattern> %date *** %level *** [%thread] %logger{ 36 } [%file : %line]- %msg%n </pattern> </springProfile>> </encoder> </appender> <root level= "info" > <appender-ref ref= "console" /> <appender-ref ref= "file" /> </root> <logger name= "com.example.slf4j-demo" level= "warn" /> </configuration> |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构