亿级日志log4j2接入Kafka方案

背景描述

一个高访问量高并发高响应的系统,每天大概5~6亿的请求日志量,日志接入大数据平台,第一版使用的是Flume方式,后来因为需要基于日志做实时预警功能,故需要实时接入,采用log4j2 KafkaAppender接入Kafka消息队列的模式。

log4j2配置

 

<Kafka name="kafkaLog" topic="topic_request_log" ignoreExceptions="false">
    <PatternLayout pattern="[%-4level]_|_%d{YYYY-MM-dd HH:mm:ss}_|_%m_|_${sys:ip}"/>
    <Property name="bootstrap.servers">bigdata001.dns.org:9092,bigdata002.dns.org:9092</Property>
    <Property name="max.block.ms">2000</Property>
</Kafka>

<RollingFile name="failoverKafkaLog" fileName="../log/Service/failoverKafka/request.log"
            filePattern="../log/Service/failoverKafka/request.%d{yyyy-MM-dd}.log">
    <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
    <PatternLayout>
        <Pattern>[%-4level]_|_%d{YYYY-MM-dd HH:mm:ss}_|_%m_|_${sys:ip}%n</Pattern>
    </PatternLayout>
    <Policies>
        <TimeBasedTriggeringPolicy />
    </Policies>
</RollingFile>

<Failover name="Failover" primary="kafkaLog" retryIntervalSeconds="600">
    <Failovers>
        <AppenderRef ref="failoverKafkaLog"/>
    </Failovers>
</Failover>

<!--异步-->
<AsyncLogger name="kafkaLogger" level="INFO" additivity="false">
    <appender-ref ref="Failover"/>
</AsyncLogger>

注意点(坑点):

① 日志接入必须异步,绝对不能影响服务性能,

② 响应要求比较高的系统接入第三方系统,必须依赖解耦,此处的Failover Appender就是解耦对Kafka的依赖,当Kafka Crash时,日志触发Failover,写本地即可

③ log4j2 Failover appender retryIntervalSeconds的默认值是1分钟,是通过异常来切换的,所以可以适量加大间隔,比如上面的10分钟

④ Kafka appender ignoreExceptions 必须设置为false,否则无法触发Failover

⑤ 这里有个比较大的坑是max.block.ms Property,KafkaClient包里默认值是60000ms,当Kafka宕机时,尝试写Kafka需要1分钟才能返回Exception,之后才会触发Failover,当请求量大时,log4j2 队列很快就会打满,之后写日志就Blocking,严重影响到主服务响应。所以要设置足够短,队列长度足够长。

⑥ log4j2异步设置详细参考:log4j2异步注意事项

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值