天天看點

詳解log4j2(下) - Async/MongoDB/Flume Appender 按日志級别區分檔案輸出

有些人習慣按日志資訊級别輸出到不同名稱的檔案中,如info.log,error.log,warn.log等,在log4j2中可通過配置Filters來實作。

假定需求是把INFO及以下級别的資訊輸出到info.log,WARN和ERROR級别的資訊輸出到error.log,FATAL級别輸出到fatal.log,配置檔案如下:

[java] view plain copy print?

<Configuration status="WARN" monitorInterval="300">  

    <properties>  

        <property name="LOG_HOME">D:/logs</property>  

    </properties>  

    <Appenders>  

        <Console name="Console" target="SYSTEM_OUT">  

            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />  

        </Console>  

        <RollingRandomAccessFile name="InfoFile"  

            fileName="${LOG_HOME}/info.log"  

            filePattern="${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">  

            <Filters>  

                <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL" />  

                <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY" />  

            </Filters>  

            <PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" />  

            <Policies>  

                <TimeBasedTriggeringPolicy />  

                <SizeBasedTriggeringPolicy size="10 MB" />  

            </Policies>  

            <DefaultRolloverStrategy max="20" />  

        </RollingRandomAccessFile>  

        <RollingRandomAccessFile name="ErrorFile"  

            fileName="${LOG_HOME}/error.log"  

            filePattern="${LOG_HOME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">  

                <ThresholdFilter level="fatal" onMatch="DENY" onMismatch="NEUTRAL" />  

                <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY" />  

        <RollingRandomAccessFile name="FatalFile"  

            fileName="${LOG_HOME}/fatal.log"  

            filePattern="${LOG_HOME}/$${date:yyyy-MM}/fatal-%d{yyyy-MM-dd}-%i.log">  

                <ThresholdFilter level="fatal" onMatch="ACCEPT" onMismatch="DENY" />  

    </Appenders>  

    <Loggers>  

        <Root level="trace">  

            <AppenderRef ref="Console" />  

            <AppenderRef ref="InfoFile" />  

            <AppenderRef ref="ErrorFile" />  

            <AppenderRef ref="FatalFile" />  

        </Root>  

    </Loggers>  

</Configuration>  

測試代碼:

public static void main(String[] args) {  

    Logger logger = LogManager.getLogger(Client.class);  

    logger.trace("trace level");  

    logger.debug("debug level");  

    logger.info("info level");  

    logger.warn("warn level");  

    logger.error("error level");  

    logger.fatal("fatal level");  

}  

配置檔案:

        <property name="FILE_NAME">mylog</property>  

        <RollingRandomAccessFile name="MyFile"  

            fileName="${LOG_HOME}/${FILE_NAME}.log"  

            filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd HH-mm}-%i.log">  

            <PatternLayout  

                pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" />  

                <TimeBasedTriggeringPolicy interval="1" />  

        <Async name="Async">  

            <AppenderRef ref="MyFile" />  

        </Async>  

        <Logger name="asynclog" level="trace" additivity="false" >  

            <AppenderRef ref="Async" />  

        </Logger>  

        <Root level="error">  

    Logger logger = LogManager.getLogger("asynclog");  

添加依賴:

<dependency>  

    <groupId>org.apache.logging.log4j</groupId>  

    <artifactId>log4j-nosql</artifactId>  

    <version>2.5</version>  

</dependency>  

    <groupId>org.mongodb</groupId>  

    <artifactId>mongo-java-driver</artifactId>  

    <version>3.2.2</version>  

        <NoSql name="databaseAppender">  

            <MongoDb databaseName="test" collectionName="errorlog"  

                server="localhost" port="27017" />  

        </NoSql>  

        <Logger name="mongolog" level="trace" additivity="false">  

            <AppenderRef ref="databaseAppender" />  

Flume配置(flume-conf.properties)

agent1.sources=source1   

agent1.sinks=sink1   

agent1.channels=channel1   

agent1.sources.source1.type=avro  

agent1.sources.source1.channels=channel1  

agent1.sources.source1.bind=0.0.0.0  

agent1.sources.source1.port=41414  

agent1.sinks.sink1.type=file_roll   

agent1.sinks.sink1.sink.directory=D:/log  

agent1.sinks.sink1.channel=channel1  

agent1.sinks.sink1.sink.rollInterval=86400  

agent1.sinks.sink1.sink.batchSize=100  

agent1.sinks.sink1.sink.serializer=text  

agent1.sinks.sink1.sink.serializer.appendNewline = false  

agent1.channels.channel1.type=file   

agent1.channels.channel1.checkpointDir=D:/log/checkpoint   

agent1.channels.channel1.dataDirs=D:/log/data  

啟動Flume(注:測試環境為windows)

flume-ng.cmd agent --conf ../conf/ --conf-file ../conf/flume-conf.properties -name agent1  

    <artifactId>log4j-flume-ng</artifactId>  

        <Flume name="eventLogger" compress="false">  

            <Agent host="127.0.0.1" port="41414" />  

            <RFC5424Layout enterpriseNumber="18060" includeMDC="true" appName="MyApp" />  

        </Flume>  

            <AppenderRef ref="eventLogger" />  

</Configuration>