intra-mart Accel Platform ログ仕様書 第12版 2019-12-01

バーチャルテナントでのログ運用

バーチャルテナント環境におけるログの運用について説明します。

ログにテナントIDを出力する

バーチャルテナント機能を利用し、バーチャルテナントによる複数テナントを運用する場合
ログにテナントIDを加えて出力することで、どのテナントの処理内容かを判断できます。
intra-mart Accel Platform では、MDCにテナントIDの情報を保持しています。
詳細は「 システムログ 」「 特定用途ログ 」の 利用可能なMDCキー 内の tenant.id を参照ください。

テナント単位にログを分割する

標準のログ設定では、システムログ・特定用途ログには各テナントの情報が混在して出力されます。
テナントを複数運用する場合、情報が混在しログの解析や問題の切り分けが困難になる場合があります。
その場合、ログファイルをテナント単位で分割することを検討してください。
ログファイルの分割は、「 MDCに格納されている値でログを分割する 」で紹介している方法を用い、MDCのテナントIDをキーとして設定することで可能です。
以下にセキュリティログの設定例を示します。
<included>

    <!-- appender "SECURITY_FILE" の設定を省略しています。 -->

    <appender name="SECURITY_BY_TENANT" class="ch.qos.logback.classic.sift.SiftingAppender">
        <discriminator>
            <key>tenant.id</key>
            <defaultValue>_NO_TENANT_</defaultValue>
        </discriminator>
        <timeout>30 minutes</timeout>
        <sift>
            <appender name="SECURITY_FILE-${tenant.id}" class="ch.qos.logback.core.rolling.RollingFileAppender">
                <file>${im.log}/platform/${tenant.id}/security.log</file>
                <append>true</append>

                <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
                    <fileNamePattern>${im.log}/platform/${tenant.id}/security%i.log</fileNamePattern>
                    <minIndex>1</minIndex>
                    <maxIndex>5</maxIndex>
                </rollingPolicy>

                <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
                    <maxFileSize>10MB</maxFileSize>
                </triggeringPolicy>

                <encoder>
                    <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}]  [%thread]   %X{log.report.sequence} %-5level    %logger{255}    %X{tenant.id}    %X{log.id}  -   %X{security.id.session} %X{security.id.account} %X{security.id.usertype}    [%X{log.message.code}]  %msg    %X{request.id}%nopex%n</pattern>
                </encoder>
            </appender>
        </sift>
    </appender>

    <logger name="SECURITY_LOG" additivity="false">
        <level value="warn" />
        <appender-ref ref="STDOUT" />
        <appender-ref ref="SECURITY_FILE" />
        <appender-ref ref="SECURITY_BY_TENANT" />
    </logger>

</included>

注意

テナント毎にログを分割して出力する場合、出力するログの数×テナント数でファイルのオープンが行われます。
その為、設定によっては多くのログファイルがオープンされ、ファイルディスクリプタが不足してしまう可能性があります。
これを回避するためには、OSレベルで利用可能なファイルディスクリプタ数の上限を変更するといった対応を検討してください。