Log 4 j 2同期ログ、ハイブリッドログ、非同期ログ構成の詳細

72865 ワード

ログ4 j 2にログを記録する方法には、同期ログと非同期ログの2つの方法があり、非同期ログは、AsyncAppenderの使用とAsyncLoggerの使用の2つの方法に分けることができる.
文書ディレクトリ
  • 同期ログ
  • ハイブリッド同期および非同期ログ
  • 非同期ログ(パフォーマンスが最も優れ、推奨)
  • 同期ログ
    同期ログとは、ログを出力するときに、後続のビジネスロジック文を実行するには、ログ出力文の実行が完了するまで待たなければならないということです.
    以下に、開発におけるアセンブリの構成を示します.
    
    <Configuration>
    
        <Properties>
            
            <Property name="LOG_INFO_LEVEL" value="info"/>
            
            <Property name="LOG_ERROR_LEVEL" value="error"/>
            
            <Property name="LOG_HOME" value="./log"/>
            
            <Property name="LOG_ARCHIVE" value="./log/archive"/>
            
            <Property name="LOG_MODULE_NAME" value="spring-boot"/>
            
            <Property name="LOG_MAX_SIZE" value="100 MB"/>
            
            <Property name="LOG_DAYS" value="15"/>
            
            <Property name="LOG_PATTERN" value="%d [%t] %-5level %logger{0} - %msg%n"/>
            
            <Property name="TIME_BASED_INTERVAL" value="1"/>
        Properties>
    
        <Appenders>
            
            <Console name="STDOUT" target="SYSTEM_OUT">
                
                <PatternLayout pattern="${LOG_PATTERN}"/>
                
                <ThresholdFilter level="${LOG_INFO_LEVEL}" onMatch="ACCEPT" onMismatch="DENY"/>
            Console>
    
            
            <RollingRandomAccessFile name="RollingRandomAccessFileInfo"
                                     fileName="${LOG_HOME}/${LOG_MODULE_NAME}-infoLog.log"
                                     filePattern="${LOG_ARCHIVE}/${LOG_MODULE_NAME}-infoLog-%d{yyyy-MM-dd}-%i.log.gz">
                <Filters>
                    
                    <ThresholdFilter level="${LOG_ERROR_LEVEL}" onMatch="DENY" onMismatch="NEUTRAL"/>
                    
                    <ThresholdFilter level="${LOG_INFO_LEVEL}" onMatch="ACCEPT" onMismatch="DENY"/>
                Filters>
                <PatternLayout pattern="${LOG_PATTERN}"/>
                <Policies>
                    
                    <TimeBasedTriggeringPolicy interval="${TIME_BASED_INTERVAL}"/>
                    <SizeBasedTriggeringPolicy size="${LOG_MAX_SIZE}"/>
                Policies>
                
                <DefaultRolloverStrategy max="${LOG_DAYS}"/>
            RollingRandomAccessFile>
    
            
            <RollingRandomAccessFile name="RollingRandomAccessFileError"
                                     fileName="${LOG_HOME}/${LOG_MODULE_NAME}-errorLog.log"
                                     filePattern="${LOG_ARCHIVE}/${LOG_MODULE_NAME}-errorLog-%d{yyyy-MM-dd}-%i.log.gz">
                <Filters>
                    <ThresholdFilter level="${LOG_ERROR_LEVEL}" onMatch="ACCEPT" onMismatch="DENY"/>
                Filters>
                <PatternLayout pattern="${LOG_PATTERN}"/>
                <Policies>
                    <TimeBasedTriggeringPolicy interval="${TIME_BASED_INTERVAL}"/>
                    <SizeBasedTriggeringPolicy size="${LOG_MAX_SIZE}"/>
                Policies>
                <DefaultRolloverStrategy max="${LOG_DAYS}"/>
            RollingRandomAccessFile>
    
        Appenders>
    
        <Loggers>
            
            
    
            
            <Root level="${LOG_INFO_LEVEL}">
                <AppenderRef ref="RollingRandomAccessFileInfo"/>
                <AppenderRef ref="RollingRandomAccessFileError"/>
            Root>
        Loggers>
    
    Configuration>
    

    同期ログと非同期ログのブレンド
    Log 4 j-2.9以降はクラスパス上でdisruptor-3.3が必要である.4.jar以降.Log 4 j-2.9までにdisruptor-3.0が必要である.0.jar以降.システム属性「Log 4 jContextSelector」を任意の値に設定する必要はありません.
    同期レコーダと非同期レコーダを構成で組み合わせることができます.これにより、柔軟性が向上しますが、パフォーマンスがわずかに低下します(すべてのレコーダを非同期化するよりも).または構成要素を使用して、非同期のレコーダを指定します.構成には1つのルートレコーダ(または要素)しか含まれませんが、非同期レコーダと非同期レコーダを組み合わせることができます.例えば、要素を含むプロファイルは、および同期レコーダの要素を含んでもよい.
    デフォルトでは、非同期レコーダはI/Oスレッドに位置を渡さない.レイアウトまたはカスタムフィルタに位置情報が必要な場合は、ルートレコーダを含むすべての関連レコーダの構成に「includeLocation=true」を設定する必要があります.
    まずdisruptor依存を導入する
    <dependency>
        <groupId>com.lmaxgroupId>
        <artifactId>disruptorartifactId>
        <version>3.4.2version>
    dependency>
    

    ハイブリッド非同期レコーダの構成は次のようになります.
    
    <Configuration>
    
        <Properties>
            
            <Property name="LOG_INFO_LEVEL" value="info"/>
            
            <Property name="LOG_ERROR_LEVEL" value="error"/>
            
            <Property name="LOG_HOME" value="./log"/>
            
            <Property name="LOG_ARCHIVE" value="./log/archive"/>
            
            <Property name="LOG_MODULE_NAME" value="spring-boot"/>
            
            <Property name="LOG_MAX_SIZE" value="100 MB"/>
            
            <Property name="LOG_DAYS" value="15"/>
            
            <Property name="LOG_PATTERN" value="%d [%t] %-5level %logger{0} - %msg%n"/>
            
            <Property name="TIME_BASED_INTERVAL" value="1"/>
        Properties>
    
        <Appenders>
            
            <Console name="STDOUT" target="SYSTEM_OUT">
                
                <PatternLayout pattern="${LOG_PATTERN}"/>
                
                <ThresholdFilter level="${LOG_INFO_LEVEL}" onMatch="ACCEPT" onMismatch="DENY"/>
            Console>
    
            
            
            <RollingRandomAccessFile name="RollingRandomAccessFileInfo"
                                     fileName="${LOG_HOME}/${LOG_MODULE_NAME}-infoLog.log"
                                     filePattern="${LOG_ARCHIVE}/${LOG_MODULE_NAME}-infoLog-%d{yyyy-MM-dd}-%i.log.gz"
                                     immediateFlush="false">
                <Filters>
                    
                    <ThresholdFilter level="${LOG_ERROR_LEVEL}" onMatch="DENY" onMismatch="NEUTRAL"/>
                    
                    <ThresholdFilter level="${LOG_INFO_LEVEL}" onMatch="ACCEPT" onMismatch="DENY"/>
                Filters>
                <PatternLayout pattern="${LOG_PATTERN}"/>
                <Policies>
                    
                    <TimeBasedTriggeringPolicy interval="${TIME_BASED_INTERVAL}"/>
                    <SizeBasedTriggeringPolicy size="${LOG_MAX_SIZE}"/>
                Policies>
                
                <DefaultRolloverStrategy max="${LOG_DAYS}"/>
            RollingRandomAccessFile>
    
            
            <RollingRandomAccessFile name="RollingRandomAccessFileError"
                                     fileName="${LOG_HOME}/${LOG_MODULE_NAME}-errorLog.log"
                                     filePattern="${LOG_ARCHIVE}/${LOG_MODULE_NAME}-errorLog-%d{yyyy-MM-dd}-%i.log.gz"
                                     immediateFlush="false">
                <Filters>
                    <ThresholdFilter level="${LOG_ERROR_LEVEL}" onMatch="ACCEPT" onMismatch="DENY"/>
                Filters>
                <PatternLayout pattern="${LOG_PATTERN}"/>
                <Policies>
                    <TimeBasedTriggeringPolicy interval="${TIME_BASED_INTERVAL}"/>
                    <SizeBasedTriggeringPolicy size="${LOG_MAX_SIZE}"/>
                Policies>
                <DefaultRolloverStrategy max="${LOG_DAYS}"/>
            RollingRandomAccessFile>
    
        Appenders>
    
        <Loggers>
            
            
    
            
            
            <AsyncLogger name="com.jourwon" level="${LOG_INFO_LEVEL}" additivity="false">
                <AppenderRef ref="RollingRandomAccessFileInfo"/>
                <AppenderRef ref="RollingRandomAccessFileError"/>
            AsyncLogger>
    
            <Root level="${LOG_INFO_LEVEL}">
                <AppenderRef ref="RollingRandomAccessFileInfo"/>
                <AppenderRef ref="RollingRandomAccessFileError"/>
            Root>
        Loggers>
    
    Configuration>
    

    非同期ログ(最高のパフォーマンス、推奨)
    Log 4 j-2.9以降はクラスパス上でdisruptor-3.3が必要である.4.jar以降.Log 4 j-2.9までにdisruptor-3.0が必要である.0.jar以降.
    これは最も簡単な構成であり、最適なパフォーマンスを提供します.すべてのレコーダを非同期にするには、disruptor jarをクラスパスに追加し、システムプロパティlog4j2.contextSelectororg.apache.logging.log4j.core.async.AsyncLoggerContextSelectorに設定します.
    デフォルトでは、非同期レコーダはI/Oスレッドに位置を渡さない.レイアウトまたはカスタムフィルタに位置情報が必要な場合は、ルートレコーダを含むすべての関連レコーダの構成に「includeLocation=true」を設定する必要があります.
    まずdisruptor依存を導入する
    <dependency>
        <groupId>com.lmaxgroupId>
        <artifactId>disruptorartifactId>
        <version>3.4.2version>
    dependency>
    

    次にsrc/java/resourcesディレクトリにlog 4 j 2を追加する.component.propertiesプロファイル
    #           
    log4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
    

    次のように構成されています.
    
    <Configuration>
    
        <Properties>
            
            <Property name="LOG_INFO_LEVEL" value="info"/>
            
            <Property name="LOG_ERROR_LEVEL" value="error"/>
            
            <Property name="LOG_HOME" value="./log"/>
            
            <Property name="LOG_ARCHIVE" value="./log/archive"/>
            
            <Property name="LOG_MODULE_NAME" value="spring-boot"/>
            
            <Property name="LOG_MAX_SIZE" value="100 MB"/>
            
            <Property name="LOG_DAYS" value="15"/>
            
            <Property name="LOG_PATTERN" value="%d [%t] %-5level %logger{0} - %msg%n"/>
            
            <Property name="TIME_BASED_INTERVAL" value="1"/>
        Properties>
    
        <Appenders>
            
            <Console name="STDOUT" target="SYSTEM_OUT">
                
                <PatternLayout pattern="${LOG_PATTERN}"/>
                
                <ThresholdFilter level="${LOG_INFO_LEVEL}" onMatch="ACCEPT" onMismatch="DENY"/>
            Console>
    
            
            
            <RollingRandomAccessFile name="RollingRandomAccessFileInfo"
                                     fileName="${LOG_HOME}/${LOG_MODULE_NAME}-infoLog.log"
                                     filePattern="${LOG_ARCHIVE}/${LOG_MODULE_NAME}-infoLog-%d{yyyy-MM-dd}-%i.log.gz"
                                     immediateFlush="false">
                <Filters>
                    
                    <ThresholdFilter level="${LOG_ERROR_LEVEL}" onMatch="DENY" onMismatch="NEUTRAL"/>
                    
                    <ThresholdFilter level="${LOG_INFO_LEVEL}" onMatch="ACCEPT" onMismatch="DENY"/>
                Filters>
                <PatternLayout pattern="${LOG_PATTERN}"/>
                <Policies>
                    
                    <TimeBasedTriggeringPolicy interval="${TIME_BASED_INTERVAL}"/>
                    <SizeBasedTriggeringPolicy size="${LOG_MAX_SIZE}"/>
                Policies>
                
                <DefaultRolloverStrategy max="${LOG_DAYS}"/>
            RollingRandomAccessFile>
    
            
            <RollingRandomAccessFile name="RollingRandomAccessFileError"
                                     fileName="${LOG_HOME}/${LOG_MODULE_NAME}-errorLog.log"
                                     filePattern="${LOG_ARCHIVE}/${LOG_MODULE_NAME}-errorLog-%d{yyyy-MM-dd}-%i.log.gz"
                                     immediateFlush="false">
                <Filters>
                    <ThresholdFilter level="${LOG_ERROR_LEVEL}" onMatch="ACCEPT" onMismatch="DENY"/>
                Filters>
                <PatternLayout pattern="${LOG_PATTERN}"/>
                <Policies>
                    <TimeBasedTriggeringPolicy interval="${TIME_BASED_INTERVAL}"/>
                    <SizeBasedTriggeringPolicy size="${LOG_MAX_SIZE}"/>
                Policies>
                <DefaultRolloverStrategy max="${LOG_DAYS}"/>
            RollingRandomAccessFile>
    
        Appenders>
    
        <Loggers>
            
            
    
            
            <Root level="${LOG_INFO_LEVEL}" includeLocation="false">
                <AppenderRef ref="RollingRandomAccessFileInfo"/>
                <AppenderRef ref="RollingRandomAccessFileError"/>
            Root>
        Loggers>
    
    Configuration>
    

    非同期ログとしてAsyncLoggerContextSelectorを構成する場合は、構成に通常のおよび要素が使用されていることを確認してください.AsyncLoggerContextSelectorは、またはを構成するときのメカニズムとは異なる、すべてのレコーダが非同期であることを保証する.
    ロゴを通ります.info(「非同期ログかどうか:{}」,AsyncLoggerContextSelector.isSelected()非同期ログであるかどうかを確認できます.
    ログ出力方式
    sync
    ログを同期して印刷し、ログ出力と業務ロジックは同じスレッド内にあり、ログ出力が完了すると、後続の業務ロジック操作を行うことができる.
    Async Appender
    内部にArrayBlockingQueueを採用し、AsyncAppenderごとにスレッドを作成してログ出力を処理します.
    Async Logger
    非同期印刷ログは、高性能同時フレームワークDisruptorを採用し、ログ出力を処理するためのスレッドを作成します.