当前位置: 欣欣网 > 码农

实时洞察:ASP.NET Core结合NLog构建ELK日志分析平台

2024-02-23码农

随着微服务架构和容器化技术的广泛应用,日志管理成为了系统运维和故障排查的重要工具。为了高效收集、存储、查询和分析应用程序的日志信息,许多企业选择了ELK(Elasticsearch、Logstash和Kibana)这一强大的日志分析平台。本文将介绍如何在ASP.NET Core应用程序中结合NLog日志框架,搭建ELK实时日志分析平台,以实现日志的集中管理、实时搜索和可视化分析。

一、环境准备

在开始之前,确保已安装以下组件:

  • Elasticsearch:用于存储和索引日志数据。

  • Logstash:用于日志的收集、解析和转换。

  • Kibana:用于可视化和分析存储在Elasticsearch中的日志数据。

  • ASP.NET Core:用于构建Web应用程序。

  • NLog:用于ASP.NET Core应用程序的日志记录。

  • 二、配置NLog

    在ASP.NET Core项目中,首先安装NLog的NuGet包。然后,在项目根目录下创建或修改 NLog.config 配置文件,添加以下配置:

    <?xml version="1.0" encoding="utf-8" ?>
    <nlogxmlns="http://www.nlog-project.org/schemas/NLog.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
    autoReload="true"
    throwExceptions="false"
    internalLogLevel="Info"internalLogFile="C:\temp\nlog-internal.log">

    <targets>
    <targetxsi:type="AsyncWrapper"name="AsyncFile"overflowAction="Discard">
    <targetxsi:type="File"name="File"fileName="C:\logs\app-${shortdate}.log"
    layout="${longdate} ${level} ${message} ${exception} ${newline}" />

    </target>
    <targetxsi:type="Logstash"name="Logstash">
    <connectionString>http://localhost:5000</connectionString>
    <layoutxsi:type="JsonLayout">
    <attributename="timestamp"layout="${date:format=o}" />
    <attributename="level"layout="${level}" />
    <attributename="message"layout="${message}" />
    <attributename="exception"layout="${exception}" />
    </layout>
    </target>
    </targets>
    <rules>
    <loggername="*"minlevel="Debug"writeTo="AsyncFile,Logstash" />
    </rules>
    </nlog>

    在上面的配置中,我们定义了两个目标(Target): AsyncFile Logstash AsyncFile 将日志记录到本地文件,而 Logstash 则将日志发送到Logstash进行进一步处理。

    三、配置Logstash

    Logstash的配置文件通常位于 /etc/logstash/conf.d/ 目录下,创建或编辑一个配置文件,如 aspnetcore.conf ,添加以下内容:

    input {
    http {
    host => "localhost"
    port => 5000
    codec => json_lines
    }
    }
    filter {
    date {
    match => ["timestamp", "ISO8601"]
    }
    }
    output {
    elasticsearch {
    hosts => ["localhost:9200"]
    index => "aspnetcore-logs-%{+YYYY.MM.dd}"
    }
    }

    上述配置中,Logstash通过HTTP输入插件接收NLog发送的JSON格式日志,使用日期过滤器解析日志中的时间戳,并将处理后的日志输出到Elasticsearch中。

    四、在ASP.NET Core中使用NLog

    在ASP.NET Core项目中,通过依赖注入配置NLog。在 Startup.cs ConfigureServices 方法中注册NLog服务:

    publicvoidConfigureServices(IServiceCollection services)
    {
    services.AddNLog(); // 注册NLog服务
    // ...
    }

    Program.cs 中配置NLog作为日志工厂:

    public classProgram
    {
    publicstaticvoidMain(string[] args)
    {
    var logger = NLog.Web.NLogBuilder.ConfigureNLog("NLog.config").GetCurrent classLogger();
    try
    {
    logger.Info("Starting web host");
    CreateHostBuilder(args).Build().Run();
    }
    catch (Exception