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

最后可以看到日志已成功展示
总结:
部署过程中,还有很多坑,自己躺过就知道了。