ABP 使用ElasticSearchKibanaDocker 进行日志收集

后续会根据公司使用的技术,进行技术整理分享,都是干货哦别忘了关注我!!!

最近领导想要我把项目日志进行一个统一收集,因为现在环境有什么报错信息都是看Logs文件夹的日志数据,如果只有一个项目那到无所谓,但是我们现在的服务进行了模块拆分,所以看日志需要一个一个的找不方便,之前我有接触过Seq、ElasticSearch进行日志收集统一查看。

技术点

  • ElasticSearch

ElasticSearch 是一个非常适合索引日志和分析数据的开源数据库。

  • Kibana

Kibana 是 ElasticSearch 的开源数据可视化用户界面。将 ElasticSearch 视为数据库,将 Kibana 视为 Web 用户界面,您可以使用它在 ElasticSearch 中构建图形和查询数据。

  • Serilog

Serilog 是一个用于 ASP.NET Core 的插件,它使日志记录变得容易。Serilog 有多种可用的接收器 - 例如,您可以获得纯文本、SQL 和 ElasticSearch 接收器等等。

为什么用ElasticSearch(当然后面也会介绍Seq)

  • 它是免费和开源

基本功能是免费的,大部分都是免费的。如果您需要 Kibana 中的安全和警报功能,您可以购买 Kibana 的商业 X-pack 订阅,也可以安装一些开源替代品。

  • RESTful API

查询结果以 JSON 格式返回,这意味着结果易于使用。通过 RESTful API 查询和插入数据意味着可以轻松使用任何编程语言来处理 ElasticSearch。

  • 易于查询

ElasticSearch 有一个基于 Apache Lucene 的内置全文搜索引擎。与其他数据库相比,Lucene 易于查询。即使是非技术人员也可以编写常见查询。

  • 速度很快 - 非常快

查询大型 SQL 数据库可能需要 10 或 20 秒。大型 ElasticSearch 数据库上的类似查询通常会在 10 毫秒内返回结果。

  • 它是可扩展

它很容易扩展。再加上它是开源的,这意味着它在钱包上也很容易。

  • 易于设置

只需启动一个包含 ElasticSearch 和 Kibana 容器的 docker compose 文件,您就可以开始记录和搜索了。

Docker搭建Elasticsearch 和 Kibana环境

这里我们使用了docker-compose所以我们需要安装docker-compose然后创建一个 docker-compose.yml 文件。

mkdir -p home/docker/docker-compose
cd home/docker/docker-compose

创建一个名为 docker-compose.yml 的新文件

vi docker-compose.yml

docker-compose.yml文件内容

  • 设置es内存,java程序一般很吃内存,根据服务器配置进行调优- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
  • kibana汉化(7.0以上版本),根据个人情况决定- output.i18n.locale="zh-CN"
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
volumes:
elasticsearch-data:

运行 docker-compose.yml 文件

容器启动之后需要等待一会,因为初始化需要一段时间

# 构建启动容器  -d 后台运行
docker-compose up -d # 停止up 命令所启动的容器,并移除网络
docker-compose down

验证环境

  • 验证 Elasticsearch 是否已启动并正在运行,我们可以访问http://localhost:9200(就是我们刚才开放Elasticsearch的9200端口)

  • 验证 Kibana 是否已启动并正在运行,我们可以访问http://localhost:5601(就是我们刚才开放Kibana的5601端口)

使用Abp配合Serilog 记录日志到 Elasticsearch

  • Serilog 包添加到项目中

    • Serilog.AspNetCore
    • Serilog.Enrichers.Environment
    • Serilog.Sinks.Debug
    • Serilog.Sinks.ElasticSearch
    • Serilog.Exceptions
  • appsettings.json 中添加 Serilog 日志和Elasticsearch地址

{
// Serilog 日志配置
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Information",
"System": "Warning"
}
}
},
// Elasticsearch地址
"ElasticConfiguration": {
"Uri": "http://localhost:9200"
},
"AllowedHosts": "*"
}

在 Program.cs 中配置日志记录

接下来,通过添加以下 using 语句在 Program.cs 中配置日志记录:

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Serilog;
using Serilog.Sinks.Elasticsearch;
using System;
using System.Reflection;
using Serilog.Exceptions;

接下来,设置 main 方法。我们要做的是在创建主机之前设置日志记录。这样,如果主机无法启动,我们可以记录任何错误。

public static void Main(string[] args)
{
// 配置日志信息
ConfigureLogging(); // 然后创建主机,这样如果主机出现故障,我们就可以记录错误
CreateHost(args);
}

然后,在 program.cs 中添加 ConfigureLogging 和 ElasticsearchSinkOptions 方法

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,
// 创建索引(如果不设置默认就是logstash-2022.03.06这种时间格式的)
IndexFormat = $"{Assembly.GetExecutingAssembly().GetName().Name.ToLower().Replace(".", "-")}-{environment?.ToLower().Replace(".", "-")}"
};
}

最后,添加 CreateHost 和 CreateHostBuilder 方法。请注意 CreateHostBuilder 周围的 try/catch 块。

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();

然后运行一次你的程序,让它自动创建好索引信息,后面我们就只需要配置了

kibana配置信息

  • 点击进入默认管理空间

  • 管理空间配置

Kibana 目前还不会显示任何日志。您必须先指定索引,然后才能查看记录的数据。

这里就可以看到logstash就是我们创建的索引(我之前没有设置索引所以就默认是logstash-2022.03.06)

输入你的索引模式。它将显示刚刚创建的索引模式。您可以键入整个索引,或使用通配符。

在下一页上,选择 @timestamp 字段作为时间过滤器字段名称,然后单击创建索引模式按钮。

您现在可以通过单击导航窗格中的 Discover 链接来查看日志。

我们程序中打出来的日志就会被收集到这里,这里我就不演示怎么写打日志的代码了哈。(刚才上厕所尿劈叉了)

配置日志过期策略

因为我们的日志信息一般都不需要保留很长的时间。(一般保存3天左右就够了,过期的日志将自动清除,这样也能减少我们日志内存的消耗)

  • 记得关掉热阶段的滚动更新
  • 开启删除阶段,设置过期时间,快照可以不用

关联索引策略模式

选择我们刚才设置的策略模块,进行关联。(这样我们的日志就会自动释放啦)

ABP 使用ElasticSearch、Kibana、Docker 进行日志收集的更多相关文章

  1. GlusterFS + lagstash + elasticsearch + kibana 3 + redis日志收集存储系统部署 01

    因公司数据安全和分析的需要,故调研了一下 GlusterFS + lagstash + elasticsearch + kibana 3 + redis 整合在一起的日志管理应用: 安装,配置过程,使 ...

  2. 用ElasticSearch,LogStash,Kibana搭建实时日志收集系统

    用ElasticSearch,LogStash,Kibana搭建实时日志收集系统 介绍 这套系统,logstash负责收集处理日志文件内容存储到elasticsearch搜索引擎数据库中.kibana ...

  3. logstash+elasticsearch+kibana快速搭建日志平台

    使用logstash+elasticsearch+kibana快速搭建日志平台   日志的分析和监控在系统开发中占非常重要的地位,系统越复杂,日志的分析和监控就越重要,常见的需求有: 根据关键字查询日 ...

  4. docker容器日志收集方案汇总评价总结

    docker日志收集方案有太多,下面截图罗列docker官方给的日志收集方案(详细请转docker官方文档).很多方案都不适合我们下面的系列文章没有说. 经过以下5篇博客的叙述简单说下docker容器 ...

  5. Nginx filebeat+logstash+Elasticsearch+kibana实现nginx日志图形化展示

    filebeat+logstash+Elasticsearch+kibana实现nginx日志图形化展示   by:授客  QQ:1033553122   测试环境 Win7 64 CentOS-7- ...

  6. 利用 log-pilot + elasticsearch + kibana 搭建 kubernetes 日志解决方案

    开发者在面对 kubernetes 分布式集群下的日志需求时,常常会感到头疼,既有容器自身特性的原因,也有现有日志采集工具的桎梏,主要包括: 容器本身特性: 采集目标多:容器本身的特性导致采集目标多, ...

  7. 使用logstash+elasticsearch+kibana快速搭建日志平台

    日志的分析和监控在系统开发中占非常重要的地位,系统越复杂,日志的分析和监控就越重要,常见的需求有: * 根据关键字查询日志详情 * 监控系统的运行状况 * 统计分析,比如接口的调用次数.执行时间.成功 ...

  8. lagstash + elasticsearch + kibana 3 + kafka 日志管理系统部署 02

    因公司数据安全和分析的需要,故调研了一下 GlusterFS + lagstash + elasticsearch + kibana 3 + redis 整合在一起的日志管理应用: 安装,配置过程,使 ...

  9. docker容器日志收集方案(方案一 filebeat+本地日志收集)

    filebeat不用多说就是扫描本地磁盘日志文件,读取文件内容然后远程传输. docker容器日志默认记录方式为 json-file 就是将日志以json格式记录在磁盘上 格式如下: { " ...

随机推荐

  1. 为什么ConcurrentHashMap是线程安全的?

    ConcurrentHashMap 是 HashMap 的多线程版本,HashMap 在并发操作时会有各种问题,比如死循环问题.数据覆盖等问题.而这些问题,只要使用 ConcurrentHashMap ...

  2. Python 单元测试 生产HTML测试报告

    使用HTMLTestRunnerNew模块,生成单元测试的html报告,报告标题根据对应测试时间. import unittest from datetime import datetime from ...

  3. Python 单元测试 实战演练

    结合实例,联系单元测试. 文件结构: |----Python_unittest |--------math_operation.py # 定义了类[class MathOperation:],类里面定 ...

  4. MySQL 5.7.19 简易安装、卸载教程

    前言:传统的 exe 文件安装的MySQL,安装后特别难卸载,而且一旦处理不好,就容易出错,想再安装别的版本也不容易.因为这种方式的安装,虽然是不断的下一步,但是卸载的时候需要处理很多,在本文最后,有 ...

  5. vue组件中使用<transition></transition>标签过渡动画

    直接上代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  6. CSS Modules 的六种用法

    一.局部作用域 二.全局作用域 三.定制哈希类名 四. Class 的组合 五.输入其他模块 六.输入变量

  7. 「JOI 2015 Final」舞会

    「JOI 2015 Final」舞会 略微思考一下即可知该过程可以化为一棵树.(3个贵族中选择1个,即新建一个节点连向这3个贵族). 该树的结点个数为\(2n\). 考虑二分答案mid. 判定的是公主 ...

  8. 通过Python自带模块SimpleHTTPServer快速共享服务的配置文件

    简介 SimpleHTTPServer是Python 2自带的一个模块,是Python的Web服务器,简单小巧,快速启动. 它在Python 3已经合并到http.server模块中. SimpleH ...

  9. 通过String获取字符数组

    方法一: public void getChars(int start,int end,char c[],int offset) 作用是将当前字符串从start到end-1位置上的字符复制到字符数组c ...

  10. 友盟分享,极光推送Demo

    友盟分享SDK下载及官方文档 http://dev.umeng.com/social/ios/detail-share 1.注册应用获取App友盟Appkey(556d14ad67e58eb08400 ...