问题描述
我的应用程序是.NET Core 3.1。基于,我正在使用Serilog进行日志记录。我用来存储日志的接收器是AzureTableStorage。 将日志写入Azure Table Storage时,是否可以设置一个选项来创建表(如果不存在)?一旦启动应用程序便创建了表,但是如果我想动态创建表(例如按天)怎么办?
提前谢谢!
解决方法
听起来,您实际上是在{roll}版本的Serilog.Sinks.AzureTableStorage接收器之后,每天创建一个新表,并且还可以抵抗该表在应用程序运行时突然消失的情况。这些接收器当前均不支持其当前形式的任何东西,因此您必须创建自己的ILogEventSink
才能实现所追求的目标。要考虑的一些事情:
- 一个不错的起点可能是查看现有的
AzureBatchingTableStorageSink
。 - 要处理在应用程序运行时删除表的情况,请注意
CreateIfNotExists()
方法在每次调用blob服务时都会向其发出HTTP请求,因此对于每个日志事件都要这样做(或批处理)将有效地增加接收器发出的HTTP请求数量。相反,您可以乐观地向表中写入事件,并仅在收到指示表不存在的错误代码时才创建表。 - 必须基于
LogEvent.Timestamp
属性动态确定表名。由于您的事件日志记录机制需要考虑不存在的表(如上所述),因此,真正的名称更改时并不需要显式创建新表。当您尝试编写日志事件时,这应该会自动发生。