如何使用 Logback 将日志写入到自定义持久性存储

注意

基本、标准和企业计划将从 2025 年 3 月中旬开始弃用,停用期为 3 年。 建议转换到 Azure 容器应用。 有关详细信息,请参阅 Azure Spring Apps 停用公告

标准消耗和专用计划将于 2024 年 9 月 30 日开始弃用,并在六个月后完全关闭。 建议转换到 Azure 容器应用。

本文介绍如何加载 Logback 并将日志写入到 Azure Spring Apps 中的自定义持久性存储。

注意

当应用程序的类路径中的文件具有以下名称之一时,Spring Boot 将通过 Logback 的默认配置自动加载该文件:

  • logback-spring.xml
  • logback.xml
  • logback-spring.groovy
  • logback.groovy

先决条件

编辑 Logback 配置,将日志写入特定路径

可以使用 logback-spring.xml 示例文件设置将要写入日志的路径。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="Console"
              class="ch.qos.logback.core.ConsoleAppender">
        <!-- please feel free to customize the log layout -->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>
                %black(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable
            </Pattern>
        </layout>
    </appender>

    <appender name="RollingFile"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 'LOGS' here is a value to be read from the application's environment variable -->
        <file>${LOGS}/spring-boot-logger.log</file>
        <!-- please feel free to customize the log layout pattern -->
        <encoder
                class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>%d %p %C{1.} [%t] %m%n</Pattern>
        </encoder>

        <rollingPolicy
                class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- rollover daily and when the file reaches 10 MegaBytes -->
            <fileNamePattern>${LOGS}/archived/spring-boot-logger-%d{yyyy-MM-dd}.%i.log
            </fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>

    <!-- LOG everything at the INFO level -->
    <root level="info">
        <appender-ref ref="RollingFile" />
        <appender-ref ref="Console" />
    </root>

    <!-- LOG "com.baeldung*" at the TRACE level -->
    <logger name="com.baeldung" level="trace" additivity="false">
        <appender-ref ref="RollingFile" />
        <appender-ref ref="Console" />
    </logger>

</configuration>

在上一示例中,路径中有两个名为 {LOGS} 的占位符,用于将应用程序的日志写入其中。 需要为环境变量 LOGS 分配一个值,才能将日志写入控制台和持久性存储。

使用 Azure CLI 在持久存储上通过 Logback 创建和部署新应用

  1. 使用以下命令在启用了持久性存储并设置了环境变量的 Azure Spring Apps 中创建应用程序:

    az spring app create \
         --resource-group <resource-group-name> \
         --name <app-name> \
         --service <spring-instance-name> \
         --persistent-storage <path-to-json-file> \
         --env LOGS=/byos/logs
    

    注意

    LOGS 环境变量的值可以与 mountPath 相同,也可以是其子目录。

    下面是传递到 create 命令中的 --persistent-storage 参数的 JSON 文件示例。 在此示例中,在上面的 CLI 命令和下面的 mountPath 属性中为环境变量传递相同的值:

    {
        "customPersistentDisks": [
            {
                "storageName": "<Storage-Resource-Name>",
                "customPersistentDiskProperties": {
                    "type": "AzureFileVolume",
                    "shareName": "<Azure-File-Share-Name>",
                    "mountPath": "/byos/logs",
                    "readOnly": false
                }
            }
        ]
    }
    
  2. 使用以下命令部署应用程序:

    az spring app deploy \
         --resource-group <resource-group-name> \
         --name <app-name> \
         --service <spring-instance-name> \
         --artifact-path <path-to-jar-file>
    
  3. 使用以下命令检查应用程序的控制台日志:

    az spring app logs \
         --resource-group <resource-group-name> \
         --name <app-name> \
         --service <spring-instance-name>
    

    转到绑定的 Azure 存储帐户资源,找到附加为持久性存储的 Azure 文件共享。 本示例将日志写入 Azure 文件共享根目录中的 spring-boot-logger.log 文件。 所有旋转的日志文件都将存储在 Azure 文件共享的 /archived 文件夹中。

  4. (可选)使用以下命令更新现有应用的路径或持久性存储:

    保存日志的路径或持久性存储可以随时更改。 对环境变量或持久性存储进行更改时,应用程序会重启。

    az spring app update \
         --resource-group <resource-group-name> \
         --name <app-name> \
         --service <spring-instance-name> \
         --persistent-storage <path-to-new-json-file> \
         --env LOGS=<new-path>
    

后续步骤