前言

最近园子里看到一篇<.Net Core with 微服务 - Elastic APM> 的文章(主要用于对接口的调用链、性能进行监控),非常实用,这里讲解.NetCore将日志写入ElasticSearch,并用Kibana搜索日志

部署环境

centos

依赖环境

docker

docker-compose

.net core 3.1

使用部署

1.创建 docker-compose.yml 文件

注意事项:

  1. 设置es内存,java程序一般很吃内存,根据服务器配置进行调优 - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
  2. kibana汉化(7.0以上版本),根据个人情况决定 - output.i18n.locale="zh-CN"
  3. 安装apm_server,这个模块非必须项,不需要的可以去掉,感兴趣可以参考 <.Net Core with 微服务 - Elastic APM>
  4. 拉取镜像失败,由于网络原因,可能存在拉取镜像失败,网络较差建议单独拉取镜像,再运行
version: '3.1'
services:
elasticsearch:
container_name: elasticsearch
hostname: elasticsearch
image: docker.elastic.co/elasticsearch/elasticsearch:7.9.2
restart: always
ports:
- 9200:9200
- 9300:9300
volumes:
- elasticsearch-data:/usr/share/elasticsearch/data
environment:
- xpack.monitoring.enabled=true
- xpack.watcher.enabled=false
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- discovery.type=single-node
kibana:
container_name: kibana
hostname: kibana
image: docker.elastic.co/kibana/kibana:7.9.2
restart: always
ports:
- 5601:5601
depends_on:
- elasticsearch
environment:
- ELASTICSEARCH_URL=http://localhost:9200
apm_server:
image: docker.elastic.co/apm/apm-server:7.9.2
restart: always
container_name: apm_server
hostname: apm_server
command: --strict.perms=false -e
environment:
- output.elasticsearch.hosts=["localhost:9200"]
- output.i18n.locale="zh-CN"
ports:
- 8200:8200
depends_on:
- kibana
- elasticsearch
volumes:
elasticsearch-data:

2.运行 docker-compose.yml 文件

注意事项:

  1. 容器启动后,kibana需要一段时间初始化
  2. 本次需要开放的端口 es:9200,9300 kibana:5601 apm-server:8200
docker-compose up -d    //构建启动容器  -d 后台运行
docker-compose down //停止up 命令所启动的容器,并移除网络
docker-compose stop //停止容器
docker-compose start //启动容器
docker-compose restart //重启容器

3.启动kibana web界面,浏览器输入:http://[ip]:5601/app/home#/ [ip]为服务器ip地址或域名

  1. 能正常的打开界面,则ElasticSearch、Kibana、Apm 部署完成

4.使用 ASP.NET Core 和 Serilog 记录到 Elasticsearch

1.新建一个.net core web程序(.net core3.1)

2.将以下 Serilog 包添加到项目中

  • Serilog.AspNetCore
  • Serilog.Enrichers.Environment
  • Serilog.Sinks.Debug
  • Serilog.Sinks.ElasticSearch

3.删除 appsettings.json 中的 Logging 部分并将其替换为以下配置,如果是dev环境,则修改appsettings.Development.json文件

{
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Information",
"System": "Warning"
}
}
},
"ElasticConfiguration": {
"Uri": "http://localhost:9200" //这里填写es地址
},
"AllowedHosts": "*"
}

4.在 Program.cs 中配置登录

注意在es中创建的索引,这里的索引是it-tibos-api,可以根据业务进行修改

 public class Program
{
public static void Main(string[] args)
{
//configure logging first
ConfigureLogging(); //then create the host, so that if the host fails we can log errors
CreateHost(args);
} private static void ConfigureLogging()
{
var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile(
$"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json",
optional: true)
.Build(); Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.Enrich.WithExceptionDetails()
.Enrich.WithMachineName()
//.WriteTo.Debug()
.WriteTo.Console()
.WriteTo.Elasticsearch(ConfigureElasticSink(configuration, environment))
.Enrich.WithProperty("Environment", environment)
.ReadFrom.Configuration(configuration)
.CreateLogger();
} private static ElasticsearchSinkOptions ConfigureElasticSink(IConfigurationRoot configuration, string environment)
{
return new ElasticsearchSinkOptions(new Uri(configuration["ElasticConfiguration:Uri"]))
{
AutoRegisterTemplate = true,
IndexFormat = $"it-tibos-api" //索引
};
} private static void CreateHost(string[] args)
{
try
{
CreateHostBuilder(args).Build().Run();
}
catch (System.Exception ex)
{
Log.Fatal($"Failed to start {Assembly.GetExecutingAssembly().GetName().Name}", ex);
throw;
}
} public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.ConfigureAppConfiguration(configuration =>
{
configuration.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
configuration.AddJsonFile(
$"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json",
optional: true);
})
.UseSerilog();
}

5.在action里记录日志,并运行程序

    _logger.LogInformation($"这是一条测试日志,发送时间{DateTime.Now}");
_logger.LogWarning($"这是一条测试警告日志,发送时间{DateTime.Now}");
try
{
throw new Exception("Some bad code was executed");
}
catch (Exception ex)
{
_logger.LogError($"这是一条异常日志,发送时间{DateTime.Now}");
}

6.在Kibana添加ElasticSearch索引



7.搜索日志



8.管理索引

  • .net core 使用阿里云日志,可以阅读这篇文章
  • 推荐我自己写的一个Redis消息队列中间件InitQ,操作简单可以下载的玩玩

参考:

作者:提伯斯

.NetCore使用Docker安装ElasticSearch、Kibana 记录日志的更多相关文章

  1. 【最新】docker 安装elasticsearch + kibana步骤【第一篇_elasticsearch】

     最近在用docker 安装elasticsearch + kibana 遇到了很多坑,最后成功安装elasticsearch + kibana (6.8.1)版本   安装了一下午,现总结过程中遇到 ...

  2. docker安装Elasticsearch Kibana和Cerebro

    环境:win10家庭版,基于Docker Toolbox 首先先做好以下两步准备工作: ①.打开Oracle VM VirtualBox,设置虚拟机内存大小,默认不够安装,建议如下设置: ②.启动虚拟 ...

  3. 【最新】docker 安装elasticsearch + kibana步骤【第二篇_kibana】

    本文主要讲解Docker 安装 kibana并设置中文语言 [如果有需要安装elasticsearch 的朋友请移步博主第一篇文章] 话不多说! 第一步:docker 下载kibana docker ...

  4. Docker 安装 Elasticsearch+kibana

    1 下载镜像 docker pull elasticsearch:7.4.1 docker pull kibana:7.4.1 拉取的镜像如下: 2 创建network 创建一个网络,名字任意取,使得 ...

  5. 【ELK】【docker】【elasticsearch】1. 使用Docker和Elasticsearch+ kibana 5.6.9 搭建全文本搜索引擎应用 集群,安装ik分词器

    系列文章:[建议从第二章开始] [ELK][docker][elasticsearch]1. 使用Docker和Elasticsearch+ kibana 5.6.9 搭建全文本搜索引擎应用 集群,安 ...

  6. Docker安装ElasticSearch 版本7.1.1

    一.Docker 部署 ElasticSearch 1.从仓库中查找所有ElasticSearch的镜像 [root@iZwz99dhxbd6xwly17tb3bZ app]# docker sear ...

  7. 使用Docker 安装Elasticsearch、Elasticsearch-head、IK分词器 和使用

    原文:使用Docker 安装Elasticsearch.Elasticsearch-head.IK分词器 和使用 Elasticsearch的安装 一.elasticsearch的安装 1.镜像拉取 ...

  8. linux centos7使用docker安装elasticsearch,并且用Django连接使用

    一:elasticsearch安装及配置 1:需求分析 当用户在搜索框输入关键字后,我们要为用户提供相关的搜索结果.这种需求依赖数据库的模糊查询like关键字可以实现,但是like关键字的效率极低,而 ...

  9. Docker安装ElasticSearch及kibana

    什么是Kibana? Kibana 是一个设计出来用于和 Elasticsearch 一起使用的开源的分析与可视化平台,可以用 kibana 搜索.查看.交互存放在Elasticsearch 索引里的 ...

随机推荐

  1. Kubernetes服务pod的健康检测liveness和readiness详解

    Kubernetes服务pod的健康检测liveness和readiness详解 接下来给大家讲解下在K8S上,我们如果对我们的业务服务进行健康检测. Health Check.restartPoli ...

  2. volatile关键字的作用-respect

    volatile关键字的含义? volatile定义的变量可能会意外的改变,改变它的情况有很多(例如:操作系统,硬件,线程),编译就不会去假设这个值,也就是说每次访问这个变量时,系统就会小心翼翼的去从 ...

  3. Linux_WEB服务基础概念

    一.HTTPD简介 1️⃣:httpd是Apache超文本传输协议(HTTP) 服务器的主程序.被设计为一个独立运行的后台进程,它会建立一个处理请求的子进程或线程的池. 2️⃣:通常,httpd不应该 ...

  4. 062.Python前段框架Django视图CBV

    一 CBV与FBV CBV:Class Based View FBV:Function Based View 之前写过的都是基于函数的view,就叫FBV.还可以把view写成基于类的,那就是CBV. ...

  5. Centos 7.4搭建es7.12.0+Skywalking7.8.5

    Skywalking整体架构图和分布式追踪系统原理:https://blog.csdn.net/weixin_39866487/article/details/111581322 软件包版本1.ela ...

  6. iowait 的常见误解

    转自:理解 %IOWAIT (%WIO):http://linuxperf.com/?p=33   %iowait 是 "sar -u" 等工具检查CPU使用率时显示的一个指标,在 ...

  7. C语言练习题1(关于快速排序,二分查找与运行时间)

    刚刚完成师兄给的一道题目: 随机生成10000位数,进行快速排序后,用二分查找法定位到某个要查询的数(键盘输入某个要查询的数),  结果输出查询的时间,以及是否查到 分享下自己的解题思路: 1,要懂得 ...

  8. Java并发:ThreadLocal的简单介绍

    作者:汤圆 个人博客:javalover.cc 前言 前面在线程的安全性中介绍过全局变量(成员变量)和局部变量(方法或代码块内的变量),前者在多线程中是不安全的,需要加锁等机制来确保安全,后者是线程安 ...

  9. MySQL是如何实现事物隔离?

    前言 众所周知,MySQL的在RR隔离级别下查询数据,是可以保证数据不受其它事物影响,而在RC隔离级别下只要其它事物commit后,数据都会读到commit之后的数据,那么事物隔离的原理是什么?是通过 ...

  10. Step By Step(Lua环境)

    Step By Step(Lua环境) Lua将其所有的全局变量保存在一个常规的table中,这个table被称为"环境".它被保存在全局变量_G中.    1. 全局变量声明:  ...