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对我们的日志进行统计分析等。刚好可以解决我们上面的一些问题,流程图如下

log4net+Kafka+ELK日志系统

实施与部署:

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+Kafka+ELK日志系统

添加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();
        }
    }
}

log4net+Kafka+ELK日志系统

 打开地址 http://192.168.1.240:5601

log4net+Kafka+ELK日志系统

 最后可以看到日志已成功展示

总结:

部署过程中,还有很多坑,自己躺过就知道了。