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 或更高版本 ( 下载 )

创建项目文件夹

<span class="hljs-built_in"><span class="hljs-keyword">mkdir elastic-kibana<br><span class="hljs-built_in">cd elastic-kibana</span></span></span>

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

dotnet <span class="hljs-keyword"><span class="hljs-keyword">new mvc -n elastic-kibana -o src</span></span>

在 Visual Studio Code 中打开项目

<span class="hljs-built_in"><span class="hljs-built_in">cd elastic-kibana<br>code .</span></span>

创建 docker compose 文件

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

<span class="hljs-built_in"><span class="hljs-keyword">mkdir docker<br><span class="hljs-built_in">cd docker</span></span></span>

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

<span class="hljs-attribute">version:&#xA0;<span class="hljs-string"><span class="hljs-string">'3.1'<br><br><span class="hljs-attribute">services:<br><br><span class="hljs-attribute">elasticsearch:<br><span class="hljs-attribute">image:&#xA0;docker.elastic.co/elasticsearch/<span class="hljs-attribute">elasticsearch:<span class="hljs-number">6.2<span class="hljs-number">.<span class="hljs-number">4<br><span class="hljs-attribute">container_name:&#xA0;elasticsearch<br><span class="hljs-attribute">ports:<br>    - <span class="hljs-string"><span class="hljs-string">"9200:9200"<br><span class="hljs-attribute">volumes:<br>    - <span class="hljs-attribute">elasticsearch-<span class="hljs-keyword">data:/usr/share/elasticsearch/data<br><span class="hljs-attribute">networks:<br>    - docker-network<br><br><span class="hljs-attribute">kibana:<br><span class="hljs-attribute">image:&#xA0;docker.elastic.co/kibana/<span class="hljs-attribute">kibana:<span class="hljs-number">6.2<span class="hljs-number">.<span class="hljs-number">4<br><span class="hljs-attribute">container_name:&#xA0;kibana<br><span class="hljs-attribute">ports:<br>    - <span class="hljs-string"><span class="hljs-string">"5601:5601"<br><span class="hljs-attribute">depends_on:<br>    - elasticsearch<br><span class="hljs-attribute">networks:<br>    - docker-network<br><br><span class="hljs-attribute">networks:<br><span class="hljs-attribute">docker-network:<br><span class="hljs-attribute">driver:&#xA0;bridge<br><br><span class="hljs-attribute">volumes:<br><span class="hljs-attribute">elasticsearch-<span class="hljs-keyword">data:</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

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

docker-compose up -d

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

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

ElasticSearch

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

asp.net core 使用docker serilog elasticsearch kibana 记录日志

Kibana

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

asp.net core 使用docker serilog elasticsearch kibana 记录日志

加 Nuget 包到项目

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

Serilog
Serilog.Sinks.ElasticSearch
Serilog.Extensions.Logging

<span class="hljs-built_in"><span class="hljs-built_in">cd ..<br><span class="hljs-built_in"><span class="hljs-built_in">cd elastic-kibana</span></span></span></span>
<span class="hljs-selector-tag">dotnet <span class="hljs-keyword"><span class="hljs-selector-tag">add<span class="bash"> <span class="hljs-selector-tag">package <span class="hljs-selector-tag">Serilog<br><span class="hljs-selector-tag">dotnet <span class="hljs-keyword"><span class="hljs-selector-tag">add<span class="bash"> <span class="hljs-selector-tag">package <span class="hljs-selector-tag">Serilog<span class="hljs-selector-class">.Sinks<span class="hljs-selector-class">.ElasticSearch<br><span class="hljs-selector-class">dotnet <span class="hljs-keyword"><span class="hljs-selector-tag">add<span class="bash"> <span class="hljs-selector-tag">package <span class="hljs-selector-tag">Serilog<span class="hljs-selector-class">.Extensions<span class="hljs-selector-class">.Logging<br><span class="hljs-selector-class">dotnet <span class="hljs-selector-tag">restore</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

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

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

{<br><span class="hljs-attr"><span class="hljs-string">"Logging":&#xA0;{<br><span class="hljs-attr"><span class="hljs-string">"LogLevel":&#xA0;{<br><span class="hljs-attr"><span class="hljs-string">"Default":&#xA0;<span class="hljs-string"><span class="hljs-string">"Information",<br><span class="hljs-attr"><span class="hljs-string">"System":&#xA0;<span class="hljs-string"><span class="hljs-string">"Information",<br><span class="hljs-attr"><span class="hljs-string">"Microsoft":&#xA0;<span class="hljs-string"><span class="hljs-string">"Information"<br>    }<br>  },<br><span class="hljs-attr"><span class="hljs-string">"ElasticConfiguration":&#xA0;{<br><span class="hljs-attr"><span class="hljs-string">"Uri":&#xA0;<span class="hljs-string"><span class="hljs-string">"http://localhost:9200/"<br>  }<br>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

在 Startup.cs 中配置日志功能

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

添加这些 using 语句:

<span class="hljs-selector-tag"><span class="hljs-selector-tag">using <span class="hljs-selector-tag"><span class="hljs-selector-tag">Microsoft<span class="hljs-selector-class">.Extensions<span class="hljs-selector-class">.Logging;<br><span class="hljs-selector-tag"><span class="hljs-selector-tag">using <span class="hljs-selector-tag"><span class="hljs-selector-tag">Serilog;<br><span class="hljs-selector-tag"><span class="hljs-selector-tag">using <span class="hljs-selector-tag"><span class="hljs-selector-tag">Serilog<span class="hljs-selector-class">.Sinks<span class="hljs-selector-class">.Elasticsearch;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

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

<span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">public<span class="hljs-function"> <span class="hljs-title">Startup(<span class="hljs-params">IConfiguration configuration, IHostingEnvironment hostingEnvironment)<br>{<br>    <span class="hljs-keyword">var builder = <span class="hljs-keyword"><span class="hljs-keyword">new ConfigurationBuilder()<br>        .SetBasePath(hostingEnvironment.ContentRootPath)<br>        .AddJsonFile(<span class="hljs-string"><span class="hljs-string">"appsettings.json", <span class="hljs-string">optional: <span class="hljs-literal"><span class="hljs-literal">true, <span class="hljs-string">reloadOnChange: <span class="hljs-literal"><span class="hljs-literal">true)<br>        .AddJsonFile(<span class="hljs-string">$<span class="hljs-string"><span class="hljs-string">"appsettings.<span class="hljs-subst">{hostingEnvironment.EnvironmentName}.json", <span class="hljs-string">reloadOnChange: <span class="hljs-literal"><span class="hljs-literal">true, <span class="hljs-string">optional: <span class="hljs-literal"><span class="hljs-literal">true)<br>        .AddEnvironmentVariables();<br><br>    Configuration = builder.Build();<br><br>    <span class="hljs-keyword">var elasticUri = Configuration[<span class="hljs-string"><span class="hljs-string">"ElasticConfiguration:Uri"];<br><br>    Log.Logger = <span class="hljs-keyword"><span class="hljs-keyword">new LoggerConfiguration()<br>        .Enrich.FromLogContext()<br>        .WriteTo.Elasticsearch(<span class="hljs-keyword"><span class="hljs-keyword">new ElasticsearchSinkOptions(<span class="hljs-keyword"><span class="hljs-keyword">new Uri(elasticUri))<br>        {<br>            AutoRegisterTemplate = <span class="hljs-literal"><span class="hljs-literal">true,<br>        })<br>    .CreateLogger();<br>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

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

<span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">public<span class="hljs-function"> <span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">void<span class="hljs-function"> <span class="hljs-title"><span class="hljs-function"><span class="hljs-title">Configure<span class="hljs-params"><span class="hljs-function"><span class="hljs-params">(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)<br>{<br><br><br>    loggerFactory.AddSerilog();<br><br><br>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

开始记录日志到 ElasticSearch

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

asp.net core 使用docker serilog elasticsearch kibana 记录日志

启动 Kibana

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

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

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

asp.net core 使用docker serilog elasticsearch kibana 记录日志

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

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

asp.net core 使用docker serilog elasticsearch kibana 记录日志

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

asp.net core 使用docker serilog elasticsearch kibana 记录日志

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

asp.net core 使用docker serilog elasticsearch kibana 记录日志

在 MVC Controller 中记录自定义消息

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

添加 using 语句:

<span class="hljs-selector-tag"><span class="hljs-selector-tag">using <span class="hljs-selector-tag"><span class="hljs-selector-tag">Microsoft<span class="hljs-selector-class">.Extensions<span class="hljs-selector-class">.Logging;</span></span></span></span></span></span>

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

ILogger<span class="hljs-tag"><span class="hljs-tag"><<span class="hljs-name"><span class="hljs-tag"><span class="hljs-name">HomeController<span class="hljs-tag">> _logger;<br>public HomeController(ILogger<span class="hljs-tag"><span class="hljs-tag"><<span class="hljs-name"><span class="hljs-tag"><span class="hljs-name">HomeController<span class="hljs-tag">> logger)<br>{<br>    _logger = logger;<br>}</span></span></span></span></span></span></span></span></span></span></span></span>

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

<span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">public<span class="hljs-function"> IActionResult <span class="hljs-title"><span class="hljs-function"><span class="hljs-title">Index<span class="hljs-function">(<span class="hljs-params">)<br>{<br>    _logger.LogInformation(<span class="hljs-string"><span class="hljs-string">$"oh&#xA0;hai&#xA0;there!&#xA0;:&#xA0;<span class="hljs-subst"><span class="hljs-string"><span class="hljs-subst">{DateTime.UtcNow}<span class="hljs-string">");<br><br><span class="hljs-keyword"><span class="hljs-keyword">return View();<br>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

在 Kibana 中搜索

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

asp.net core 使用docker serilog elasticsearch kibana 记录日志

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

asp.net core 使用docker serilog elasticsearch kibana 记录日志

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

<span class="hljs-attribute">message:<span class="hljs-string"><span class="hljs-string">"oh hai there"</span></span></span>
<span class="hljs-attribute">level:<span class="hljs-string"><span class="hljs-string">"Information"</span></span></span>
<span class="hljs-selector-tag">fields<span class="hljs-selector-class">.<span class="hljs-string"><span class="hljs-selector-class">ActionName<span class="hljs-selector-pseudo">:<span class="hljs-string"><span class="hljs-selector-pseudo">"elastic_kibana.Controllers.HomeController.Index"</span></span></span></span></span></span></span>
(<span class="hljs-keyword"><span class="hljs-selector-tag">message<span class="hljs-selector-pseudo">:<span class="hljs-string"><span class="hljs-selector-pseudo">"oh <span class="hljs-selector-tag">hai <span class="hljs-selector-tag">there" <span class="hljs-keyword"><span class="hljs-selector-tag">AND&#xA0;<span class="hljs-selector-tag">fields<span class="hljs-selector-class">.ActionName<span class="hljs-selector-pseudo">:<span class="hljs-string"><span class="hljs-selector-pseudo">"elastic_kibana.Controllers.HomeController.Index"<span class="hljs-selector-pseudo">)</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

记录错误日志到 ElasticSearch

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

<span class="hljs-keyword"><span class="hljs-keyword">try<br>{<br><span class="hljs-keyword"><span class="hljs-keyword">throw <span class="hljs-keyword"><span class="hljs-keyword">new <span class="hljs-keyword"><span class="hljs-keyword">Exception(<span class="hljs-string"><span class="hljs-string">"oops. i haz cause error in UR codez.");<br>}<br><span class="hljs-keyword"><span class="hljs-keyword">catch (<span class="hljs-keyword"><span class="hljs-keyword">Exception ex)<br>{<br>    _logger.LogError(ex, <span class="hljs-string"><span class="hljs-string">"ur code iz buggy.");<br>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

在 Kibana 中搜索错误日志

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

<span class="hljs-attribute">level:&#xA0;<span class="hljs-string"><span class="hljs-string">"Error"</span></span></span>

asp.net core 使用docker serilog elasticsearch kibana 记录日志

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

asp.net core 使用docker serilog elasticsearch kibana 记录日志

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

安装 Serilog.Exceptions Nuget 包

安装 Serilog.Exceptions Nuget 包:

dotnet <span class="hljs-keyword">add<span class="bash"> <span class="hljs-keyword">package Serilog.Exceptions<br>dotnet restore</span></span></span>

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

<span class="hljs-attribute"><span class="hljs-selector-tag">using <span class="hljs-selector-tag">Serilog<span class="hljs-selector-class">.Exceptions;</span></span></span></span>

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

<span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">public<span class="hljs-function"> <span class="hljs-title"><span class="hljs-function"><span class="hljs-title">Startup<span class="hljs-params"><span class="hljs-function"><span class="hljs-params">(IConfiguration configuration, IHostingEnvironment hostingEnvironment)<br>{<br><br><br>    Log.Logger = <span class="hljs-keyword"><span class="hljs-keyword">new LoggerConfiguration()<br>        .Enrich.FromLogContext()<br>        .Enrich.WithExceptionDetails()<br>        .WriteTo.Elasticsearch(<span class="hljs-keyword"><span class="hljs-keyword">new ElasticsearchSinkOptions(<span class="hljs-keyword"><span class="hljs-keyword">new Uri(elasticUri))<br>        {<br>            AutoRegisterTemplate = <span class="hljs-keyword"><span class="hljs-keyword">true,<br>        })<br>    .CreateLogger();<br>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

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

asp.net core 使用docker serilog elasticsearch kibana 记录日志

降低日志级别

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

  <span class="hljs-string"><span class="hljs-string">"Logging":&#xA0;{<br><span class="hljs-string"><span class="hljs-string">"LogLevel":&#xA0;{<br><span class="hljs-string"><span class="hljs-string">"Default":&#xA0;<span class="hljs-string"><span class="hljs-string">"Error",<br><span class="hljs-string"><span class="hljs-string">"System":&#xA0;<span class="hljs-string"><span class="hljs-string">"Error",<br><span class="hljs-string"><span class="hljs-string">"Microsoft":&#xA0;<span class="hljs-string"><span class="hljs-string">"Warning"<br>    }<br>  }</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

下载源代码 : https://github.com/thecarlo/elastic-kibana-netcore-serilog

Original: https://www.cnblogs.com/yxlblogs/p/12214368.html
Author: 学亮
Title: asp.net core 使用docker serilog elasticsearch kibana 记录日志

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/534787/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球