为什么是 serilog?
Serilog 是 .NET 中最著名的结构化日志类库.
基于日志事件 log events, 而不是日志消息 log message.
你可以将日志事件格式化为控制台的可读文本或者可以将相同的事件格式化为 JSON 并将其发送到远程日志服务器.
应用程序中的日志语句会创建 LogEvent 对象, 而连接到管道的接收器 [sinks] 会知道如何记录它们.
这里有一篇文章比较了. NET 目前三种最常用的日志组件, 有兴趣可以去看看.
为什么是腾讯云日志服务?
最普通的日志记录大概是直接把日志写入本地文件进行记录, 但是在容器化, 上云的时代, 把日志记录在云端才是更好的方式.
Serilog 有很多 sink 可以将日志记录推送到不同的地方存储. 最常见的有 Elasticsearch, 结合 kibana 展示日志数据, 但是通常需要我们额外搭建 Elasticsearch 服务和 kibana 服务.
腾讯云有一个日志服务, 可以给我们提供存储和索引功能, 基本可以满足我们日常的需要还不需要额外搭建服务.
日志服务主要提供以下功能:
日志采集: 通过 LogListener,API 等方式从不同日志采集端采集日志至日志服务.
日志存储: 使用日志服务存储日志数据.
日志索引: 开启日志索引对日志进行查询, 可帮助用户快速定位日志问题.
日志投递: 用户可以将指定日志投递至其他云产品中, 满足存储或其他计算需求. 如指定的 COS 存储桶中, 对日志进行生命周期管理等, 满足日志审计需求.
具体内容可查看日志服务产品文档
使用腾讯云日志服务
在日志集管理里面我们可以创建我们自己的日志集, 可以自定义日志保存时间.
同时新建一个日志主题, 这里我们是属于日志投递的功能, 所以我们不需要开启 LogListener.
新建日志主题之后若我们需要使用日志服务的检索功能的话, 需要手动打开, 不然是无法检索到已经投递的日志的喔~ 在日志主题里面的索引配置里面打开开关保存即可.
好了, 日志主题新建完了, 接下来我们要如何把日志投递到腾讯云呢.
将日志投递到腾讯云日志服务
问题来了, serilog 的 sink 里面并没有 tencentCloud 的库, 怎么办呢, 那我们来造一个轮子吧.
在产品的 API 文档我们可以看到有这个上传结构化日志的接口
我们可以通过 http 请求讲日志上传到腾讯云, 在 GitHub 上面 serilog 的众多 sink 中, 有一个 serilog.sink.http 的库, 是使用 http 请求推送日志的, 我们 down 下来参考一下修改修改.
然后我就搞了个(/ω\)
使用方式也很简单(/ω\)GitHub 上面 readme 上面有一个很简陋的说明.
然后呢, 引用这个库, 我们在 ASP.NET core 里面把这个扩展加入 serilog, 最简单的方法如下:
在入口 main()函数中加入下面代码.
- Log.Logger = new LoggerConfiguration()
- .WriteTo.TencentCloud("请求域名(ap-guangzhou.cls.myqcloud.com)", "topic_id", "TencentCloud API Sercet Id", "TencentCloud API Sercet Key", restrictedToMinimumLevel: LogEventLevel.Warning)
- .CreateLogger()
或者在 IwebHostBuilder 的 UseSeriLog()中进行配置:
- public static IWebHost BuildWebHostInternal(string[] args) =>
- new WebHostBuilder()
- .UseKestrel()
- .UseContentRoot(Directory.GetCurrentDirectory())
- .UseStartup<Startup>()
- .ConfigureAppConfiguration((context, configuration) =>
- {
- configuration.SetBasePath(Directory.GetCurrentDirectory())
- .AddJsonFile("appsettings.json")
- .AddJsonFile($"appsettings.{context.HostingEnvironment.EnvironmentName}.json", true, true)
- .AddEnvironmentVariables();
- })
- .UseSerilog((context, logger) =>
- {
- logger.Enrich.FromLogContext()
- .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
- .WriteTo.TencentCloud("ap-guangzhou.cls.myqcloud.com", "","", "", restrictedToMinimumLevel: LogEventLevel.Debug)
- ;
- }
- )
- .Build();
也可以通过配置文件进行配置, 需要引用 Serilog.Settings.Configuration 这个扩展包, 然后再配置文件中加如如下配置
- "Serilog": {
- "Using": [ "Serilog.Sinks.TencentCloud" ],
- "MinimumLevel": "Debug",
- "WriteTo": [
- {
- "Name": "TencentCloud",
- "Args": {
- "requestBaseUri": "ap-guangzhou.cls.myqcloud.com",
- "topicId": "",
- "secretId": "",
- "secretKey": ""
- }
- }
- ]
- },
然后在 IWebHostBuilder 的 UseSeriLog()中进行配置:
- public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
- WebHost.CreateDefaultBuilder(args)
- .ConfigureAppConfiguration((context, configuration) =>
- {
- configuration.SetBasePath(Directory.GetCurrentDirectory())
- .AddJsonFile("appsettings.json")
- .AddJsonFile($"appsettings.{context.HostingEnvironment.EnvironmentName}.json", true, true)
- .AddEnvironmentVariables();
- })
- .UseSerilog((context, logger) =>
- {
- logger.ReadFrom.Configuration(context.Configuration);
- })
- .UseStartup<Startup>();
配置完成后启动应用程序日志就会自动记录并推送到腾讯云日志服务了.
检索日志集
打开腾讯云日志服务, 选择日志集点击检索, 前提得已经打开索引配置喔.
我们可以看到已经把结构化的日志信息全都投递到日志服务了,
输入关键字可以进行全文搜索我们想要的日志, 比如我搜索 warning, 和 exception, 即可检索出 warning 级别和 exception 的日志信息
搞完
这样就成功使用 serilog 将日志推送到腾讯云日志服务啦(/ω\)
大佬们看了有什么建议欢迎评论提出(/ω\)
来源: https://www.cnblogs.com/fanshaoO/p/11023271.html