之前是使用NLog直接将日志发送到了ELK,本篇将会使用Docker搭建ELK和kafka,同时替换NLog为Log4net。

一.搭建kafka

1.拉取镜像

//下载zookeeper
docker pull wurstmeister/zookeeper //下载kafka
docker pull wurstmeister/kafka:2.11-0.11.0.3

2.启动

//启动zookeeper
docker run -d --name zookeeper --publish : --volume /etc/localtime:/etc/localtime wurstmeister/zookeeper //启动kafka
docker run -d --name kafka --publish : \
--link zookeeper \
--env KAFKA_ZOOKEEPER_CONNECT=192.168.3.131: \
--env KAFKA_ADVERTISED_HOST_NAME=192.168.3.131 \
--env KAFKA_ADVERTISED_PORT= \
--volume /etc/localtime:/etc/localtime \
wurstmeister/kafka:2.11-0.11.0.3

3.测试Kafka

//查看Kafka容器ID
docker ps 进入容器
docker exec -it [容器ID] bin/bash //创建topic
bin/kafka-topics.sh --create --zookeeper 192.168.3.131: --replication-factor --partitions --topic mykafka //查看topic
bin/kafka-topics.sh --list --zookeeper 192.168.3.131: //创建生产者
bin/kafka-console-producer.sh --broker-list 192.168.3.131: --topic mykafka //再开一个客户端进入容器
//创建消费者
bin/kafka-console-consumer.sh --zookeeper 192.168.3.131: --topic mykafka --from-beginning

再生产端发送消息,消费端可以成功接收到就说明没问题。

二.Docker安装ELK

.拉取镜像
docker pull sebp/elk .启动ELK
docker run -p : -p : -p : -p : -e ES_MIN_MEM=128m -e ES_MAX_MEM=2048m -d --name elk sebp/elk //若启动过程出错一般是因为elasticsearch用户拥有的内存权限太小,至少需要262144
切换到root用户 执行命令: sysctl -w vm.max_map_count= 查看结果: sysctl -a|grep vm.max_map_count 显示: vm.max_map_count = 上述方法修改之后,如果重启虚拟机将失效,所以: 解决办法: 在 /etc/sysctl.conf文件最后添加一行 vm.max_map_count= 即可永久修改

等几十秒,然后访问9200和5601端口就可以看到ELK相关的面板。

然后我们还需要配置下logstash:

.查看elk容器ID
docker ps .进入elk容器
docker exec -it 容器ID bin/bash .执行命令
/opt/logstash/bin/logstash -e 'input { stdin { } } output { elasticsearch { hosts => ["localhost"] } }'

当命令成功被执行后,看到:Successfully started Logstash API endpoint {:port=>9600} 信息后,输入:this is a dummy entry 然后回车,模拟一条日志进行测试。

打开浏览器,输入:http://:9200/_search?pretty 如图,就会看到我们刚刚输入的日志内容。

注意:如果看到这样的报错信息 Logstash could not be started because there is already another instance using the configured data directory. If you wish to run multiple instances, you must change the "path.data" setting. 请执行命令:service logstash stop 然后在执行就可以了。

OK,测试没问题的话,说明Logstash和ES之间是可以正常联通,然后我们需要配置Logstash从Kafka消费消息:

.找到config文件
cd /opt/logstash/config .编辑配置文件
vi logstash.config
input {
kafka{
bootstrap_servers =>["192.168.3.131:9092"]
client_id => "test" group_id => "test"
consumer_threads =>
decorate_events => true
topics => "mi"
}
}
filter{
json{
source => "message"
}
} output {
elasticsearch {
hosts => ["localhost"]
index => "mi-%{app_id}"
codec => "json"
}
}

bootstrap_servers:Kafka地址

这里介绍下这个app_id的作用,生产场景下我们根据不同的项目生成不同的ES索引,比如服务是一个单独的索引,Web是一个,MQ是一个,这些就可以通过传入的app_id来区分创建。

配置完成后加载该配置:

/opt/logstash/bin/logstash -f  /opt/logstash/config/logstash.conf

没问题的话,此时Logstash就会从Kafka消费数据了,然后我们新建一个.net core API项目测试一下:

1.通过NuGet引用 Microsoft.Extensions.Logging.Log4Net.AspNetCore;

2.启动文件中注入 Log4Net:

public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureLogging((logging) =>
{
// 过滤掉 System 和 Microsoft 开头的命名空间下的组件产生的警告级别以下的日志
logging.AddFilter("System", LogLevel.Warning);
logging.AddFilter("Microsoft", LogLevel.Warning);
logging.AddLog4Net();
})
.UseStartup<Startup>()
.Build();

3.根目录下添加 log4net.config,设置为 “如果较新则复制”

appender 支持自定义,只要符合 appender 定义规则即可,这里我使用了公司同事大佬写的一个将日志写入 Kafka 的 Nuget 包, log4net.Kafka.Core,安装后在 log4net.config 添加 KafkaAppender 配置即可。log4net.Kafka.Core 源码 在 github 上 ,可以 Fork 自行修改。
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<appender name="KafkaAppender" type="log4net.Kafka.Core.KafkaAppender, log4net.Kafka.Core">
<KafkaSettings>
<broker value="192.168.3.131:9092" />
<topic value="mi" />
</KafkaSettings>
<layout type="log4net.Kafka.Core.KafkaLogLayout,log4net.Kafka.Core" >
<appid value="api-test" />
</layout>
</appender>
<root>
<level value="ALL"/>
<appender-ref ref="KafkaAppender" />
</root>
</log4net>
broker: Kafka 服务地址,集群可使用,分割;
topic:日志对应的 Topic 名称;
appid:服务唯一标识,辅助识别日志来源;
 
在 ValuesController 修改代码进行测试:
    [Route("api/[controller]")]
public class ValuesController : Controller
{
private readonly ILogger _logger; public ValuesController(ILogger<ValuesController> logger)
{
_logger = logger;
} // GET api/values
[HttpGet]
public IEnumerable<string> Get()
{
_logger.LogInformation("根据appId最后一次测试Kafka!");
return new string[] { "value1", "value2" };
}
}

OK,运行然后访问5601端口查看:

 OK,搭建成功!
 
 
参考文章:

.Net Core 商城微服务项目系列(十三):搭建Log4net+ELK+Kafka日志框架的更多相关文章

  1. .Net Core 商城微服务项目系列(一):使用IdentityServer4构建基础登录验证

    这里第一次搭建,所以IdentityServer端比较简单,后期再进行完善. 1.新建API项目MI.Service.Identity,NuGet引用IdentityServer4,添加类InMemo ...

  2. .Net Core 商城微服务项目系列(十四):分布式部署携程Apollo构建配置中心

    一.开场白 在系统设计里我们有很多配置希望独立于系统之外,而又能够被系统实时读取.但是在传统的系统设计里,配置信息通常是耦合在系统内的,比如.net里通常会放在App.config或者web.conf ...

  3. .Net Core 商城微服务项目系列(六):搭建自己的Nuget包服务器

    当我们使用微服务架构之后,紧接而来的问题便是服务之间的程序集引用问题,可能没接触过的同学不太理解这句话,都已经微服务化了为什么还要互相引用程序集,当然可以不引用.但是我们会有这样一种情况,我们的每个接 ...

  4. .Net Core 商城微服务项目系列(七):使用消息队列(RabbitMQ)实现服务异步通信

    RabbitMQ是什么,怎么使用我就不介绍了,大家可以到园子里搜一下教程.本篇的重点在于实现服务与服务之间的异步通信. 首先说一下为什么要使用消息队列来实现服务通信:1.提高接口并发能力.  2.保证 ...

  5. .Net Core 商城微服务项目系列(十二):使用k8s部署商城服务

    一.简介 本篇我们将会把商城的服务部署到k8s中,同时变化的还有以下两个地方: 1.不再使用Consul做服务的注册和发现,转而使用k8s-dns来实现. 2.不再使用Ocelot作为业务网关,使用T ...

  6. .Net Core 商城微服务项目系列(五):使用Polly处理服务错误

    项目进行微服务化之后,随之而来的问题就是服务调用过程中发生错误.超时等问题的时候我们该怎么处理,比如因为网络的瞬时问题导致服务超时,这在我本人所在公司的项目里是很常见的问题,当发生请求超时问题的时候, ...

  7. .Net Core 商城微服务项目系列(八):购物车

    最近加班有点多,一周五天,四天加班到11点+,心很累.原因是我当前在的这个组比较特殊,相当于业务的架构组,要为其它的开发组提供服务和监控.所以最近更新的也少,不过这个元旦三天假应该会更新三篇. 这篇是 ...

  8. .Net Core 商城微服务项目系列(十):使用SkyWalking构建调用链监控(2019-02-13 13:25)

    SkyWalking的安装和简单使用已经在前面一篇介绍过了,本篇我们将在商城中添加SkyWalking构建调用链监控. 顺带一下怎么把ES设置为Windows服务,cd到ES的bin文件夹,运行ela ...

  9. .Net Core 商城微服务项目系列(十五): 构建定时任务调度和消息队列管理系统

    一.系统描述 嗨,好久不见各位老哥,最近有点懒,技术博客写的太少了,因为最近在写小说,写的顺利的话说不定就转行了,哈哈哈哈哈哈哈哈哈. 今天要介绍的是基于.Net Core的定时任务调度和消息队列管理 ...

随机推荐

  1. Angular Material 的设计之美

    前言 Angular Material 作为 Angular 的官方组件库,无论是设计交互还是易用性都有着极高的质量.正如官方所说其目的就是构建基于 Angular 和 Typescript 的高质量 ...

  2. 洛谷 P1262 【间谍网络】

    题库 : 洛谷 题号 : 1262 题目 : 间谍网络 link : https://www.luogu.org/problemnew/show/P1262 思路 : 这题可以用缩点的思想来做.先用T ...

  3. 【Linux命令】lsmod命令

    lsmod(list modules)命令 lsmod命令用来显示已被内核加载的模块的状态 1)语法:lsmod 2)功能: lsmod命令可以美观地显示/prco/module中的内容,这些内容是被 ...

  4. gym/102021/J GCPC18 模拟拼图

    模拟拼图 题意: 给定n块拼图,每个拼图为四方形,对应四条边有四个数字,如果为0,表示这个边是在边界的,其他数字表示和另一个拼图的一条边相接.保证每个非零数只出现两次. 思路: 模拟,但是要注意几个情 ...

  5. CodeForces 765 F Souvenirs 线段树

    Souvenirs 题意:给你n个数, m次询问, 对于每次一次询问, 求出询问区间内绝对值差值的最小值. 题解:先按查询的右端点从小到大sort一下,然后对于塞入一个数的时候, 就处理出所有左端点到 ...

  6. Node.js+Navicat for MySQL实现的简单增删查改

    前提准备: 电脑上必须装有服务器环境,Navicat for MySQL(我用的是这款MySQL,可随意),Node环境 效果如图所示: 源码地址: GitHub:https://github.com ...

  7. 使用Hypothesis生成测试数据

    Hypothesis是Python的一个高级测试库.它允许编写测试用例时参数化,然后生成使测试失败的简单易懂的测试数据.可以用更少的工作在代码中发现更多的bug. 安装 pip install hyp ...

  8. Tempter of the Bone(DFS+剪枝)

    Problem Description The doggie found a bone in an ancient maze, which fascinated him a lot. However, ...

  9. Spring入门(十二):Spring MVC使用讲解

    1. Spring MVC介绍 提到MVC,参与过Web应用程序开发的同学都很熟悉,它是展现层(也可以理解成直接展现给用户的那一层)开发的一种架构模式,M全称是Model,指的是数据模型,V全称是Vi ...

  10. 会用python把linux命令写一遍的人,进大厂有多容易?

    看过这篇<2000字谏言,给那些想学Python的人,建议收藏后细看!>的读者应该都对一个命令有点印象吧?没错,就是 linux 中经常会用到的 ls 命令. 文章中我就提到如何提升自己的 ...