如何在普通应用程序实时收集日志
所谓的普通程序就是web项目的或者非web项目的的程序,大部分都是单机版本的。
大多数时候,我们的log都会输出到本地的磁盘上,排查问题也是使用Linux命令来搞定,如果web程序组成负载集群,那么就有多台机器,如果有几十台机器,几十个服务,那么想快速定位log问题和排查就比较麻烦了,所以很有必要有一个统一的平台管理log,现在大多数公司的套路都是收集重要应用的log集中到kafka中,然后在分别导入到es和hdfs上,一个做实时检索分析,另一个做离线统计和数据备份。
如何能快速收集应用日志到kafka中?
方法一:
kafka官网已经提供了非常方便的log4j的集成包 kafka-log4j-appender,我们只需要简单配置log4j文件,就能收集应用程序log到kafka中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| 1#log4j.rootLogger=WARN,console,kafka
2log4j.rootLogger=INFO,console
3
4# for package com.demo.kafka, log would be sent to kafka appender.
5#log4j.logger.com.bigdata.xuele.streaming.SparkStreamingKmd*=info,kafka
6# appender kafka
7log4j.appender.kafka=kafka.producer.KafkaLog4jAppender
8log4j.appender.kafka.topic=${kafka.log.topic}
9# multiple brokers are separated by comma ",".
10log4j.appender.kafka.brokerList=${kafka.log.brokers}
11log4j.appender.kafka.compressionType=none
12log4j.appender.kafka.syncSend=false
13log4j.appender.kafka.layout=org.apache.log4j.PatternLayout
14#log4j.appender.kafka.layout.ConversionPattern=%d [%-5p] [%t] - [%l] %m%n
15log4j.appender.kafka.layout.ConversionPattern=[%d] %p %m (%c)%n
16
17# appender console
18log4j.appender.console=org.apache.log4j.ConsoleAppender
19log4j.appender.console.target=System.out
20log4j.appender.console.layout=org.apache.log4j.PatternLayout
21#log4j.appender.console.layout.ConversionPattern=%d [%-5p] [%t] - [%l] %m%n
22log4j.appender.console.layout.ConversionPattern=[%d] [%p] [%t] %m%n
23
24log4j.logger.org.eclipse.jetty=WARN
25log4j.logger.org.eclipse.jetty.util.component.AbstractLifeCycle=ERROR
26log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO
27log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO
28 |
1 2 3 4 5 6
| 1<dependency>
2 <groupId>org.apache.kafka</groupId>
3 <artifactId>kafka-clients</artifactId>
4 <version>0.8.2.1</version>
5 </dependency>
6 |
1 2
| 1 非常简单,一个maven依赖加一个log4j配置文件即可,如果依然想写入log到本地 文件依然也是可以的,这种方式最简单快速,但是默认的的log日志是一行一行的纯文本,有些场景下我们可能需要json格式的数据。
2 |
方法二:
重写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