Asp-Net-Core-搭建ELK日志平台-Docker-Compose版本
title: Asp.Net Core 搭建ELK日志平台(Docker-Compose版本)
date: 2022-09-27 15:16:59
tags:
- .NET
由于暂时用不上Logstash的过滤功能,因此本部署方案直接使用Nlog输出到ElasticSearch,项目的架构如下:

docker-compose部署
部署文件内容如下:
version: "3" # 不同版本 支持 docker 版本也不同
services:
  elasticsearch:
    image: elasticsearch:7.5.0 # 镜像
    container_name: "elasticsearch" # 容器名称
    ports: # 绑定端口
      -  9200:9200
      -  9300:9300
    environment: # 环境参数
      - "discovery.type=single-node" # 单节点 而不是集群
    volumes: # 挂载卷
      - F:/elasticsearch/data:/usr/share/elasticsearch/data
      - F:/elasticsearch/plugins:/usr/share/elasticsearch/plugins
  elastalert:
    container_name: "elastalert"
    image: karql/elastalert2-server:latest
    ports:
      - 3030:3030
      - 3333:3333
    links: # 链接容器,即在该容器内的hosts文件添加一条 xxx.xxx.xxx.xxx elasticsearch 的dns地址
      - elasticsearch
    depends_on: # 容器依赖,使得elastalert在elasticsearch后部署启动
      - elasticsearch
    volumes:
      - F:/elasticsearch/elastalert/config/elastalert.yaml:/opt/elastalert/config.yaml
      - F:/elasticsearch/elastalert/config/elastalert-test.yaml:/opt/elastalert/config-test.yaml
      - F:/elasticsearch/elastalert/config/config.json:/opt/elastalert-server/config/config.json
      - F:/elasticsearch/elastalert/rules:/opt/elastalert/rules
      - F:/elasticsearch/elastalert/rule_templates:/opt/elastalert/rule_templates
  kibana:
    container_name: "kibana"
    image: kibana:7.5.0
    ports:
      - 5601:5601
    links:
      - elasticsearch
      - elastalert
    depends_on:
      - elasticsearch
      - elastalert
    volumes:
      - F:\ELKDeploy\elasticsearch\kibana.yml:/usr/share/kibana/config/kibana.yml
      - F:\ELKDeploy\elasticsearch\kibana-plugins\plugins:/usr/share/kibana/plugins
记得替换掉挂载卷的路径,以上配置文件我都放在了我的github上:https://github.com/li-zheng-hao/ELKOnDocker.git ,直接clone下来就行,所有的配置文件我都打包成了zip,记得解压缩
如果在linux下有可能还需要配置对应的文件夹访问权限 chmod -R 777 ./ELKOnDocker
然后在该文件目录下运行命令:
docker compose -f deploy.yml up  -d
等待安装完成即可
Webapi项目配置
添加依赖库
- NLog.Web.AspNetCore
- NLog.Targets.ElasticSearch
配置日志config文件
新建nlog.config文件:
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	  <extensions>
		  <add assembly="NLog.Targets.ElasticSearch"/>
	  </extensions>
    <targets>
      <target xsi:type="File" name="f" fileName="${basedir}/App_Data/logs/${shortdate}.log" layout="${date:format=HH\:mm\:ss}|${level}|${message}" />
		<target name="elastic" xsi:type="BufferingWrapper" flushTimeout="5000">
			<target xsi:type="ElasticSearch" index="webapi-${date:format=yyyy.MM.dd}" includeAllProperties="true" uri="http://172.10.2.111:9200/" >
				<field name="MachineName" layout="${machinename}" />
			</target>
		</target>
    </targets>
    <rules>
		<logger name="*" minlevel="Debug" writeTo="elastic" />
      <logger name="*" minlevel="Debug" writeTo="f" />
      <logger name="*" minlevel="Debug" writeTo="cc" />
    </rules>
  </nlog><?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      internalLogToConsole="true">
	<extensions>
		<add assembly="NLog.Targets.ElasticSearch"/>
	</extensions>
	<targets>
		 <!--uri="http://localhost:9200"-->
		<!--ElasticSearch保存日志信息-->
        <target name="elastic" xsi:type="BufferingWrapper" flushTimeout="5000">
            <target name="elk" xsi:type="ElasticSearch"
                    ConnectionStringName="ElasticSearchServerAddress"
                    index="webapi-${shortdate}"
                    layout ="API:MyServiceName|${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}">
                <field name="MachineName" layout="${machinename}" />
                <field name="Time" layout="${longdate}" />
                <field name="level" layout="${level:uppercase=true}" />
                <field name="logger" layout=" ${logger}" />
                <field name="message" layout=" ${message}" />
            </target>
        </target>
	</targets>
	<rules>
		<logger name="Microsoft.*" maxLevel="Info" final="true" />
		<logger name="*" minLevel="Debug" writeTo="elastic" ></logger>
	</rules>
</nlog>
在appsettings.json内配置对应的地址:
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "ElasticSearchServerAddress": "http://localhost:9200" //新增 根据自己搭建的地址替换
  }
}
添加Nlog替换自带的logger
public class Program
{
    public static void Main(string[] args)
    {
        NLogBuilder.ConfigureNLog("nlog.config");// 新增
        CreateHostBuilder(args).Build().Run();
    }
    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
                                  {
                                      webBuilder.UseStartup<Startup>().UseNLog();//新增
                                  });
}
测试
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
    private static readonly string[] Summaries = new[]
    {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };
    private readonly ILogger<WeatherForecastController> _logger;
    public WeatherForecastController(ILogger<WeatherForecastController> logger)
    {
        _logger = logger;
    }
    [HttpGet]
    public string Get(string data)
    {
        _logger.LogDebug("写入测试数据");
        return "ok";
    }
}
调用接口写入数据,打开kibana查看:

数据成功写入
配置日志异常报警
如果是用的我的compose文件及配置文件的话,部署完成后插件应该是直接安装完成了的,进入kibana页面后,如下图显示,如果有elastalert说明插件安装成功:

配置http请求报警
在kibana的elastalert页面内加入如下规则:
name: cutsom_rule
type: any
index: webapi-*
num_events: 1
timeframe:
  minutes: 1
filter:
- query:
    query_string:
      query: "message: 错误  OR error OR ERROR"
alert: post
http_post_url: "http://host.docker.internal:5000/WeatherForecast"
http_post_payload:
    content: message
http_post_static_payload:
  test_str: "my test string"
这里说明一下上述的配置字段,index为日志的索引,query也就是满足KQL查询的规则的字符串,http_pot_url填入异常通知调用的接口,由于我的webapi服务没有部署在docker内,这里需要通过host.docker.internal来自动获取容器宿主机的ip
更多的参数说明参考elastalert的官方手册:https://elastalert.readthedocs.io/en/latest/ruletypes.html?highlight=http#http-post
配置完成后会自动监测日志
Asp-Net-Core-搭建ELK日志平台-Docker-Compose版本的更多相关文章
- 搭建ELK日志平台(单机)
		系统版本:Ubuntu 16.04.7 LTS 软件架构:Filebeat+Kafka+Logstash+Elasticsearch+Kibana+Nginx 软件版本:Filebeat-7.16.0 ... 
- Asp.net Core + Log4net + ELK 搭建日志中心
		原文:Asp.net Core + Log4net + ELK 搭建日志中心 Docker中一键安装ELK 对于这种工具类的东西,第一步就直接到docker的hub中查找了,很幸运,不仅有Elasti ... 
- elk日志平台搭建小记
		最近抽出点时间,搭建了新版本的elk日志平台 elastaicsearch 和logstash,kibana和filebeat都是5.6版本的 中间使用redis做缓存,版本为3.2 使用的系统为ce ... 
- 搭建ELK日志分析平台(上)—— ELK介绍及搭建 Elasticsearch 分布式集群
		笔记内容:搭建ELK日志分析平台(上)-- ELK介绍及搭建 Elasticsearch 分布式集群笔记日期:2018-03-02 27.1 ELK介绍 27.2 ELK安装准备工作 27.3 安装e ... 
- Springboot项目使用aop切面保存详细日志到ELK日志平台
		上一篇讲过了将Springboot项目中logback日志插入到ELK日志平台,它只是个示例.这一篇来看一下实际使用中,我们应该怎样通过aop切面,拦截所有请求日志插入到ELK日志系统.同时,由于往往 ... 
- 将 ASP.NET Core 1.0 应用作为 docker 镜像发布 (Linux版)
		var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ... 
- asp.net core 系列 13 日志
		一.概述 ASP.NET Core 支持适用于各种内置和第三方日志记录, 供程序的日志记录 API,本文介绍了如何将日志记录 API 与内置提供程序一起使用.对于第三方日志记录提供程序使用,文章最后有 ... 
- (14)ASP.NET Core 中的日志记录
		1.前言 ASP.NET Core支持适用于各种内置和第三方日志记录提供应用程序的日志记录API.本文介绍了如何将日志记录API与内置提供应用程序一起使用. 2.添加日志提供程序 日志记录提供应用程序 ... 
- ELK 日志平台构建
		elastic中文社区 https://elasticsearch.cn/ 完整参考 ELK实时日志分析平台环境部署--完整记录 https://www.cnblogs.com/kevingrace/ ... 
- 学习ASP.NET Core(10)-全局日志与xUnit系统测试
		上一篇我们介绍了数据塑形,HATEOAS和内容协商,并在制器方法中完成了对应功能的添加:本章我们将介绍日志和测试相关的概念,并添加对应的功能 一.全局日志 在第一章介绍项目结构时,有提到.NET Co ... 
随机推荐
- NOI2017蚯蚓排队
			原题链接 发现 k<=50 ,在插入和删除时最多会影响不超过 k2 个串,用链表实现插入和删除,然后只需用哈希表维护每个长度不超过k的串的出现次数,哈希的话可以先用比较大的范围的值处理冲突,再映 ... 
- 【JavaWeb】学习笔记——Tomcat集成
			简介 Tomcat是基于Java的一个开放源代码.运行servlet和JSP Web应用的Web应用软件容器,又称servlet容器 安装 官方网站:https://tomcat.apache.org ... 
- 为什么CSS中的calc函数可能会不生效?
			前言 在早期如果想要对某一些样式进行动态计算,绝大多数的做法都是使用JavaScript来进行,当时的CSS在面对这种场景显得有点无能为力.但是,当CSS3中新增了calc函数时,面对这种场景,Jav ... 
- 搭建harbor私有仓库
			2-1.项目说明 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,由VMware开源,其通过添加一些企业必需的功能特性,例如安全.标识和管理等,扩展了开源 Docke ... 
- javaWEB中的四种域对象
			javaWEB中的四种域对象 (1)ServletContext ServletContext是最大的Web域对象,在整个工程内有效,可以存储一些需要全局部署的配置文件,也可以存储其他信息,不过因为它 ... 
- JS学习笔记 (三) 对象进阶
			1.JS对象 1.1 JS对象特征 1.JS对象是基本数据数据类型之一,是一种复合值,可以看成若干属性的集合. 属性是名值对的形式(key:value) 属性名是字符串,因此可以把对象看成是字符串到值 ... 
- CH58X/CH57X/V208的Broadcaster(广播者)例程讲解
			在对ble进行应用的时候,每个用户的需求可能不尽相同.这里着重介绍从机Broadcaster例程,只广播不连接. 使用该例程时可以在手机使用APP上对Broadcaster进行调试. 安卓端在应用市场 ... 
- JVM运行时数据区域详解
			参考文章: <Java Se11 虚拟机规范> <深入理解Java虚拟机-JVM高级特性与最佳实践 第3版>- 周志明 本文基于Java Se 11讲解. 根据<Java ... 
- 基于SqlSugar的开发框架循序渐进介绍(22)-- Vue3+TypeScript的前端工作流模块中实现统一的表单编辑和表单详情查看处理
			在工作流页面中,除了特定的业务表单信息外,往往也需要同时展示通用申请单的相关信息,因此在页面设计的时候需要使用一些组件化的概念来实现动态的内容展示处理,本篇随笔介绍Vue3+TypeScript+El ... 
- leetcode学习记录2.13
			[13] 罗马数字转整数 import java.util.HashMap; import java.util.Map; /* * * [13] 罗马数字转整数 * * https://leetcod ... 
