LogBackログの紛失原因の調査と解決方法


Logbackログ紛失原因の調査と解決方法
問題の再現
ConnectivityプロジェクトをアリクラウドSwamクラスタに正常に配備した後.PVCグループはクラスタの圧力テストを行った.クラスタのlogログを回収して分析した.100万件のデータを送信した後、498件のデータが失われたことが分かった.前後のlogは中間logだけが失われている.そこでログの紛失原因の調査に着手した.
調査プロセス
調査過程は5段階に分かれている.1、Connectivityは高同時環境で動作するため、単機は3000 QPSを受け入れる必要があり、まずログが高同時中にスレッドが切り替わってlogがタイムリーにファイルに書き込めなくなって紛失したかどうかを判断する必要がある.ローカルで1000スレッドごとに100回書き込み、500スレッドごとに200回書き込みなどの複数回のテストを行い、失われたログの問題を繰り返し再現できることが分かった.除外はConnectivityプロジェクトコードの問題です.2、ロゴを失った時間とJava仮想マシンのゴミ回収の時間を比較する.ごみ回収の際にログ紛失問題は発見されず,ごみ回収がlog書き込みに影響を与えたものではないと判断した.3、ログをスレッド書き込みの統計を行い、複数のスレッドが同じ時刻にログを失ったことを発見した.つまり、843748個のログに書き込まれた後に失われたログ(400~500個)です.繰り返しテストして再現できます.各ログサイズは124 Kと計算されます.124*843748 = 100MB.このときは基本的にファイルサイズや書き込みポリシーの影響と判断できます.4、Logbackプロファイルを分析する.TimeBasedRollingPolicyとSizeBasedTriggeringPolicyが併用されていることが分かった.また、SizeBasedTriggerPolicy設定ファイルは最大100 MBです.関連する問題を検索し、ソースコードをdebugおよび分析します.この2つのポリシーを同時に使用すると、ログバックが実行中に自身のコードの問題で異常を放出することが分かった.私はすでにissueをLogbackのJIRAに提出しました.5、時間によってファイルを分割する必要があり、各ファイルのサイズを制限する必要がある場合は、SizeAndTimeBasedRollingPolicyを使用する.公式文書の説明は以下の通りです.
   Sometimes you may wish to archive files essentially by date but at the same time limit the size of each log file, in particular if post-processing tools impose size limits on the log files. In order to address this requirement, logback ships with SizeAndTimeBasedRollingPolicy.
    Note that TimeBasedRollingPolicy already allows limiting the combined size of archived log files. If you only wish to limit the combined size of log archives, then TimeBasedRollingPolicy described above and setting the totalSizeCap property should be amply sufficent.

解決策
エラー・サンプルlogbackの構成は、次の例です.

<configuration debug="false">
    <property name="LOG_HOME" value="log" />
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
        encoder>
    appender>
    <appender name="FILE"  class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${LOG_HOME}/connectivi.log.%d{yyyy-MM-dd}.logFileNamePattern>
            <MaxHistory>6MaxHistory>
        rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
            <immediateFlush>trueimmediateFlush>
        encoder>
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>100MBMaxFileSize>
        triggeringPolicy>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>TRACElevel>
        filter>

    appender>
    <logger name="com.mindsphere.china.poc.connectivity" level="DEBUG" additivity="false">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    logger>

    <root level="ERROR">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    root>
configuration>
    logback    , 。

<configuration debug="false">
    <property name="LOG_HOME" value="log" />
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
        encoder>
    appender>

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            
            <fileNamePattern>${LOG_HOME}/connectivity.%d{yyyy-MM-dd}.%i.logfileNamePattern>
            
            <maxFileSize>100MBmaxFileSize>
            <maxHistory>30maxHistory>
        rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
        encoder>
    appender>

    <logger name="com.mindsphere.china.poc.connectivity" level="DEBUG" additivity="false">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    logger>

    <root level="ERROR">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    root>
configuration>

まとめ
   Log            。                       log。                          。   log                  。             。

関連リンク
logbackの紹介:https://www.cnblogs.com/warking/p/5710303.htmllogbackの公式紹介:https://logback.qos.ch/manual/appenders.html#SizeAndTimeBasedFNATP https://blog.csdn.net/cwjcsu/article/details/9217105 https://blog.csdn.net/wujianmin577/article/details/68922545