26. Logging

26. Logging

使用spring-boot-starter或者spring-boot-starter-logging引入日志。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>

Spring BootJULLOG4J2Logback提供了默认配置

默认情况下,当你引入spring-boot-starter,默认会使用SLF4JLogback

如果你需要使用别的日志实现日志门面,排除相应包,引入相关包

依赖关系
1️⃣ 默认使用SLF4JLogback

2️⃣ 在spring-core中,使用的是spring-jcl进行日志输出。spring-jcl可以理解成是SLF4JLogbackJULJCL等日志框架和日志门面的终极门面

26.1 日志格式

默认格式

默认日志格式如下

2014-03-05 10:57:51.112  INFO 45469 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/7.0.52
2014-03-05 10:57:51.253  INFO 45469 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext

1️⃣ 日期和时间 - %d{yyyy-MM-dd:hh:mm:ss.SSS}

2️⃣ 日志级别 - ​%5p

3️⃣ Process ID - PID

4️⃣ 线程名称 - %15.15t

5️⃣ 类和方法名称 - %-40.40logger

6️⃣ 消息 - %msg%n

完整如下

%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID} --- [%15.15t] %40.440logger : %msg%n

支持颜色

可以使用clr(p1){p2}格式输出带颜色的日志

clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){yellow}

支持的颜色如下

  • blue
  • cyan
  • faint
  • green
  • magenta
  • red
  • yellow

你可以使用spring.output.asni.enabled=always/detect/never

  • Never - 表示不使用颜色
  • delect - 如果终端支持颜色,那么就开启颜色。不支持,就不开启。
  • always - 永远开启(不要使用,当终端不支持颜色,会导致乱码)
# 终端是否启用颜色 - 
spring.output.asni.enabled=delect

设置格式

使用logging.pattern.consolelogging.pattern.file来设置日志格式

# 控制台pattern
logging.pattern.console=%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){yellow} %clr(%5p){} %clr(${PID}){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger){cyan} %clr(:){faint} %msg%n
# 文件pattern
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID} --- [%15.15t] %40.440logger : %msg%n

26.3 文件输出

默认不输出文件。

如果需要使用文件,使用logging.file.pathlogging.file.name

# 26.3 文件
logging.file.path=F:/logs/
logging.file.name=F:/logs/sell.log

如果想输出到相对工程路径,使用相对目录

logging.file.path=./logs/

默认情况,如果你的实现是logback,还支持

  • 按照大小滚动
  • 按照时间清除备份
  • 按照大小清除备份
# 日志滚动策略
logging.file.max-size=2KB
# 日志滚动名称
logging.pattern.rolling-file-name=F:/logs/sell.%d{yyyy-MM-dd}.%i.log
# 开启之后,根据max-history和totcal-size-cap进行清除 - 仅仅logback生效
logging.file.clean-history-on-start=true
# 日志备份- 最多保存7填报
logging.file.max-history=7
# 日志备份 - 超过2KB,会被删除
loging.file.total-size-cap=2KB

26.4 日志级别

默认情况下,仅仅输出info级别往上。

设置root级别

使用debug=true或者logging.level.root=debug可以设置debug级别。区别是

  • debug=true - 仅仅针对一些模块设置debug
  • logging.level.root=debug - 所有模块设置debug
#  26.4 日志级别 - level
debug=true
logging.level.root = debug

对特定包设置level

使用logging.level.包名=级别

logging.level.com.yuki=debug

日志组

如果不同的包的日志级别相同,可以把他们放在一组,也叫日志组。

比如,我controller包设置debugdao包、service包设置info

使用logging.group.xx=xx,xx设置日志组

# 设置组
logging.group.yweb=com.yuki.log.web
logging.group.ydao=com.yuki.log.service, com.yuki.log.dao
# 设置级别
logging.level.yweb=info
logging.level.ydao=debugxxxxxxxxxx logging.group.yweb=com.yuki.log.weblogging.group.ydao=com.yuki.log.service, com.yuki.log.daologging.level.yweb=infologging.level.ydao=debugloggingproperties

26.6 使用自己的日志配置

springboot加载日志配置的流程是

  • 查看classpath中是否有相关日志配置
  • 都没有,使用defaults.xml属性配置

也就是说,如果你想自定义更多配置,比如

  • 按照时间滚动文件
  • 针对不同级别,输出到不同文件名称中。比如,debug输出到debug.log
Logging SystemCustomization
Logbacklogback-spring.xmllogback.xml
Log4j2log4j2-spring.xmllog4j2.xml
JDK(Java Util 日志记录)logging.properties

logback-spring.xmllogback.xml区别是。

  • logback-spring中提供了spring-profilespring-properties标签,可以给不同环境提供不同配置
  • logback-spring可以访问application.properties中内容。

如果可能,我们建议您将-spring变体用于日志记录配置(例如logback-spring.xml而不是logback.xml)。如果使用标准配置位置,Spring 将无法完全控制日志初始化。

使用特定日志

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <!-- 排除logback + slf4j -->
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<!-- 使用 log4j + slf4j2 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

26.7 logback-spring.xml

如果你使用logback-spring.xml,可以使用springProfilelogbackproperties。可以实现

  • 不同环境,配置不同日志路径
<!-- properties - 通用属性 -->
<!-- 样式 -->
<property name="log.pattern" value="%yellow(%d{yyyy-MM-dd HH:mm:ss.SSS}) %5level %magenta(${PID}) --- %magenta([%15.15t]) %cyan(%-40.40logger{39}) :  %msg%n" />
<property name="log.maxHistory" value="30" />
<property name="log.level" value="info" />
<!-- 🌻spring-profile - 设置文件路径🌻 -->
<springProfile name="dev">
    <!-- 🌻设置属性 🌻-->
	<springProperty name="log.path" source="log.path" defaultValue="F:/logs/dev/" />
</springProfile>
<springProfile name="prod">
     <!-- 🌻设置属性 🌻-->
	<springProperty name="log.path" source="log.path" defaultValue="F:/logs/prod/" />
</springProfile>

26.8 汇总

logback配置文件

<?xml version="1.0" encoding="utf-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!-- properties - 通用属性 -->
    <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5level ${PID} --- [%15.15t] %-40.40logger{39} :  %msg%n" />
    <property name="log.path" value="F:/logs/" />
    <property name="log.maxHistory" value="30" />
    <property name="log.level" value="debug" />

    <!-- appender - 输出 -->
    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${log.pattern}</pattern>
            <charset>utf-8</charset>
        </encoder>
    </appender>

    <appender name="debugAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${log.pattern}</pattern>
        </encoder>
        <file>${log.path}/debug.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/debug/debug-%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>${log.maxHistory}</maxHistory>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <appender name="infoAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${log.pattern}</pattern>
        </encoder>
        <file>${log.path}/info.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/info/info-%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>${log.maxHistory}</maxHistory>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${log.pattern}</pattern>
        </encoder>
        <file>${log.path}/error.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/error/error-%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>${log.maxHistory}</maxHistory>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- logger - 日志记录器 -->
    <logger name="root" level="info">
        <appender-ref ref="consoleAppender" />
    </logger>
    <logger name="com.yuki" level="${log.level}" additivity="true">
        <appender-ref ref="debugAppender" />
        <appender-ref ref="infoAppender" />
        <appender-ref ref="errorAppender" />
    </logger>
</configuration>

application.proerties中的常用log属性

# 26.1 日志格式 - pattern
# 日志颜色
spring.output.ansi.enabled=detect
# 日志格式 - 有颜色
logging.pattern.console=%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){yellow} %clr(%5p){} %clr(${PID}){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger){cyan} %clr(:){faint} %msg%n
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID} --- [%15.15t] %40.440logger : %msg%n


# 26.3 文件 - file
logging.file.path=F:/logs/
logging.file.name=F:/logs/sell.log
# 日志滚动
logging.file.max-size=2KB
# 文件名称 - 仅当日志实现是logack时候,才生效(支持)
logging.pattern.rolling-file-name=F:/logs/sell.%d{yyyy-MM-dd}.%i.log
# 开启之后,根据max-history和totcal-size-cap进行清除 - 仅仅logback生效
logging.file.clean-history-on-start=true
# 最多保存7天
logging.file.max-history=7
# 日志备份超过2KB,会被删除
logging.file.total-size-cap=2KB


#  26.4 日志级别 - level
# root设置级别
debug=true
logging.level.root = debug
# 自己的包设置级别
logging.level.com.yuki=debug
# 日志组
logging.group.yweb=com.yuki.log.web
logging.group.ydao=com.yuki.log.service, com.yuki.log.dao
logging.level.yweb=info
logging.level.ydao=debug
属性变量作用
logging.pattern.consoleCONSOLE_LOG_PATTERN🍎控制台pattern
logging.pattern.fileFILE_LOG_PATTERN🍎文件pattern
spring.output.ansi.enabled🍎是否启用颜色
logging.file.path🍐日志目录
logging.file.nameLOG_FILE🍐日志文件
logging.file.max-sizeLOG_FILE_MAX_SIZE🍐最大滚动大小
logging.pattern.rolling-file-name🍐滚动名称
logging.file.max-historyLOG_FILE_MAX_HISTORY🍐保存时间
logging.file.total-size-cap🍐超过,备份会被清除
logging.file.clean-history-on-start🍐启动时候,清除
debug🍇日志级别
logging.level.xxx🍇保日志级别
logging.group.xxx🍇日志组
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python的logging模块允许你在你的应用程序中记录消息,以便在开发、测试和生产环境中进行故障排除。 下面是一个简单的入门教程来介绍如何在Python中使用logging模块。 ## 基本用法 首先,导入logging模块。 ```python import logging ``` 然后,你可以使用logging.basicConfig()函数来配置默认的日志记录器,例如: ```python logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') ``` 这将设置默认的日志记录级别为DEBUG,并将日志消息格式设置为时间戳、日志级别和消息文本。 现在,你可以使用logging模块中的函数来记录日志消息。例如: ```python logging.debug('This is a debug message') logging.info('This is an info message') logging.warning('This is a warning message') logging.error('This is an error message') logging.critical('This is a critical message') ``` 当你运行此代码时,你将看到输出类似于以下内容的日志消息: ``` 2019-02-26 13:23:45,678 - DEBUG - This is a debug message 2019-02-26 13:23:45,678 - INFO - This is an info message 2019-02-26 13:23:45,678 - WARNING - This is a warning message 2019-02-26 13:23:45,678 - ERROR - This is an error message 2019-02-26 13:23:45,678 - CRITICAL - This is a critical message ``` 默认情况下,日志消息将发送到控制台。你也可以将其写入文件,例如: ```python logging.basicConfig(filename='example.log', level=logging.DEBUG) ``` 现在,所有日志消息都将写入example.log文件。 ## 高级用法 logging模块还提供了其他一些功能,例如: ### 调试器 logging模块还提供了一个方便的调试器,可以帮助你识别和调试代码中的错误。例如: ```python import logging logging.basicConfig(level=logging.DEBUG) def foo(x): logging.debug('x = %s' % x) return x * 2 def bar(y): z = y + 3 return foo(z) def main(): result = bar(5) logging.debug('result = %s' % result) if __name__ == '__main__': main() ``` 当你运行此代码时,你将看到输出类似于以下内容的日志消息: ``` DEBUG:root:x = 8 DEBUG:root:result = 16 ``` 这表明foo()函数接收到参数x=8,并返回结果x*2=16,而bar()函数接收到参数y=5,计算z=y+3=8,并将其传递给foo()函数。 ### 记录器 logging模块还提供了Logger类,可以让你创建自定义的日志记录器。例如: ```python import logging # create logger logger = logging.getLogger('my_logger') logger.setLevel(logging.DEBUG) # create console handler and set level to debug ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) # create formatter formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # add formatter to ch ch.setFormatter(formatter) # add ch to logger logger.addHandler(ch) # 'application' code logger.debug('debug message') logger.info('info message') logger.warning('warn message') logger.error('error message') logger.critical('critical message') ``` 这个例子创建了一个名为“my_logger”的自定义日志记录器,并将其配置为记录DEBUG级别的消息。它还创建了一个控制台处理程序,并将其添加到日志记录器中。最后,它使用Logger类中的函数来记录日志消息。 ### 过滤器 logging模块还提供了Filter类,可以让你过滤特定类型的日志消息。例如: ```python import logging class MyFilter(logging.Filter): def filter(self, record): return record.levelno == logging.WARNING # create logger logger = logging.getLogger('my_logger') logger.setLevel(logging.DEBUG) # create console handler and set level to debug ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) # create formatter formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # add formatter to ch ch.setFormatter(formatter) # add ch to logger logger.addHandler(ch) # add filter to handler ch.addFilter(MyFilter()) # 'application' code logger.debug('debug message') logger.info('info message') logger.warning('warn message') logger.error('error message') logger.critical('critical message') ``` 这个例子创建了一个名为“my_logger”的自定义日志记录器,并将其配置为记录DEBUG级别的消息。它还创建了一个控制台处理程序,并将其添加到日志记录器中。但是,它还使用自定义的MyFilter类来过滤只记录WARNING级别的消息。 当你运行此代码时,你将看到输出类似于以下内容的日志消息: ``` 2019-02-26 13:23:45,678 - my_logger - WARNING - warn message 2019-02-26 13:23:45,678 - my_logger - ERROR - error message 2019-02-26 13:23:45,678 - my_logger - CRITICAL - critical message ``` 这表明只有WARNING、ERROR和CRITICAL级别的消息被记录下来了,而DEBUG和INFO级别的消息被过滤掉了。 ## 总结 这是一个简单的Python.logging教程,介绍了如何在Python中使用logging模块来记录日志消息。logging模块提供了许多功能,例如自定义日志记录器、过滤器和调试器,可以帮助你更好地理解和调试你的代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值