浅谈如何配置logback.xml

logback对于很多人来说,并不陌生,它 是Spring Boot 默认使用的日志框架,也是一个高性能日志框架。Logback 提供了更高的性能、更小的内存占用以及更灵活的配置选项。通过配置 logback.xml 文件,我们可以灵活地控制日志的输出格式、日志级别、日志的输出目标等。本文将详细介绍如何配置 logback.xml 文件。

一. 基本结构

logback.xml 文件是 Logback 的核心配置文件,其基本结构如下:

<configuration>

   <property name="xxx" value="/app/log" />
    <!-- Appenders -->
    <appender name="APPENDER_NAME" class="APPENDER_CLASS">
        <!-- 配置内容 -->
    </appender>
 
    <!-- Loggers -->
    <logger name="LOGGER_NAME" level="LOG_LEVEL">
        <appender-ref ref="APPENDER_NAME" />
    </logger>
 
    <!-- Root Logger -->
    <root level="LOG_LEVEL">
        <appender-ref ref="APPENDER_NAME" />
    </root>
</configuration>
  • <configuration> 标签是配置文件的根元素。
  • <root> 元素定义了根日志级别,它决定了所有日志消息的最低级别,此处设置为 INFO。根日志级别是一个过滤器,低于此级别的日志消息将被忽略。
  • <appender> 元素定义了不同的日志输出目标。上述配置文件中定义了两个 appender,分别是 STDOUT 和 FILE。每个 appender 都有一个 name 属性和 class 属性。STDOUT 是输出到控制台的 appender,FILE 是输出到文件的 appender。
  • <encoder> 元素定义了日志消息的格式。在上述配置中,STDOUT 和 FILE 都使用了相同的格式,包括时间戳、线程名、日志级别、日志记录器名称、消息文本等。你可以根据需要自定义日志消息的格式。
  • rollingPolicy 元素定义了日志文件的滚动策略。在 FILE appender 中,我们使用 TimeBasedRollingPolicy,它会根据时间滚动日志文件。例如,app.log 每天会滚动并保存为 app.xxxx-xx-xx.log,其中时间戳是当前日期。 

二. 配置Configuration

Configuration作用:监听配置文件的变化,自动重新加载配置。

  • scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
  • scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒当scan为true时,此属性生效。默认的时间间隔为1分钟。
  • debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="false" scanPeriod="60 seconds" debug="false">
    <!-- 配置内容 -->    
</configuration> 

三. 配置 Property

用来定义变量值,它有两个属性name和value,通过property定义的值会被插入到logger上下文中,可以使${}来使用变量

 <configuration scan="true" scanPeriod="60 seconds" debug="false"> 
      <property name="APP_Name" value="myAppName" /> 
      <contextName>${APP_Name}</contextName> 
      <!--其他配置省略--> 
 </configuration>

四. 配置 Appenders

Appender 用于定义日志的输出目标。Logback 支持多种类型的 appender,如控制台、文件、数据库等。

以下是一些常见的 appender 配置:

4.1 控制台日志

通过设置ConsoleAppender,向控制台输出日志。

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
</appender>
4.2 文件日志

通过设置FileAppender,向文件输出日志。

  • file:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
  • append:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
  • encoder:对记录事件进行格式化。(具体参数稍后讲解 )
  • prudent:如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false。
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>logs/app.log</file>
    <!-- 是否追加到文件末尾 -->
    <append>true</append> 
    <encoder>
        <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
	    <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] [%-5level] %logger{50} - %msg%n</pattern>
		<charset>UTF-8</charset>
    </encoder>
</appender>
4.3 文件日志(滚动)

通过设置RollingFileAppender,向文件输出日志,并且支持日志文件的滚动(按时间或文件大小切分日志文件)。所有属性如下:

  • file:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,无默认值。
  • append:默认是true,如果是 true,日志被追加到文件结尾。如果是 false,清空现存文件。

  • rollingPolicy:  当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名。属性class定义滚动策略类,而TimeBasedRollingPolicy是最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。有以下子节点:
    <fileNamePattern>:必要节点,包含文件名及“%d”转换符,“%d”可以包含一个java.text.SimpleDateFormat指定的时间格式,如:%d{yyyy-MM}。
    如果直接使用 %d,默认格式是 yyyy-MM-dd。RollingFileAppender的file字节点可有可无,通过设置file,可以为活动文件和归档文件指定不同位置,当前日志总是记录到file指定的文件(活动文件),活动文件的名字不会改变;如果没设置file,活动文件的名字会根据fileNamePattern 的值,每隔一段时间改变一次。“/”或者“\”会被当做目录分隔符。

  • maxHistory:  可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每个月滚动,且是6,则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除。

  • maxFileSize: 单个文件的大小,默认值是10MB。

  • prudent:当为true时,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有两个限制,不支持也不允许文件压缩和不能设置file属性,必须留空。

  • triggeringPolicy : 通知 RollingFileAppender 何时激活滚动。FixedWindowRollingPolicy根据固定窗口算法重命名文件的滚动策略。有以下子节点:
      <minIndex>: 窗口索引最小值
      <maxIndex>:窗口索引最大值,当用户指定的窗口过大时,会自动将窗口设置为12。
      <fileNamePattern>: 必须包含“%i”,假设最小值和最大值分别为1和2,命名模式为 log%i.log,那么会产生归档文件log1.log和log2.log。还可以指定文件压缩选项,如,log%i.log.gz 或者 没有log%i.log.zip

<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>logs/app.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>logs/app.%d{yyyy-MM-dd}.log</fileNamePattern>
        <maxHistory>30</maxHistory> <!-- 保留最近30天的日志文件 -->
	    <MaxFileSize>500MB</MaxFileSize><!--单个日志文件大小-->
    </rollingPolicy>
    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
     
   </triggeringPolicy>
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
</appender>
4.4 配置过滤 (filter)

定义一个过滤器,可以用来过滤日志信息,可以包含在 Logger 或 Appender 元素中

<!--日志输出到控制台-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 过滤器,只打印ERROR级别的日志 -->
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>ERROR</level>
			<onMatch>ACCEPT</onMatch>
			<onMismatch>DENY</onMismatch>
		</filter>
 </appender>
4.5 日志输出格式(encoder)
<!--日志输出到控制台-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">     
      <encoder>
          <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n
          </pattern>
      </encoder>
 </appender>
4.6 异步日志

使用异步日志可以提高性能,减少日志记录对应用程序的影响。

<appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
    <appender-ref ref="FILE" />
</appender>

其它不常用的,如:SocketAppender、SMTPAppender、DBAppender、SyslogAppender、SiftingAppender,并不常用,可以参考官方文档(Documentation

五. 配置 Loggers

用来设置某一个包或具体的某一个类的日志打印级别、以及指定。Logger仅有一个name属性,一个可选的level和一个可选的addtivity属性。可以包含零个或多个<appender-ref>元素,可以单独为每个包或类定义 。

5.1 定义特定包
<logger name="com.example" level="DEBUG">
    <appender-ref ref="CONSOLE" />
</logger>
5.2 定义某个类
<logger name="com.example.MyClass" level="DEBUG">
    <appender-ref ref="CONSOLE" />
</logger>

提示:若要打印SQL语句,一般要设置level为debug 

 六. 配置根目录日志

 定义全局的 root logger。

<!-- 配置根日志级别,控制全局的日志级别 -->
<root level="INFO">
    <appender-ref ref="CONSOLE" />
    <appender-ref ref="FILE" />
</root>

七. 设置不同环境 

<!-- 测试环境下的日志配置 -->
	<springProfile name="test">
		<root level="INFO">
			<appender-ref ref="CONSOLE" />
			<appender-ref ref="SYSTEM-INFO" />
		</root>
	</springProfile>
 
	<!-- 生产环境下的日志配置 -->
	<springProfile name="pro">
		<root level="INFO">
			<appender-ref ref="CONSOLE" />
			<appender-ref ref="SYSTEM-INFO" />
			<appender-ref ref="SYSTEM-ERROR" />
		</root>
	</springProfile>
 
	<!-- 生产环境下的日志配置 -->
	<springProfile name="uat">
		<root level="INFO">
			<appender-ref ref="CONSOLE" />
			<appender-ref ref="SYSTEM-INFO" />
			<appender-ref ref="SYSTEM-ERROR" />
		</root>
	</springProfile>

八. 完整示例

 8.1 参考示例-1
<?xml version="1.0" encoding="UTF-8"?>
<!--
scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
-->
<configuration scan="false" scanPeriod="60 seconds" debug="false">
    <!-- 定义日志的根目录 -->
    <property name="LOG_HOME" value="/app/log" />
    <!-- 定义日志文件名称 -->
    <property name="appName" value="atguigu-springboot"></property>
    <!-- ch.qos.logback.core.ConsoleAppender 表示控制台输出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--
        日志输出格式:
            %d表示日期时间,
            %thread表示线程名,
            %-5level:级别从左显示5个字符宽度
            %logger{50} 表示logger名字最长50个字符,否则按照句点分割。 
            %msg:日志消息,
            %n是换行符
        -->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </layout>
    </appender>

    <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->  
    <appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 指定日志文件的名称 -->
        <file>${LOG_HOME}/${appName}.log</file>
        <!--
        当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名
        TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。
        -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--
            滚动时产生的文件的存放位置及文件名称 %d{yyyy-MM-dd}:按天进行日志滚动 
            %i:当文件大小超过maxFileSize时,按照i进行文件滚动
            -->
            <fileNamePattern>${LOG_HOME}/${appName}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <!-- 
            可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每天滚动,
            且maxHistory是365,则只保存最近365天的文件,删除之前的旧文件。注意,删除旧文件是,
            那些为了归档而创建的目录也会被删除。
            -->
            <MaxHistory>365</MaxHistory>
            <!-- 
            当日志文件超过maxFileSize指定的大小是,根据上面提到的%i进行日志文件滚动 注意此处配置SizeBasedTriggeringPolicy是无法实现按文件大小进行滚动的,必须配置timeBasedFileNamingAndTriggeringPolicy
            -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 日志输出格式: -->     
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern>
        </layout>
    </appender>

    <!-- 
        logger主要用于存放日志对象,也可以定义日志类型、级别
        name:表示匹配的logger类型前缀,也就是包的前半部分
        level:要记录的日志级别,包括 TRACE < DEBUG < INFO < WARN < ERROR
        additivity:作用在于children-logger是否使用 rootLogger配置的appender进行输出,
        false:表示只用当前logger的appender-ref,true:
        表示当前logger的appender-ref和rootLogger的appender-ref都有效
    -->
    <!-- hibernate logger -->
    <logger name="com.atguigu" level="debug" />
    <!-- Spring framework logger -->
    <logger name="org.springframework" level="debug" additivity="false"></logger>

    <!-- 
    root与logger是父子关系,没有特别定义则默认为root,任何一个类只会和一个logger对应,
    要么是定义的logger,要么是root,判断的关键在于找到这个logger,然后判断这个logger的appender和level。 
    -->
    <root level="info">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="appLogAppender" />
    </root>
</configuration> 
 8.2 参考示例-2
<?xml version="1.0" encoding="UTF-8"?>
<configuration  scan="true" scanPeriod="10 seconds">
    <!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
    <!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
    <!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
    <!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
    <contextName>logback</contextName>
    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
    <property name="log.path" value="I:/cpdkedu/edu" />
    <!-- 彩色日志 -->
    <!-- 配置格式变量:CONSOLE_LOG_PATTERN 彩色日志格式 -->
    <!-- magenta:洋红 -->
    <!-- boldMagenta:粗红-->
    <!-- cyan:青色 -->
    <!-- white:白色 -->
    <!-- magenta:洋红 -->
    <property name="CONSOLE_LOG_PATTERN"
    value="%yellow(%date{yyyy-MM-dd HH:mm:ss}) |%highlight(%-5level) |%blue(%thread) |%blue(%file:%line) |%green(%logger) |%cyan(%msg%n)"/>
    <!--输出到控制台-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
        <!-- 例如:如果此处配置了INFO级别,则后面其他位置即使配置了DEBUG级别的日志,也不会被输出 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <encoder>
            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <!--输出到文件-->
    <!-- 时间滚动输出 level为 INFO 日志 -->
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/log_info.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.TimeBasedRollingPolicy">
            <!-- 每天日志归档路径以及格式 -->
            <fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件只记录info级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
 
    <!-- 时间滚动输出 level为 WARN 日志 -->
    <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        
        <file>${log.path}/log_warn.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.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
 
        <!-- 此日志文件只记录warn级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>warn</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- 时间滚动输出 level为 ERROR 日志 -->
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/log_error.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.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
 
        <!-- 此日志文件只记录ERROR级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
 
    <!--
        <logger>用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。
        <logger>仅有一个name属性,
        一个可选的level和一个可选的addtivity属性。
        name:用来指定受此logger约束的某一个包或者具体的某一个类。
        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
        addtivity:如果未设置此属性(默认false),那么当前logger将会继承上级的级别。
    -->
 
 
    <!--开发环境:打印控制台-->
    <springProfile name="dev">
        <!--可以输出项目中的debug日志,包括mybatis的sql日志-->
        <logger name="com.ruoyi" level="INFO" />
 
        <!--
            root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
            level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,默认是DEBUG
            可以包含零个或多个appender元素。
        -->
        <root level="INFO">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="INFO_FILE" />
            <appender-ref ref="WARN_FILE" />
            <appender-ref ref="ERROR_FILE" />
        </root>
    </springProfile>
 
    <!--生产环境:输出到文件-->
    <springProfile name="pro">
        <root level="INFO">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="DEBUG_FILE" />
            <appender-ref ref="INFO_FILE" />
            <appender-ref ref="ERROR_FILE" />
            <appender-ref ref="WARN_FILE" />
        </root>
    </springProfile>
</configuration>

九. 常见问题

9.1 启动报错

启动显示Could NOT find resource [logback-test.xml],这个时候需要检查一下日志存放路径,如图:

如果没有/home/app/logs,需要手动新建,否则报错

总结

通过 logback.xml 配置文件,我们可以灵活地控制日志的输出格式、日志级别、日志的输出目标等。合理配置日志,可以显著提高应用程序的可维护性和调试效率。

希望本文能帮助你更好地理解和配置 logback.xml,为你的 Java 项目提供有力的日志支持。大家互相交流,共同进步!

### 设置日志输出路径 在 `logback.xml` 中设置日志输出路径主要通过定义 `<appender>` 元素来实现。具体来说,可以使用 `FileAppender` 或其子类如 `RollingFileAppender` 来指定日志文件的位置。 #### 使用 FileAppender 输出到固定位置的日志文件 ```xml <configuration> <!-- 定义一个名为 FILE 的 appender --> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <!-- 日志文件的绝对路径或相对路径 --> <file>/var/logs/myapplication.log</file> <!-- 编码方式 --> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 将 root logger 关联至上述 appender --> <root level="debug"> <appender-ref ref="FILE"/> </root> </configuration> ``` #### 使用 RollingFileAppender 实现滚动日志文件 对于生产环境而言,通常推荐使用带有大小限制和时间轮转功能的 `RollingFileAppender`: ```xml <configuration> <!-- 定义一个名为 ROLLING_FILE 的 appender --> <appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 日志文件存储位置 --> <file>logs/application.log</file> <!-- 当达到最大尺寸时触发新文件创建策略 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 归档后的日志命名模式 --> <fileNamePattern>logs/application-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern> <!-- 单个文件的最大容量 --> <maxFileSize>10MB</maxFileSize> <!-- 总共保留多少天的历史记录 --> <maxHistory>30</maxHistory> </rollingPolicy> <!-- 控制台编码器配置 --> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg%n</pattern> </encoder> </appender> <!-- 绑定 logger 到 rolling file appender 上 --> <root level="info"> <appender-ref ref="ROLLING_FILE"/> </root> </configuration> ``` 以上两种方法都可以有效地控制日志输出的目标路径[^1][^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值