(三)、log4j2使用原理及相关参数配置说明

如有看不懂的地方可以先看本人之前发表的(一)、log4j/、(二)、logback + slf4j



先上log4j2.xml参数说明:
<?xml version="1.0" encoding="UTF-8"?>
<!-- status:日志打印级别,开发期可以设置为debug,生产上改为info -->
<!-- monitorInterval:含义是每隔5秒重新读取配置文件,可以不重启应用的情况下修改配置 -->
<Configuration status="info" monitorInterval="5">

    <!-- 定义两个常量 -->
    <properties>
        <property name="LOG_HOME">logs</property>
        <property name="FILE_NAME">mylog</property>
    </properties>

    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] - {%l} %logger{36} - %msg%n" />
        </Console>

    <!-- fileName:指定当前日志文件的位置和文件名称
         filePattern:指定当发生Rolling时,文件的转移和重命名规则-->
        <RollingRandomAccessFile name="File" fileName="${LOG_HOME}/${FILE_NAME}.log" filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log">
            <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss} [%t] - {%l} %logger{36} - %msg%n" />
            <Policies>
                <!-- TimeBasedTriggeringPolicy:这个配置需要和filePattern结合使用:
                        filePattern中配置的文件重命名规则是${FILE_NAME}-%d{yyyy-MM-dd HH-mm}-%i,最小的时间粒度是mm,即分钟,TimeBasedTriggeringPolicy指定的size1,结合起来就是每1分钟生成一个新文件。
                        如果改成%d{yyyy-MM-dd HH},最小粒度为小时,则每一个小时生成一个文件。 -->
                <TimeBasedTriggeringPolicy interval="1" />
                <!-- SizeBasedTriggeringPolicy:指定当文件体积大于size指定的值时,触发Rolling -->
                <SizeBasedTriggeringPolicy size="10 MB" />
            </Policies>
            <!--DefaultRolloverStrategy:指定最多保存的文件个数-->
            <DefaultRolloverStrategy max="20" />
        </RollingRandomAccessFile>
    </Appenders>

    <!-- Logger -->
    <Loggers>
        <Logger name="mylog" level="trace" additivity="false">
            <AppenderRef ref="Console" />
            <!--<AppenderRef ref="File"/>-->
        </Logger>
        <Root level="info">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

  • PatternLayout含义:
%d{HH:mm:ss.SSS} 表示输出到毫秒的时间
%t 输出当前线程名称
%-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
%logger 输出logger名称,因为Root Logger没有名称,所以没有输出
%msg 日志文本
%n 换行
其他常用的占位符有:
%F 输出所在的类文件名,如Client.java
%L 输出行号
%M 输出所在方法名
%l  输出语句所在的行数, 包括类名、方法名、文件名、行数
最后是Logger的配置,这里只配置了一个Root Logger。

  • Filter:按日志级别区分文件输出
有些人习惯按日志信息级别输出到不同名称的文件中,如info.log,error.log,warn.log等,在log4j2中可通过配置Filters来实现。
假定需求是把INFO及以下级别的信息输出到info.log,WARN和ERROR级别的信息输出到error.log,FATAL级别输出到fatal.log,配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<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>
        <!-- info.log -->
        <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>
        <!-- error.log -->
        <RollingRandomAccessFile name="ErrorFile" fileName="${LOG_HOME}/error.log" filePattern="${LOG_HOME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
            <Filters>
                <ThresholdFilter level="fatal" onMatch="DENY" onMismatch="NEUTRAL" />
                <ThresholdFilter level="warn" 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>
        <!-- fatal.log -->
        <RollingRandomAccessFile name="FatalFile" fileName="${LOG_HOME}/fatal.log" filePattern="${LOG_HOME}/$${date:yyyy-MM}/fatal-%d{yyyy-MM-dd}-%i.log">
            <Filters>
                <ThresholdFilter level="fatal" 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>
    </Appenders>

    <Loggers>
        <Root level="trace">
            <AppenderRef ref="Console" />
            <AppenderRef ref="InfoFile" />
            <AppenderRef ref="ErrorFile" />
            <AppenderRef ref="FatalFile" />
        </Root>
    </Loggers>
</Configuration>

  • 异步输出日志:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="300">
    <properties>
        <property name="LOG_HOME">D:/logs</property>
        <property name="FILE_NAME">mylog</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="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" />
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" />
                <SizeBasedTriggeringPolicy size="10 MB" />
            </Policies>
            <DefaultRolloverStrategy max="20" />
        </RollingRandomAccessFile>
        <!-- 异步输出日志 -->
        <Async name="Async">
            <AppenderRef ref="MyFile" />
        </Async>
    </Appenders>

    <Loggers>
        <Logger name="asynclog" level="trace" additivity="false" >
            <AppenderRef ref="Async" />
        </Logger>
        <Root level="error">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

下面两条输出方式本人未进过实践测试,如有此方面需求人士可以照此进行配置,如有不足之处欢迎反馈。
  • *输出到 MongoDB:
    • 需要添加依赖:
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-nosql</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongo-java-driver</artifactId>
            <version>3.2.2</version>
        </dependency>
    • log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="300">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>

        <NoSql name="databaseAppender">
            <MongoDb databaseName="test" collectionName="errorlog" server="localhost" port="27017" />
        </NoSql>
    </Appenders>

    <Loggers>
        <Logger name="mongolog" level="trace" additivity="false">
            <AppenderRef ref="databaseAppender" />
        </Logger>
        <Root level="error">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

  • *输出到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
    • 添加依赖:
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-flume-ng</artifactId>
            <version>2.5</version>
        </dependency>
    • log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="300">
    <Appenders>
        <Flume name="eventLogger" compress="false">
            <Agent host="127.0.0.1" port="41414" />
            <RFC5424Layout enterpriseNumber="18060" includeMDC="true" appName="MyApp" />
        </Flume>
    </Appenders>
    <Loggers>
        <Root level="trace">
            <AppenderRef ref="eventLogger" />
        </Root>
    </Loggers>
</Configuration>

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值