Springboot集成使用logback日志框架
起步
Springboot框架已经整合了logback依赖,因此不再需要加入依赖。
关于日志系统的配置文件,官方推荐我们使用logback-spring.xml 而不是 logback.xml
因此我们在resources(classpath路径)下创建一个名为logback-spring.xml的配置文件
配置信息
创建好上面提到的.xml文件以后,在文件中填写以下内容
<?xml version="1.0" encoding="UTF-8"?> <!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 --> <!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true --> <!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 --> <!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 --> <configuration scan="true" scanPeriod="10 seconds"> <!--<include resource="org/springframework/boot/logging/logback/base.xml" /> --> <contextName>Logback</contextName> <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 --> <!-- 定义日志文件 存放位置 项目下logs文件夹--> <property name="logDir" value="logs/" /> <!-- 日志最大的历史 30天 --> <property name="maxHistory" value="30" /> <!-- 控制台输出日志 --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger-%msg%n</pattern> <charset class="java.nio.charset.Charset">UTF-8</charset> </encoder> </appender> <!-- ERROR级别日志 --> <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 过滤出 error 使用 try {}catch (Exception e){} 的话异常无法写入日志,可以在catch里用logger.error()方法手动写入日志 logger.error("程序异常, 详细信息:{}", e.getLocalizedMessage() , e); --> <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>${logDir}\%d{yyyyMMdd}\error.log</fileNamePattern> <maxHistory>${maxHistory}</maxHistory> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern> <charset class="java.nio.charset.Charset">UTF-8</charset> </encoder> <append>false</append> <prudent>false</prudent> </appender> <!-- WARN级别日志 --> <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender"> <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>${logDir}\%d{yyyyMMdd}\warn.log</fileNamePattern> <maxHistory>${maxHistory}</maxHistory> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger-%msg%n</pattern> <charset class="java.nio.charset.Charset">UTF-8</charset> </encoder> <append>false</append> <prudent>false</prudent> </appender> <!-- INFO级别日志 --> <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${logDir}\%d{yyyyMMdd}\info.log</fileNamePattern> <maxHistory>${maxHistory}</maxHistory> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger-%msg%n</pattern> <charset class="java.nio.charset.Charset">UTF-8</charset> </encoder> <append>false</append> <prudent>false</prudent> </appender> <!-- DEBUG级别日志 --> <appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>DEBUG</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${logDir}\%d{yyyyMMdd}\debug.log</fileNamePattern> <maxHistory>${maxHistory}</maxHistory> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger-%msg%n</pattern> <charset class="java.nio.charset.Charset">UTF-8</charset> </encoder> <append>false</append> <prudent>false</prudent> </appender> <!--文件日志, 按照每天生成日志文件 --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件输出的文件名--> <FileNamePattern>${logDir}/%d{yyyyMMdd}/cwbb.%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> <!-- 异步输出 --> <appender name="dayLogAsyncAppender" class="ch.qos.logback.classic.AsyncAppender"> <includeCallerData>true</includeCallerData> <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 --> <discardingThreshold>0</discardingThreshold> <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 --> <queueSize>512</queueSize> <appender-ref ref="FILE"/> </appender> <!--专为 spring 定制 --> <logger name="org.springframework" level="info"/> <!-- show parameters for hibernate sql 专为 Hibernate 定制 --> <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" /> <logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" /> <logger name="org.hibernate.SQL" level="DEBUG" /> <logger name="org.hibernate.engine.QueryParameters" level="DEBUG" /> <logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" /> <!-- 统一配置日志输出,root标签和logger标签,如果这开启了就把不同环境的关上 --> <!-- root标签:相当于开关,只有把定义的appender添加到这里 才会生效有日志 --> <!-- <root level="INFO"> <appender-ref ref="CONSOLE" /> <appender-ref ref="ASYNC_FILE" /> <appender-ref ref="ASYNC_ERROR_FILE" /> </root> --> <!-- logger标签:用来设置某一个包或者具体的某一个类的日志打印级别 --> <!-- <logger name="com.test.springboot.admin" level="DEBUG" /> --> <!--myibatis log configure--> <!-- <logger name="com.apache.ibatis" level="TRACE"/> <logger name="java.sql.Connection" level="DEBUG"/> <logger name="java.sql.Statement" level="DEBUG"/> <logger name="java.sql.PreparedStatement" level="DEBUG"/> --> <!-- root级别 DEBUG --> <!-- <logger name="com.test.newdemo" level="DEBUG"> <appender-ref ref="FILE"/> <appender-ref ref="CONSOLE"/> </logger> --> <!--输出等级和需要输出在哪些地方(ref的内容是上方配置的节点的name)--> <logger name="cn.na.cwbb" level="DEBUG"> <appender-ref ref="FILE"/> <appender-ref ref="CONSOLE"/> </logger> <root level="INFO"> <!-- 控制台输出 --> <appender-ref ref="CONSOLE" /> <!-- 文件输出 --> <appender-ref ref="ERROR" /> <appender-ref ref="INFO" /> <appender-ref ref="WARN" /> <appender-ref ref="DEBUG" /> </root> </configuration>
然后,在application.yml或者application.properties配置文件中指定日志系统使用的配置文件
logging:
# logback.xml配置文件的位置
config: classpath:logback-spring.xml
然后呢,就可以在开发中使用了。
3.使用方法
3.1 需要引入的类
import org.slf4j.Logger; import org.slf4j.LoggerFactory;
3.2 具体的操作方法
//对日志类的引用 private final Logger log = LoggerFactory.getLogger(this.getClass()); //日志的记录 log.info("日志记录");
记录日志的时候我们可能需要在文件中记录下异常的堆栈信息,经过测试,logger.error(e) 不会打印出堆栈信息,正确的写法是:
logger.error("程序异常, 详细信息:{}", e.getLocalizedMessage() , e);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)