ELK日志系统设计方案-Log4j日志直推Kafka
Posted niaonao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ELK日志系统设计方案-Log4j日志直推Kafka相关的知识,希望对你有一定的参考价值。
ELK 日志系统的常见解决方案:
通常的产品或项目部署至服务器,服务一般会打印日志便于线上问题跟踪。
使用 Log4j 中的自定义 Appender,将服务运行打印的日志直接推送到 Kafka 中。经由 Logstash 消费 Kafka 生产的数据,进行加工过滤后输出到 ElasticSearch 进行日志数据的存储与全文检索。使用 Kibana 对日志数据进行可视化操作。
1. 单点日志系统设计
- 相对于 Filebeat 日志收集后输出到 Kafka 的方案,需要服务器存储日志文件。当随着业务复杂性上升,单日日志量也会较大,存储历史日志将占用服务器内存,且不便管理。
- 使用自定义 Appender 直接打印日志上报 Kafka,去掉了 Filebeat 日志收集,并解决了日志文件存储空间占用的问题。不过也存在因网络传输等原因造成日志丢失的风险。
2. 自定义Appender打包说明
- 应用场景
应用于 ELK 日志直推 Kafka 设计场景,自定义 Appender 项目开发打Jar包如下
log-system-util-1.0-SNAPSHOT-jar-with-dependencies.jar
- 功能设计
项目打印日志,通过 log4j 将日志信息推送到 Kafka;
作为日志服务器监测对接应用存活状态,心跳监测或轮询监测; - 本地开发自定义 Appender 项目
实现 Appender 打印日志上报指定 Kafka 服务,项目本地打 jar 包,已供多应用对接此工具 - 安装 jar 包到 maven 仓库
mvn install:install-file
-Dfile=C:\\Users\\Zxy\\Desktop\\CODE\\log-system-util-1.0-SNAPSHOT-jar-with-dependencies.jar
-DgroupId=cn.nascent -DartifactId=log-system-util
-Dversion=1.0 -Dpackaging=jar
当出现BUILD SUCCESS 时就说明安装成功
命令说明
(1)-Dfile jar包所在路径,需要包含jar包名.例如:xx/xx/xx/**.jar
(2)-DgroupId 指定导入jar时的groupid,可以自定义,cn.nascent就是自定义的
(3)-DartifactId指定导入jar时的artifactId,可以自定义,log-system-util就是自定义的
(4)-Dversion 指定导入jar时的版本号,可以自定义。这里的1.0就是自定义的
(5)-Dpackaging 指定文件类型 ,由于这里是jar包的形式,所以这里得是jar
- 引入依赖
pers.niaonao 、 log-system-util 、 1.0.0 就是安装jar包时指定的参数
<dependency>
<groupId>pers.niaonao</groupId>
<artifactId>log-system-util</artifactId>
<version>1.0.0</version>
</dependency>
- 修改log4j.properties配置文件
#输出到kafka
log4j.logger.pers.niaonao=INFO,KAFKA
# appender KAFKA
log4j.appender.KAFKA=pers.niaonao.kafka.KafkaLog4jAppender
3. 使用示例
package pers.niaonao;
import org.apache.log4j.Logger;
public class MyAppender
private static Logger LOGGER = Logger.getLogger(MyAppender.class);
public static void main(String[] args) throws InterruptedException
int times = 16;
String mess = "Test My Appender";
String sendMess = null;
for (int i = 0; i < times; i++)
sendMess = mess + "=======>" + i;
MyAppender.LOGGER.info(sendMess);
Thread.sleep(300);
注意
(1) 不可以将 Kafka 定义到 rootLogger 中,这会造成程序的卡顿。因此需要另外定义一个 rootLogger。
(2) log4j.logger.后,=之前的的必须是你的包名。当你指定了这个包名之后,那么在这个包下的类产生的日志才会通过下面定义的appender 输送到 kafka 中。
(3) log4j.appender.KAFKA 这条配置,会在LogManager 类加载时,作为一个 appender 添加到以 log4j.logger 后面跟的包名为名的 logger 中去。之后这个包下的类获取 Logger 时会在类 Hierarchy.class 中的 updateParents 方法中将配置文件中的 appender 添加到在类中获取的 logger(Logger.getLogger(xx.class)) 中。
参考文章
ELK日志系统设计方案-Filebeat日志收集推送Kafka
ELK日志系统设计方案-Log4j日志直推Kafka
ELK日志系统设计方案-集群扩展
ELK日志系统部署实现
Powered By niaonao
以上是关于ELK日志系统设计方案-Log4j日志直推Kafka的主要内容,如果未能解决你的问题,请参考以下文章