springboot 日志配置

logback.xml与logback-spring.xml

配置文件的加载顺序

 logback.xml—>application.properties—>logback-spring.xml

如果同时存在logback.xml和logback-spring.xml,或者同时存在logback.xml和自定义的配置文件,则会先加载logback.xml,再根据application配置加载指定配置文件,或加载logback-spring,xml。

# application.properties加载指定配置文件
logging.config=classpath:logback-spring.xml

如果使用的是 logback.xml,里面引用了application.yml的变量,那么会获取不到,需要改为logback-spring.xml。

logback.xml一般用于非Spring Boot项目,logback-spring.xml用于Spring Boot项目

 存放的位置

logback-spring.xml存放的位置是在SpringApplication主类所在的项目的resources目录,也就是application.yml或者application.properties所在的目录。
logback.xml存放的位置是在你启动的那个类所在的项目的resources目录。

本文使用的是logback-spring.xml。

application.yml

日志级别 logging.level

日志级别 trace<debug<info<warn<error<fatal

默认级别为info,即默认打印info及其以上级别的日志。

logging.level设置日志级别,后面跟生效的区域,比如root表示整个项目,也可以设置为某个包下,也可以具体到某个类名(日志级别的值不区分大小写)

参考:https://www.cnblogs.com/yanguobin/p/11487667.html

logging.path 或者 logging.file

注意:它们不会同时生效,只配置其中一个就好了。若同时指定logging.path和logging.file,则logging.path不会生效,只会按照logging.file生成

例如:

logging.path = ./logs

 logging.file,只指定文件名,会生成在当前总项目目录下;同时指定目录和文件名,会在指定目录下生成指定文件名的日志文件(相对路径,则会生成在当前总项目目录下)。

注意:但当只指定已存在的目录时,是不起作用的,是无效的,若后面跟上不存在的目录或文件,则会生成日志文件。

#/logDemo,目录已存在的时,无法生成日志文件
logging.file=/logDemo

参考:https://www.cnblogs.com/yanguobin/p/11486584.html

logback-spring.xml引用application.yml变量

${LOG_PATH:-.}对应logging.path日志文件路径

<property name="LOG_PATH" value="${LOG_PATH:-.}"></property>

<fileNamePattern>${LOG_PATH}/info.%d.%i.log</fileNamePattern>

参考:解决springboot使用logback日志出现LOG_PATH_IS_UNDEFINED文件夹的问题_log_path:-_chlearning125的博客-CSDN博客

完整示例

<?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>
    <!--输出到控制台-->
    <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>
                %d{yyyy-MM-dd HH:mm:ss.SSS} %5p %c{1}:%L - %m%n
            </pattern>
        </layout>
    </appender>

    <!--输出到文件-->
    <!-- 时间滚动输出 level为 INFO 日志 -->
    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 此日志文件只记录info级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
        <encoder>
            <pattern>
                %d{yyyy-MM-dd HH:mm:ss.SSS} %5p %c{1}:%L - %m%n
            </pattern>
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>/var/log/main-module/info.%d.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>

    <!-- 时间滚动输出 level为 ERROR 日志 -->
    <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>
                %d{yyyy-MM-dd HH:mm:ss.SSS} %5p %c{1}:%L - %m%n
            </pattern>
        </encoder>
        <!--滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>/var/log/main-module/error.%d.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>

    <root level="info">
        <appender-ref ref="consoleLog"/>
        <appender-ref ref="fileInfoLog"/>
        <appender-ref ref="fileErrorLog"/>
    </root>

</configuration>

 配置项

一个父标签:configuration
两种属性:contextName和property
三个节点:appender、root、logger

configuration

scan
当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true
scanPeriod
设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug
当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 

contextName

每个logger都关联到logger上下文,默认上下文名称为“default”。但可以使用设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。
如果同时存在logback.xml和logback-spring.xml。如果这两个配置文件的contextName不同,就会报错。 

property

用来定义变量值的标签, 有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。
例如使用定义日志目录,然后在设置日志文件时使用。

append节点

appender的意思是追加器,在这里可以理解为一个日志的渲染器(或者说格式化日志输出)。比如渲染console日志为某种格式,渲染文件日志为另一种格式。

appender中有name和class两个属性:name表示该渲染器的名字;class表示使用的输出策略。

常见的有控制台输出策略(class="ch.qos.logback.core.ConsoleAppender")和文件输出策略(class="ch.qos.logback.core.rolling.RollingFileAppender")。 

控制台输出

<property name="CONSOLE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n"/>
<property name="pattern-color" value="%green(%d{yyyy-MM-dd HH:mm:ss.SSS}) [%thread] %highlight(%-5level) %red(%logger{50}) - %yellow(%msg) %n"/>

<!--输出到控制台-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
  <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
  <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    <level>debug</level>
  </filter>
  <encoder>
    <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
    <!-- 设置日志的颜色和高亮 -->
    <!-- <pattern>${pattern-color}</pattern> -->
    <!-- 设置字符集 -->
    <charset>UTF-8</charset>
  </encoder>
</appender>

文件输入

 rollingPolicy表示日志记录器的滚动策略

SizeBasedTriggeringPolicy:基于文件大小进行滚动;

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
	<file>test.log</file> 
    <!--表示按照固定窗口模式生成日志文件,当文件大于5MB时,生成新的日志文件。窗口大小是1到3,当保存了3个归档文件后,将覆盖最早的日志。-->
	<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> 
		<fileNamePattern>tests.%i.log.zip</fileNamePattern> 
		<minIndex>1</minIndex> 
		<maxIndex>3</maxIndex> 
	</rollingPolicy> 
    <!--当文件大小超过5MB时,通知RollingPolicy轮转-->
	<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
		<maxFileSize>5MB</maxFileSize> 
	</triggeringPolicy> 
	<encoder> 
		<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> 
	</encoder> 
</appender> 

TimeBasedRollingPolicy:根据时间定义翻转策略,例如按天或按月。TimeBasedTriggeringPolicy实现了RollingPolicy和TriggeringPolicy接口,既负责滚动也负责触发滚动。

<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
	<!-- 正在记录的日志文件的路径及文件名:保存当天的日志记录 -->
	<file>${log.path}/log_debug.log</file>
	<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
		<fileNamePattern>${APPDIR}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
		<maxHistory>30</maxHistory>
		<!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,命名日志文件-->
		<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
			<maxFileSize>10MB</maxFileSize>
		</timeBasedFileNamingAndTriggeringPolicy>
	 </rollingPolicy>
	 <!--此日志文件只记录debug级别的 -->
	<filter class="ch.qos.logback.classic.filter.LevelFilter">
		<level>debug</level>
		<onMatch>ACCEPT</onMatch>
		<onMismatch>DENY</onMismatch>
	</filter>
</appender> 

SizeAndTimeBasedRollingPolicy:TimeBasedRollingPolicy的一个子类,实现了基于时间和日志文件大小的翻滚策略。按日期归档文件,但同时限制每个日志文件的大小。最常用的滚动策略。

<!--输出到文件-->
<!-- 时间滚动输出 level为 DEBUG 日志 -->
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
	<!-- 正在记录的日志文件的路径及文件名:保存当天的日志记录 -->
	<file>${log.path}/log_debug.log</file>
	<!--日志文件输出格式 -->
	<encoder>
		<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
		<charset>UTF-8</charset> <!-- 设置字符集 -->
	</encoder>
	<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
	<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
		<!--将当天的日志记录在<file>,然后将昨天的日志归档到下面的文件中-->
		<!--按天切分  %d{yyyy-MM-dd} %i指定索引-->
		<fileNamePattern>${log.path}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
		<!--单个日志文件最大100M,超过后再创建一个日志文件,日志文件的名字最后+1-->
		<maxFileSize>100MB</maxFileSize>
		<!--日志文件保留天数-->
		<maxHistory>30</maxHistory>
		<!--所有的日志文件最大20G,超过就会删除旧的日志-->
		<totalSizeCap>20GB</totalSizeCap>
	</rollingPolicy>
	<!--此日志文件只记录debug级别的 -->
	<filter class="ch.qos.logback.classic.filter.LevelFilter">
		<level>debug</level>
		<onMatch>ACCEPT</onMatch>
		<onMismatch>DENY</onMismatch>
	</filter>
</appender>

encoder表示日志文件的格式

%d表示时间
%thread表示线程名
%-5level 表示日志级别,允许以五个字符长度输出
%logger{50}表示具体的日志输出者,比如类名,括号内表示长度
%msg表示具体的日志消息,就是logger.info("xxx")中的xxx
%n表示换行

onMatch和onMismatch都有三个属性值,分别为Accept、DENY、NEUTRAL

onMatch="ACCEPT"    匹配该级别及以上
onMatch="DENY"        不匹配该级别及以上
onMatch="NEUTRAL" 该级别及以上的由下一个filter处理

                                    如果当前是最后一个,则是匹配该级别及以上

onMismatch="ACCEPT"   匹配该级别以下

onMismatch="DENY"       不匹配该级别以下
onMismatch="NEUTRAL" 该级别及以下的由下一个filter处理

                                         如果当前是最后一个,则不匹配该级别以下的

当需要将info以上级别的都输出到info日志中,可以使用ch.qos.logback.classic.filter.ThresholdFilter这个过滤器。

<!--临界值日志过滤级别配置 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
	<!-- 在日志配置级别的基础上过滤掉info级别以下的日志 -->
	<level>INFO</level>
</filter>

 <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。

<!-- 追加方式记录日志 -->
<append>true</append>

root

root节点实际上是配置启用哪种appender,可以添加多个appender。
root配置必须在appender下边。
root节点的level是总的日志级别控制:
如果appender的日志级别设定比root的高,会按照appender的日志级别打印日志,
如果appender的日志级别比root的低,会按照root设定的日志级别进行打印日志
也就是说root设定的日志级别是最低限制,如果root设定级别为最高ERROR,那么所有appender只能打印最高级别的日志。

logger

对单个包或类添加配置:name:用来指定受此loger约束的某一个包或者具体的某一个类。
addtivity:是否向上级loger传递打印信息。默认是true。

<logger name="com.pikaqiu.logbackdemo" level="debug" additivity="false">
  <appender-ref ref="CONSOLE" />
</logger>
<logger name="com.pikaiqu.logbackdemo.LogbackdemoApplicationTests" level="INFO">
  <appender-ref ref="STDOUT"/>
</logger>

root和logger是父子的关系。
logger的appender根据参数additivity决定是否要叠加root的appender,logger的级别是其自身定义的级别,和root的级别没什么关系。
logger对单个包或类添加配置,相当于局部配置,root相当于全局配置
如果logger里面配置了additivity=“false”,就会覆盖root的,只打印一遍;但是additivity=“true”,就会向上层再次传递,不会覆盖,而是打印两遍! 

环境配置

配置多环境日志输出  可以在application.properties中配置选择哪个profiles : spring.profiles.active=dev

<?xml version="1.0" encoding="UTF-8"?>
<configuration  scan="true" scanPeriod="10 seconds">
    <!--生产环境:输出到文件-->
    <springProfile name="pro">
        <root level="info">
            <appender-ref ref="DEBUG_FILE" />
            <appender-ref ref="INFO_FILE" />
            <appender-ref ref="ERROR_FILE" />
            <appender-ref ref="WARN_FILE" />
        </root>
    </springProfile>
    <!--开发环境:打印控制台-->
    <springProfile name="dev">
        <root level="debug">
            <appender-ref ref="CONSOLE" />
        </root>
    </springProfile>
</configuration>

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值