在 ASP.NET Core 中使用 Serilog 使用 Fluentd 将日志写入 Elasticsearch
yund56 2025-05-21 05:35 14 浏览
原文来自:https://andrewlock.net/writing-logs-to-elasticsearch-with-fluentd-using-serilog-in-asp-net-core/
对于在 Kubernetes 中运行的应用程序,将日志消息存储在一个中心位置尤为重要。我认为这对所有应用程序都很重要,无论您使用的是 Kubernetes 还是 docker,但 pod 和容器的短暂性质使得后一种情况特别重要。
如果您没有集中存储容器中的日志,那么如果容器崩溃并重新启动,日志可能会永远丢失。
有很多方法可以实现这一目标。您可以直接从您的应用程序登录Elasticsearch或Seq,或者登录到Elmah.io等外部服务。一种常见的方法是使用 Fluentd 从容器的控制台输出中收集日志,并将这些日志通过管道传输到 Elasticsearch 集群。
默认情况下,ASP.NET Core 中的控制台日志输出格式为人类可读格式。如果您采用 Fluentd/Elasticsearch 方法,您需要确保您的控制台输出采用 Elasticsearch 可以理解的结构化格式,即 JSON。
在这篇文章中,我描述了如何将 Serilog 添加到 ASP.NET Core 应用程序,以及如何自定义 Serilog 控制台接收器的输出格式,以便您可以使用 Fluentd 将控制台输出通过管道传输到 Elasticsearch。
请注意,也可以将 Serilog 配置为使用Elasticsearch sink直接写入Elasticsearch。如果您没有使用 Fluentd,或者没有将您的应用程序容器化,那么这是一个不错的选择。
将日志写入控制台输出
当您从模板创建新的 ASP.NET Core 应用程序时,您的程序文件将如下所示(至少在 .NET Core 2.1 中):
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
静态辅助方法WebHost.CreateDefaultBuilder(args)创建一个WebHostBuilder并连接许多标准配置选项[1]。默认情况下,它配置控制台和调试记录器提供程序:
.ConfigureLogging((hostingContext, logging) =>
{
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
logging.AddConsole();
logging.AddDebug();
})
如果您从命令行使用 运行您的应用程序dotnet run,您将在控制台中看到每个请求的日志。下面显示了来自浏览器的两个请求生成的日志 - 一个用于主页,另一个用于 favicon.ico。
使用默认控制台记录器的控制台输出
不幸的是,控制台记录器在如何写入日志方面没有提供很大的灵活性。您可以选择包含 scopes或禁用颜色,但仅此而已。
ASP.NET Core 中默认Microsoft.Extensions.Logging基础结构的替代方法是使用 Serilog进行日志记录,并将其作为标准 ASP.NET Core 记录器进行连接。
将 Serilog 添加到 ASP.NET Core 应用程序
Serilog是一个成熟的开源项目,早于 ASP.NET Core 中的所有日志记录基础结构。在许多方面,ASP.NET Core 日志记录基础结构似乎以 Serilog 为模型:Serilog 具有类似的配置选项和可插拔的“接收器”来控制写入日志的位置。
开始使用 Serilog 的最简单方法是使用Serilog.AspNetCore NuGet 包。使用以下命令将其添加到您的应用程序中:
dotnet add package Serilog.AspNetCore
您还需要添加一个或多个“sink”包,以控制日志的写入位置。在这种情况下,我将安装控制台接收器,但如果您想一次写入多个目的地,您也可以添加其他接收器。
dotnet add package Serilog.Sinks.Console
Serilog.AspNetCore 包UseSerilog()在WebHostBuilder实例上提供了一个扩展方法。这用ILoggerFactorySerilog 的实现替换了默认值。您可以传入现有Serilog.ILogger实例,也可以内联配置记录器。例如,以下代码配置将写入的最低日志级别 ( info) 并注册控制台接收器:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseSerilog((ctx, config) =>
{
config
.MinimumLevel.Information()
.Enrich.FromLogContext()
.WriteTo.Console();
})
.UseStartup<Startup>();
}
当您使用 Serilog 而不是默认记录器时再次运行应用程序会提供以下控制台输出:
使用 Serilog 而不是默认的控制台记录器的控制台输出
输出类似于默认记录器,但重要的是它是非常可配置的。您可以随意更改输出模板。例如,您可以通过包含SourceContext参数来显示生成日志的类的名称。
有关 Serilog.AspNetCore 包的更多详细信息和示例,请参阅 GitHub 存储库[2]。有关控制台格式选项,请参阅Serilog.Sinks.Console 存储库[3]。
除了对输出模板的简单更改外,控制台接收器还允许完全控制消息的呈现方式。我们将使用该功能将日志呈现为 Fluentd 的 JSON,而不是人性化的格式。
自定义Serilog Console Sink的输出格式写入JSON
要更改数据的呈现方式,您可以添加自定义ITextFormatter. Serilog 包含一个JsonFormatter您可以使用的,但建议您考虑使用Serilog.Formatting.Compact包[4]:
“CompactJsonFormatter与 Serilog 的默认值相比,大大减少了小日志事件的字节数JsonFormatter,同时保持人类可读。它通过更短的内置属性名称、更精简的格式以及排除冗余信息来实现这一点。”
我们不会将这个包用于我们的 Fluentd/Elasticsearch 用例,但我将展示如何在任何情况下插入它。使用 添加包dotnet add package Serilog.Formatting.Compact,创建格式化程序的新实例,并将其传递给调用中的WriteTo.Console()方法UseSerilog():
.UseSerilog((ctx, config) =>
{
config
.MinimumLevel.Information()
.Enrich.FromLogContext()
.WriteTo.Console(new CompactJsonFormatter());
})
现在,如果您运行您的应用程序,您将看到以 JSON 格式写入控制台的日志:
使用 CompactJsonFormatter 以 JSON 格式写入控制台的日志图像
这个格式化程序可能对您有用,但就我而言,我希望编写 JSON 以便 Elasticsearch 能够理解它。您可以看到紧凑的 JSON 格式(在下面打印得很漂亮),正如承诺的那样,为时间戳 ( @t)、消息模板 ( @mt) 和呈现的消息 ( @r)使用了紧凑的名称:
{
"@t": "2018-05-17T10:23:47.0727764Z",
"@mt": "{HostingRequestStartingLog:l}",
"@r": [
"Request starting HTTP\/1.1 GET http:\/\/localhost:5000\/ "
],
"Protocol": "HTTP\/1.1",
"Method": "GET",
"ContentType": null,
"ContentLength": null,
"Scheme": "http",
"Host": "localhost:5000",
"PathBase": "",
"Path": "\/",
"QueryString": "",
"HostingRequestStartingLog": "Request starting HTTP\/1.1 GET http:\/\/localhost:5000\/ ",
"EventId": {
"Id": 1
},
"SourceContext": "Microsoft.AspNetCore.Hosting.Internal.WebHost",
"RequestId": "0HLDRS135F8A6:00000001",
"RequestPath": "\/",
"CorrelationId": null,
"ConnectionId": "0HLDRS135F8A6"
}
对于最简单的 Fluentd/Elasticsearch 集成,我希望使用标准 Elasticsearch 名称(例如@timestamp时间戳)输出 JSON 。幸运的是,所需要的只是更换格式化程序。
使用与 Elasticsearch 兼容的 JSON 格式化程序
该
Serilog.Sinks.Elasticsearch
包包含正是我们所需要的格式
ElasticsearchJsonFormatter。这使用标准 Elasticsearch 字段(如@timestamp和 )呈现数据fields。
不幸的是,目前除了复制和粘贴源代码首先检查许可证之外,将格式化程序添加到您的项目的唯一方法是安装整个Serilog.Sinks.Elasticsearch包,它有很多依赖项。
理想情况下,我希望将格式化程序视为它自己的独立包,就像Serilog.Formatting.Compac
一我提出了一个问题[5]如果这对您来说不是问题(这对我来说不是问题,因为我已经依赖Elasticsearch.Net,那么添加 Elasticsearch Sink 来访问格式化程序是最简单的解决方案。使用添加接收器dotnet add package
Serilog.Sinks.ElasticSearch,并更新您的 Serilog 配置使用
ElasticsearchJsonFormatter:
.UseSerilog((ctx, config) =>
{
config
.MinimumLevel.Information()
.Enrich.FromLogContext()
.WriteTo.Console(new ElasticsearchJsonFormatter();
})
连接此格式化程序后,控制台输出将包含常见的 Elasticsearch 字段,如@timestamp,如下面(漂亮打印)输出所示:
{ "@timestamp": "2018-05-17T22:31:43.9143984+12:00", "level": "Information", "messageTemplate": "{HostingRequestStartingLog:l}", "message": "Request starting HTTP\/1.1 GET http:\/\/localhost:5000\/ ", "fields": { "Protocol": "HTTP\/1.1", "Method": "GET", "ContentType": null, "ContentLength": null, "Scheme": "http", "Host": "localhost:5000", "PathBase": "", "Path": "\/", "QueryString": "", "HostingRequestStartingLog": "Request starting HTTP\/1.1 GET http:\/\/localhost:5000\/ ", "EventId": { "Id": 1 }, "SourceContext": "Microsoft.AspNetCore.Hosting.Internal.WebHost", "RequestId": "0HLDRS5H8TSM4:00000001", "RequestPath": "\/", "CorrelationId": null, "ConnectionId": "0HLDRS5H8TSM4" }, "renderings": { "HostingRequestStartingLog": [ { "Format": "l", "Rendering": "Request starting HTTP\/1.1 GET http:\/\/localhost:5000\/ " } ] }}
现在日志以一种可以直接从 Fluentd 传输到 Elasticsearch 的格式呈现。我们可以只写到控制台。
根据托管环境在输出格式化程序之间切换
最后的提示。如果您想在本地开发时获得人类可读的控制台输出,并且只在 Staging 或 Production 中使用 JSON 格式化程序怎么办?
这很容易实现,因为UseSerilog扩展提供了IHostingEnvironment通过WebHostBuilderContext. 例如,在以下代码段中,我将应用程序配置为在开发中使用人类可读的控制台,并在其他环境中使用 JSON 格式化程序。
.UseSerilog((ctx, config) =>
{
config
.MinimumLevel.Information()
.Enrich.FromLogContext();
if (ctx.HostingEnvironment.IsDevelopment())
{
config.WriteTo.Console();
}
else
{
config.WriteTo.Console(new ElasticsearchJsonFormatter());
}
})
除了环境之外,您还可以根据通过IConfiguration对象 at提供的配置值进行切换ctx.Configuration。
概括
将日志存储在一个中心位置很重要,尤其是在您构建容器化应用程序时。一种可能的解决方案是将日志输出到控制台,让 Fluentd 监控控制台,并将输出通过管道传输到 Elasticsearch 集群。在这篇文章中,我描述了如何将 Serilog 日志记录添加到您的 ASP.NET Core 应用程序并将其配置为以 Elasticsearch 期望的 JSON 格式将日志写入控制台。
References
[1] 连接许多标准配置选项: https://github.com/aspnet/MetaPackages/blob/2.1.0-rc1-final/src/Microsoft.AspNetCore/WebHost.cs#L150
[2] 请参阅 GitHub 存储库: https://github.com/serilog/serilog-aspnetcore
[3] Serilog.Sinks.Console 存储库: https://github.com/serilog/serilog-sinks-console
[4] 考虑使用Serilog.Formatting.Compact包: https://github.com/serilog/serilog-formatting-compact
[5] 我提出了一个问题:
https://github.com/serilog/serilog-sinks-elasticsearch/issues/176
相关推荐
- 分享|最美色彩!40张纯迷彩高清原图壁纸送给你
-
最美的色彩是什么?对于军人来说是迷彩那是青春的本色是理想、使命的颜色40张纯迷彩高清原图壁纸送给你so快来收图!!军报记者微信发布作者:剑客小吉;编辑:王旭;编审:曲延涛;投稿邮箱:jfjbwx@16...
- 你还在用百度搜图?推荐5个图片素材库,你要的图片都有!
-
自媒体运营人每天都需要进行内容创作,所以少不了图片、视频、文案素材等,那么这些自媒体素材哪里找呢?今天,就给大家分享5个图片和视频素材库,文案素材下期再给大家详细介绍。图片和视频素材现在已经是做短视频...
- 《2》图片原创无版权素材
-
粉樱于雨中轻轻摇曳,花瓣飘呀飘的,落在小径上、湖面上,将世界晕染成柔和的粉色。雨滴似银线,串联起天空与湖水,古亭在一旁静静凝望,连空气都透着甜意。我们一直在寻觅“诗意”的模样,原来就是这般——有落花纷...
- 全网最全的图片素材网站分享!任意下载!值得收藏!
-
自媒体时代,很多内容创作者都需要高清的图片资源。因为图片不清晰会带来不好的用户体验~众所周知,从网上下载的图片一般都是有版权的!如果你直接下载使用,可能会有侵权的风险!今天为了帮助大家解决图片问题,今...
- 中秋节素材(海报+插画)!绝景良时难再并
-
部分预览随机选取中秋节素材(海报+插画)(仅供会员下载)...
- 10张早上好美图,早安祝福语和祝福图片选集
-
每天准时分享接收:早安问候图片、漂亮的早安图片、问候祝福语、动态聊天表情包等等每日的祝福准时送达,愿你用满满的正能量开启新的一天。美满,是日常的点点汇聚;情谊,是时光的悠悠长卷;一声招呼,穿越五湖四海...
- 晚安心语正能量经典素材带图片,让你一见倾心
-
一、没事的,每个人大概都会经历一些情绪崩溃或者极端的时刻,会好的,会熬过来的。二、以后,只对两种人好,一种是对我好的人,一种是懂得我的好的人,一个人的温暖也是有限的啊,一点都不能浪费。三、要钱,就要努...
- 太厉害了,52种科幻画主题创意素材,极其脑洞大开,科技创新未来
-
图片来自网络,仅作分享,如有侵权请联系删除哦...
- 综合绘画素材—29张冬天主题绘画素材,一起来画你心中的冬天呀
-
图片来自,仅作分享,如有侵权请联系删除哦...
- 20张彩色线描装饰画素材!一起欣赏线条带来的艺术美呀!
-
图片来自网络,仅作分享,如有侵权请联系删除哦...
- 国外的免费素材网站!这3个大神私藏款,你还没用过?
-
做PPT没素材?去网上找了半天,浪费时间不说,大部分还收费,等于白忙活!不少小伙伴也问我有没有免费好用的素材网站,这不就来了。今天和大家分享3个国外的素材网站,关键是免费又高质量。不管是PPT设计还是...
- 8个高清无版权的图片资源网站,质量高又免费,够你用一辈子
-
很多时候我们找素材总是要花费很多时间,今天就给大家分享8个,高清无版权的图片资源网站,质量高又免费,够你用一辈子。01*Logosc链接:https://www.logosc.cn/so/这是一个免版...
- 100种超萌手帐素材简笔画,小白看一遍也能学会
-
手帐素材集中营:天气、美食、植物花草、动物、人物、乐器都在这里。一次画个够,转存轻松做手帐~爱画画,爱生活~...
- 超治愈萌系手帐素材大全 美食旅游花草人物花边都备齐了
-
现代人每天都生活在一个充满焦灼感的空气中,成年人的世界里,每个人都不容易。不论是生活还是工作,都充满了各种挫折。很少有人能一帆风顺,为学习、为工作、为家庭、为感情、我们总会在坎坎坷坷中成长,难免会觉得...
- 一周热门
- 最近发表
- 标签列表
-
- filter函数js (37)
- filter函数excel用不了 (73)
- 商城开发 (40)
- 影视网站免费源码最新版 (57)
- 影视资源api接口 (46)
- 网站留言板代码大全 (56)
- java版软件下载 (52)
- java教材电子课本下载 (48)
- 0基础编程从什么开始学 (50)
- java是用来干嘛的 (51)
- it入门应该学什么 (55)
- java线上课程 (55)
- 学java的软件叫什么软件 (38)
- 程序开发软件有哪些 (53)
- 软件培训 (59)
- 机器人编程代码大全 (50)
- 少儿编程教程免费 (45)
- 新代系统编程教学 (61)
- 共创世界编程网站 (38)
- 亲测源码 (36)
- 三角函数积分公式表 (35)
- 函数的表示方法 (34)
- 表格乘法的公式怎么设置 (34)
- sumif函数的例子 (34)
- 图片素材 (36)