上一篇(
http://qindongliang.iteye.com/blog/2354381 )写了收集sparkstreaming的日志进入kafka便于后续收集到es中快速统计分析,今天就再写一篇如何在普通应用程序实时收集日志,上一篇写的毕竟是分布式环境下的操作,有一定的特殊性,如MapReduce,Spark运行的日志和普通项目的日志是不太一样的。
所谓的普通程序就是web项目的或者非web项目的的程序,大部分都是单机版本的。
大多数时候,我们的log都会输出到本地的磁盘上,排查问题也是使用Linux命令来搞定,如果web程序组成负载集群,那么就有多台机器,如果有几十台机器,几十个服务,那么想快速定位log问题和排查就比较麻烦了,所以很有必要有一个统一的平台管理log,现在大多数公司的套路都是收集重要应用的log集中到kafka中,然后在分别导入到es和hdfs上,一个做实时检索分析,另一个做离线统计和数据备份。
如何能快速收集应用日志到kafka中?
方法一:
kafka官网已经提供了非常方便的log4j的集成包 kafka-log4j-appender,我们只需要简单配置log4j文件,就能收集应用程序log到kafka中。
#log4j.rootLogger=WARN,console,kafka
log4j.rootLogger=INFO,console
# for package com.demo.kafka, log would be sent to kafka appender.
#log4j.logger.com.bigdata.xuele.streaming.SparkStreamingKmd*=info,kafka
# appender kafka
log4j.appender.kafka=kafka.producer.KafkaLog4jAppender
log4j.appender.kafka.topic=${kafka.log.topic}
# multiple brokers are separated by comma ",".
log4j.appender.kafka.brokerList=${kafka.log.brokers}
log4j.appender.kafka.compressionType=none
log4j.appender.kafka.syncSend=false
log4j.appender.kafka.layout=org.apache.log4j.PatternLayout
#log4j.appender.kafka.layout.ConversionPattern=%d [%-5p] [%t] - [%l] %m%n
log4j.appender.kafka.layout.ConversionPattern=[%d] %p %m (%c)%n
# appender console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
#log4j.appender.console.layout.ConversionPattern=%d [%-5p] [%t] - [%l] %m%n
log4j.appender.console.layout.ConversionPattern=[%d] [%p] [%t] %m%n
log4j.logger.org.eclipse.jetty=WARN
log4j.logger.org.eclipse.jetty.util.component.AbstractLifeCycle=ERROR
log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO
注意,需要引入maven的依赖包:
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>0.8.2.1</version>
</dependency>
非常简单,一个maven依赖加一个log4j配置文件即可,如果依然想写入log到本地 文件依然也是可以的,这种方式最简单快速,但是默认的的log日志是一行一行的纯文本,有些场景下我们可能需要json格式的数据。
方法二:
重写Log4jAppender,自定义输出格式,支持json格式,如果是json格式的数据打入到kafka中,后续收集程序可能就非常方便了,直接拿到json就能入到MongoDB或者es中,如果打入到kafka中的数据是纯文本,那么收集程序,可能需要做一些etl,解析其中的一些字段然后再入到es中,所以原生的输出格式,可能稍不灵活,这样就需要我们自己写一些类,然后达到灵活的程度,github连接:
https://github.com/qindongliang/log_to_kafka
感兴趣的朋友可以看下。
总结:
(1)方法一简单快速,不支持json格式的输出,打到kafka的消息都是原样的log日志信息
(2)方法二稍微复杂,需要自己扩展log收集类,但支持json格式的数据输出,对于想落地json数据直接到存储系统中是非常适合的。
此外需要注意,在调试的时候log发送数据到kafka模式最好是同步模式的否则你控制台打印的数据很有可能不会被收集kafka中,程序就停止了。生产环境最好开启异步发送数据模式,因为内部是批量的处理,所以能提升吞吐,但有一定的轻微延迟。
官网log4j-appender的源码:
https://github.com/apache/kafka/tree/trunk/log4j-appender/src/test/java/org/apache/kafka/log4jappender
有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。
技术债不能欠,健康债更不能欠, 求道之路,与君同行。
分享到:
相关推荐
通过引入KafkaAppender,我们可以将Log4j的日志输出直接发送到Kafka的特定主题。这样,所有应用的日志都会被统一收集,无需关心具体的应用服务器。 在配置Log4j时,我们需要设置KafkaAppender的相关属性,包括Kafka...
- 生产者通过网络连接到Kafka集群中的Broker,然后选择一个主题并将消息发送到该主题。 - 生产者可以选择消息发送到主题中的哪个分区,也可以让Kafka自动选择分区。 2. **Broker接收消息:** - Broker接收到消息...
4. 日志聚合:从多个服务中收集日志,并将日志数据发送到中央日志服务中。 5. 流处理:Kafka可以作为流处理平台,结合其他工具如Apache Storm或Apache Flink进行实时分析。 6. 事件源:作为事件驱动架构的中心,存储...
1. **生产者和消费者模拟**:你可以使用它来发送消息到Kafka主题,或者从主题中消费消息,这对于测试和调试Kafka集群非常有用。 2. **主题管理**:创建、删除、修改主题配置,以及检查主题元数据,如分区信息、ISR...
- 编写一个KafkaSink类,用于将Flume收集的数据发送到Kafka中。 - 引入必要的pom.xml依赖,并使用 `mvn package` 命令打包JAR文件,放入Flume的lib目录下。 3. **编写Storm代码:** - 开发一个Storm拓扑,该拓扑...
生产者负责创建和发送消息到主题,消费者则从主题中消费消息。主题是逻辑上的分类,而分区是物理上的存储单位,每个分区都有一个唯一的顺序号,并且保证消息的有序性。 在Java中使用Kafka,首先需要引入相关的依赖...
1. **日志收集**:Kafka可以作为日志收集系统,将各种应用的日志数据汇聚到一起,便于统一分析和处理。 2. **实时处理**:结合Kafka Streams或Spark Streaming,实现数据的实时清洗、聚合和计算。 3. **微服务间...
1. 实时性:日志数据可以实时地发送到Kafka,避免了日志堆积,提高了问题的响应速度。 2. 可扩展性:Kafka的分布式特性使得系统能够处理大量并发的日志数据,且易于横向扩展。 3. 分析友好:日志数据在Kafka中可被...
1. 日志收集:Kafka常用于收集应用程序的日志数据,提供统一的日志管理平台。 2. 流处理:作为实时数据流处理平台,Kafka与Spark、Flink等流处理引擎配合,实现实时分析和决策。 3. 消息队列:替代传统的消息...
2. **日志收集**:Kafka可以作为一个集中的日志收集系统,统一收集来自不同源的日志数据。 3. **消息队列**:Kafka可以作为一种高性能的消息队列解决方案,替代传统的消息中间件如RabbitMQ、ActiveMQ等。 4. **事件...
消息在Kafka中的发送流程是:生产者根据指定的分区策略将消息发布到指定主题的某个分区,Kafka集群接收消息后将其持久化到硬盘上,并保留消息指定时长。消费者从Kafka集群中拉取数据,并控制获取消息的偏移量。 ...
前端线程负责将用户要执行的操作转换成对应的请求,然后再将请求发送到后端 I/O 线程的队列中;而后端 I/O 线程从队列中读取相应的请求,然后发送到对应的 Broker 节点上,之后把执行结果保存起来,以便等待前端线程...
- **日志收集**:Kafka常用于收集应用程序的日志数据,提供统一的入口进行分析和存储。 - **流处理**:结合Spark Streaming或Flink等流处理框架,实现数据的实时分析和处理。 - **消息传递**:作为企业级消息系统...
NLog.Kafka是一个开源项目,将NLog,一个流行的.NET日志框架,与Apache Kafka集成,使得应用程序的日志能够被高效地发送到Kafka消息队列中。这个项目的主要目标是提供一种简单的方法,以便开发者可以利用NLog的灵活...
Kafka还广泛应用于日志聚合场景,可以将来自不同服务器的日志信息统一收集、处理,并提供给下游系统分析和监控使用。 #### 三、设计原理 **1、持久性** Kafka采用了独特的日志存储方式来实现数据的持久化。数据以...
- **日志收集**:Kafka可以作为集中式日志收集平台,将分散在各个服务器上的日志数据统一收集并转发至日志分析系统。 - **消息队列**:Kafka作为一种消息队列系统,能够实现消息的异步传递,降低系统间的耦合度。 - ...
- **日志收集**: Kafka可以作为统一的日志收集平台。 - **流处理**: Kafka可以与其他流处理框架结合使用,如Apache Storm或Apache Flink。 - **消息传递**: Kafka可以用于实现传统的消息队列功能。 #### 六、总结 ...
1. **日志收集**:Kafka常用于收集分布式系统的日志,统一管理和分析。 2. **流处理**:结合Apache Storm或Spark Streaming进行实时数据处理。 3. **事件源**:作为微服务架构中的事件源,提供解耦和异步通信。 4...
在实时日志分析系统中,Flume 负责从各个服务器或应用中收集日志数据,然后将这些数据发送到 Kafka 队列。 3. **Kafka**: Apache Kafka 是一个高吞吐量的分布式消息队列系统,可以作为数据管道,将数据从生产者(如...
- **日志收集**:通过Egg-kafka-node插件,将应用产生的日志实时发送到Kafka,再由其他服务进行收集和分析。 - **消息中间件**:作为消息中间件,连接不同的微服务,实现服务间的数据交换,提高系统的解耦度。 **...