为什么是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下来参考一下修改修改。
然后我就搞了个serilog.sinks.tencentcloud(/ω\)

使用方式也很简单(/ω\)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将日志推送到腾讯云日志服务啦(/ω\)
serilog.sinks.tencentcloud https://github.com/fanslead/serilog.sinks.tencentcloud 这个库的地址在这,欢迎大家帮忙改进哈~~
大佬们看了有什么建议欢迎评论提出(/ω\)