log4net+Kafka+ELK日志系统
日志是每个系统最为头疼的地方,杂乱,还多,没有还不行,想管理好的话,得经得起考验,要解决的问题总结如下:
(1)高并发
(2)高吞吐量
(3)支持分布式集群
(4)检索要快
简介:
1.Zoomkeeper
Kafka的通道
2. Kafka
Kafka主要是解决大量日志的处理的分布式发布订阅消息系统,拥有高吞吐量,相比Redis而言,可能存在数据丢失的情况,速度更快,仅支持topic模式,更适合做日志系统
3.Logstash
Logstash是一个写入工具,可以说是一个桥梁,实现将kafka的consumer端和Elasticsearch数据连通有很大作用,另外也可以将文件写入到Elasticsearch中,还可以将历史的日志也转存到Elasticsearch中,还是个多功能的工具,官方最新版本中已经默认支持了对Kafka和Elasticsearch的配置
4.Elasticsearch
Elasticsearch是可以分布式集群部署的全文搜索引擎服务器(NoSQL数据存储),既拥有Lucene的全文检索功能,同时还能进行分布式储存,检索速度快,与Hadoop联合作数据分析,稳健性高,可以在一个集群宕机后,使用备用集群,一样可以工作,缺点:需要足够的内存和CPU资源
5.Kibana
Kibana主要用于对Elasticsearch数据的展示和分析
方案:
我们可以增加一个log4net kafkaappender 日志生产者通过这个appender将日志写入kafka,由于kafka批量提交、压缩的特性,因此对我们的应用服务器性能的开支很小。日志消费者端使用logstash订阅kafka中的消息,传送到elasticsearch中,通过kibana展示给我们。同时我们也可以通过kibana对我们的日志进行统计分析等。刚好可以解决我们上面的一些问题,流程图如下
实施与部署:
1.安装Java SDK
下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
环境变量如下:
classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
JAVA_HOME=D:\Java\jdk1.8.0_202
Path += %JAVA_HOME%\bin
Java命令:
Java -version
Javac -version
注意:由于Elasticsearch要求Java SDK版本较高,所有要装JDK8级以上版本
2.安装kafka
下载地址:http://kafka.apache.org/downloads
安装Zookeeper windows服务
1、先解压好nssm这软件,然后进入 D:\nssm-2.24\win64> 2、.\nssm install 会弹出一个nssm service installer 3、application path :D:\kafka_2.11-1.1.1\bin\windows\zookeeper-server-start.bat4、startup directory : D:\kafka_2.11-1.1.1\bin\windows 上面选择后会自动选择出来5、服务名称Zookeeper
安装Kafka windows服务
1、先解压好nssm这软件,然后进入 D:\nssm-2.24\win64> 2、.\nssm install 会弹出一个nssm service installer 3、application path :D:\kafka_2.11-1.1.1\bin\windows\kafka-server-start.bat 4、startup directory : D:\kafka_2.11-1.1.1\bin\windows 上面选择后会自动选择出来 5、Arguments: D:\kafka_2.11-1.0.1\config\server.properties6、Dependencies:Zookeeper 7、服务名称kafka
注意:由于最新的kafka中已经内置了Zookeeper,所以不用再去单独下载
安装Logstash
下载地址:https://www.elastic.co/cn/downloads/past-releases/logstash-6-7-1
安装为windows服务
1、先解压好nssm这软件,然后进入 D:\nssm-2.24\win64> 2、.\nssm install 会弹出一个nssm service installer 3、application path :D:\Logstash\logstash-6.7.1\bin\logstash.bat4、startup directory :D:\Logstash\logstash-6.7.1\bin5、服务名称Logstash
打开解压目录下logstash.conf文件,配置如下:
input { kafka { bootstrap_servers => ["192.168.1.240:9092"] group_id => "logstash" auto_offset_reset => "latest" topics => ["test"] #codec => plain{ charset => "GBK" } consumer_threads => 5 decorate_events => true } } filter { } output { elasticsearch { hosts => ["http://127.0.0.1:9200"] index => "chienkun_log" codec => plain { charset => "UTF-16BE" } } }
注意:bootstrap_servers 为kafka地址,需要在Kafka配置文件server.properties中将advertised.listeners=PLAINTEXT://192.168.1.240:9092,另外,编码方式考虑到会有中文,要使用UTF-16BE编码,以防乱码
安装Elasticsearch
下载地址:https://www.elastic.co/cn/downloads/past-releases/elasticsearch-6-7-1
安装为windows服务
1、先解压好nssm这软件,然后进入 D:\nssm-2.24\win64> 2、.\nssm install 会弹出一个nssm service installer 3、application path :D:\Elasticsearch\elasticsearch-6.7.1\bin\elasticsearch-service.bat 4、startup directory :D:\Elasticsearch\elasticsearch-6.7.1\bin 5、服务名称Elasticsearch
打开配置文件elasticsearch.yml,增加如下配置:
# 禁用机器学习 xpack.ml.enabled: false
安装Kibana
下载地址:https://www.elastic.co/cn/downloads/past-releases/kibana-6-7-1
安装为windows服务
1、先解压好nssm这软件,然后进入 D:\nssm-2.24\win64> 2、.\nssm install 会弹出一个nssm service installer 3、application path :D:\kibana\kibana-6.7.1-windows-x86_64\bin\kibana.bat 4、startup directory :D:\kibana\kibana-6.7.1-windows-x86_64\bin 5、服务名称Kibana
打开配置文件Kibana.yml,修改配置如下
i18n.locale: "zh-CN"
log4net
解决方案右键->管理解决方案的NuGet程序包,搜索log4net.Kafka.Appender,然后安装到解决方案中
添加log4net配置文件log4net.config,添加配置如下
<log4net> <appender name="KafkaAppender" type="log4net.Kafka.KafkaAppender, log4net.Kafka"> <KafkaSettings> <brokers> <add value="192.168.1.240:9092" /> </brokers> <topic type="log4net.Layout.PatternLayout"> <conversionPattern value="kafka.logstash.DEBUG" /> </topic> <partition type="log4net.Layout.PatternLayout"> <conversionPattern value="kafka.logstash.DEBUG" /> </partition> <configurations> <add key="HashPartitionEnabled" value="true" /> <add key="MaxPartition" value="100" /> </configurations> </KafkaSettings> <layout type="log4net.Kafka.LogstashLayout,log4net.Kafka" > <app value="erp.logs" /> </layout> </appender> <root> <level value="DEBUG"/> <appender-ref ref="KafkaAppender" /> </root> </log4net>
打开Global.asax,在Application_Start中添加如下代码
log4net.Config.XmlConfigurator.Configure(new FileInfo("log4net.config"));
测试:
namespace ConsoleApp1 { class Program { static void Main(string[] args) { ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); GlobalContext.Properties["component"] = "send"; for (int i = 0; i < 100; i++) { Thread thread = new Thread(new ThreadStart(() => { try { while (true) { string name = "我的消息," + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); Console.WriteLine("这是" + Thread.CurrentThread.Name + "发送的消息:" + name); logger.Debug(name); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); return; } })) { Name = "线程:" + i, IsBackground = true }; thread.Start(); } Console.ReadKey(); } } }
打开地址 http://192.168.1.240:5601
最后可以看到日志已成功展示
总结:
部署过程中,还有很多坑,自己躺过就知道了。