zoukankan      html  css  js  c++  java
  • asp.net core 使用docker serilog elasticsearch kibana 记录日志

    参考地址:https://blog.csdn.net/sD7O95O/article/details/89368561

    在.net core中,我们使用serilog这个插件来记录日志,log4net 通过xml配置比较复杂,不支持结构化日志,
    nlog 新增加了结构化日志,但是也是通过xml配置的,但是比log4net简单,serilog就是为结构化日志而生的,推荐serilog

    要继续下面的步骤,请确保安装了这些:

    • Docker

    • Visual Studio Code

    • .NET Core SDK 2.1.300 或更高版本 ( 下载 )

    创建项目文件夹

    mkdir elastic-kibana
    cd elastic-kibana

    使用 .NET Core 命令行创建 MVC 项目

    dotnet new mvc -n elastic-kibana -o src

    在 Visual Studio Code 中打开项目

    cd elastic-kibana
    code .

    创建 docker compose 文件

    接下来,创建一个 docker compose 文件。此文件将一并启动 ElasticSearch 和 Kibana 容器,无需为每个容器运行单独的docker run命令。

    mkdir docker
    cd docker

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

    version: '3.1'

    services:

    elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.2.4
    container_name: elasticsearch
    ports:
    - "9200:9200"
    volumes:
    - elasticsearch-data:/usr/share/elasticsearch/data
    networks:
    - docker-network

    kibana:
    image: docker.elastic.co/kibana/kibana:6.2.4
    container_name: kibana
    ports:
    - "5601:5601"
    depends_on:
    - elasticsearch
    networks:
    - docker-network

    networks:
    docker-network:
    driver: bridge

    volumes:
    elasticsearch-data:

    接下来,运行 docker compose 命令来启动容器。

    docker-compose up -d

    第一次运行 docker-compose up 命令时,它将从 docker 仓库下载 ElasticSearch 和 Kibana 所需的镜像,因此它将花费几分钟的时间。

    运行 docker-compose up 命令后,请检查 ElasticSearch 和 Kibana 是否已经启动。

    ElasticSearch

    打开 http://localhost:9200 确认 ElasticSearch 已经启动。

    640?wx_fmt=png

    Kibana

    打开 http://localhost:5601 确认 Kibana 已经启动。

    640?wx_fmt=png

    加 Nuget 包到项目

    我们将添加以下 Serilog 的包到项目。

    Serilog
    Serilog.Sinks.ElasticSearch
    Serilog.Extensions.Logging

    cd ..
    cd elastic-kibana
    dotnet add package Serilog
    dotnet add package Serilog.Sinks.ElasticSearch
    dotnet add package Serilog.Extensions.Logging
    dotnet restore

    添加一些配置信息到 appsettings.json

    添加默认的日志设置以及 ElasticSearch 的 url 到 appsettings.json 文件

    {
    "Logging": {
    "LogLevel": {
    "Default": "Information",
    "System": "Information",
    "Microsoft": "Information"
    }
    },
    "ElasticConfiguration": {
    "Uri": "http://localhost:9200/"
    }
    }

    在 Startup.cs 中配置日志功能

    下一步,在 Startup.cs 中配置日志功能

    添加这些 using 语句:

    using Microsoft.Extensions.Logging;
    using Serilog;
    using Serilog.Sinks.Elasticsearch;

    然后,配置 Startup 的构造函数以从 appsettings.json 加载 ElasticSearch 的 URL,并配置 ElasticSearch 的接收器。

    public Startup(IConfiguration configuration, IHostingEnvironment hostingEnvironment)
    {
    var builder = new ConfigurationBuilder()
    .SetBasePath(hostingEnvironment.ContentRootPath)
    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
    .AddJsonFile($"appsettings.{hostingEnvironment.EnvironmentName}.json", reloadOnChange: true, optional: true)
    .AddEnvironmentVariables();

    Configuration = builder.Build();

    var elasticUri = Configuration["ElasticConfiguration:Uri"];

    Log.Logger = new LoggerConfiguration()
    .Enrich.FromLogContext()
    .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri(elasticUri))
    {
    AutoRegisterTemplate = true,
    })
    .CreateLogger();
    }

    最后,在 Configure 方法中将 Serilog 添加到日志工厂。

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {


    loggerFactory.AddSerilog();


    }

    开始记录日志到 ElasticSearch

    现在,通过在 Visual Studio Code 中点击 F5 或者命令行中执行 dotnet run 来运行 MVC 应用程序。

    640?wx_fmt=png

    启动 Kibana

    由于我们在 Startup 类中配置了日志记录并将最小日志级别设置为 Information,因此运行该应用程序会将一些事件记录到 ElasticSearch 。

    在 http://localhost:5601 打开 Kibana,以便我们可以查看日志。

    加载 Kibana 后,您将看到默认页面。

    640?wx_fmt=png

    在 Kibana 中创建索引模式来显示数据

    Kibana 现在还不会显示任何日志。您必须先指定索引才能查看记录的数据。为此,请单击导航中的 Management 链接,然后将列在页面底部的 logstash 索引名称复制到文本框中,如下所示,然后单击下一步按钮。或者,您可以使用*号通配符,例如 logstash-*

    640?wx_fmt=png

    然后,通过选择 @timestamp 指定时间过滤器字段名称,然后单击 Create index pattern按钮。

    640?wx_fmt=png

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

    640?wx_fmt=png

    在 MVC Controller 中记录自定义消息

    由于我们指定要记录日志级别为 Information 或更高级别的消息,因此默认情况下会记录大量信息消息。但是如果我们想记录自己的消息呢?值得庆幸的是,这很容易做到。接下来我将在 HomeController 中记录一条消息。

    添加 using 语句:

    using Microsoft.Extensions.Logging;

    然后,使用构造函数注入的方式来注入 ILogger 的实例。

    ILogger<HomeController> _logger;
    public HomeController(ILogger<HomeController> logger)
    {
    _logger = logger;
    }

    最后,在 Index Action 中记录一条消息。

    public IActionResult Index()
    {
    _logger.LogInformation($"oh hai there! : {DateTime.UtcNow}");

    return View();
    }

    在 Kibana 中搜索

    现在我们已经记录了一条消息,只需打开 Kibana 并搜索日志消息的文本即可。

    640?wx_fmt=png

    您还可以将某一条日志在单独的窗口中打开,以查看各个字段记录的信息。

    640?wx_fmt=png

    我将展示一些基本的搜索示例,来演示在 Kibana 中搜索的容易程度以及 ElasticSearch 的强大功能:

    message:"oh hai there"
    level:"Information"
    fields.ActionName:"elastic_kibana.Controllers.HomeController.Index"
    (message:"oh hai there" AND fields.ActionName:"elastic_kibana.Controllers.HomeController.Index")

    记录错误日志到 ElasticSearch

    一个典型的需求就是记录错误消息。使用 Serilog 这将变得非常简单,如下所示。

    try
    {
    throw new Exception("oops. i haz cause error in UR codez.");
    }
    catch (Exception ex)
    {
    _logger.LogError(ex, "ur code iz buggy.");
    }

    在 Kibana 中搜索错误日志

    在 Kibana 中找到错误日志非常简单,使用如下的搜索条件就可以找到所有的错误日志了。

    level: "Error"

    640?wx_fmt=png

    我们来看看使用 Serilog 和 ElasticSearch 默认记录的详细信息。

    640?wx_fmt=png

    它看起来还不错,但您会注意到异常细节被记录为一个大大的字符串。在此字符串中搜索信息仍会返回结果,但如果根据特定字段记录信息,我们可以执行更强大和特定的搜索。值得庆幸的是,有一个名为 Serilog.Exceptions 的插件可以帮助我们。

    安装 Serilog.Exceptions Nuget 包

    安装 Serilog.Exceptions Nuget 包:

    dotnet add package Serilog.Exceptions
    dotnet restore

    接下来,在 Startup.cs 文件中使用如下 using 语句

    using Serilog.Exceptions;

    然后,使用 Serilog.Exceptions 来丰富一下 Logger

    public Startup(IConfiguration configuration, IHostingEnvironment hostingEnvironment)
    {


    Log.Logger = new LoggerConfiguration()
    .Enrich.FromLogContext()
    .Enrich.WithExceptionDetails()
    .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri(elasticUri))
    {
    AutoRegisterTemplate = true,
    })
    .CreateLogger();
    }

    最后,刷新一下,记录一个新的错误,并在 Kibana 中搜索到它,查看更结构化的错误日志记录。

    640?wx_fmt=png

    降低日志级别

    您可能会发现 Information 级别日志有点过于冗长,不符合您的口味。默认情况下,ASP.NET Core 将记录 Kestrel 托管相关的日志事件。这可能会非常嘈杂。排除掉它们的一种简单方法是通过修改 appsettings 文件,将 Microsoft 日志级别设置为 Warning 。
    或者, 您可以通过将 Default 和 System 的最小日志级别设置为 Error 来进一步限制日志记录, 如下所示。

      "Logging": {
    "LogLevel": {
    "Default": "Error",
    "System": "Error",
    "Microsoft": "Warning"
    }
    }



    下载源代码 : https://github.com/thecarlo/elastic-kibana-netcore-serilog
  • 相关阅读:
    mysql 历史版本下载
    mysql 5.7 版本 You must reset your password using ALTER USER statement before executing this statement报错处理
    5.7 zip 版本的安装 以及遇到的坑
    mysql 5.6zip版本的卸载与5.7 zip 版本的安装
    mysql数据库的备份与还原
    本地Navicat连接docker里的mysql
    docker修改数据库密码
    docker 在push镜像到本地registry出现的500 Internal Server Error
    linux 没有界面内容显示不全解决办法
    json与map互相转换
  • 原文地址:https://www.cnblogs.com/yxlblogs/p/12214368.html
Copyright © 2011-2022 走看看