Serilog:无法使用 MongoDb 接收器登录到 MongoDb
Posted
技术标签:
【中文标题】Serilog:无法使用 MongoDb 接收器登录到 MongoDb【英文标题】:Serilog: cannot log to MongoDb using MongoDb sink 【发布时间】:2014-09-03 01:26:33 【问题描述】:我有一个本地 MongoDb 数据库实例(通过从 Windows 命令行运行 mongod 创建)和一个简单的控制台程序,它尝试使用 Serilog 及其 MongoDb 接收器将字符串记录到 MongoDb 数据库:
var log = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.ColoredConsole()
.WriteTo.MongoDB("mongodb://localhost/mydb")
.CreateLogger();
log.Fatal("Fatal message");
“致命消息”消息已正确写入控制台,但未正确写入我的 MongoDb 数据库。
我当前的 MongoDb 数据库是“mydb”。根据“显示集合”,我只有集合 system.indexes 和 testData,而“db.testData.find()”什么也没产生。
Serilog 网站说要使用连接字符串“mongo://mydb/log”,但这会引发异常“在 MongoDB.Driver.dll 中发生类型为 'System.FormatException' 的未处理异常”。我在代码中使用的连接字符串在 MongoDb 站点上指定,地址为 http://docs.mongodb.org/manual/reference/connection-string/
如何使用 Serilog 登录到 MongoDb?
【问题讨论】:
【参考方案1】:您可能只是遇到了默认的(两秒?)缓冲延迟 - 如果您在 Windows 中关闭控制台应用程序,它会硬终止程序,因此无法始终刷新缓冲区。如果是这样,在关闭应用程序之前等待几秒钟将解决此问题。
否则,在 Serilog 中解决所有 sink 调试的方法是设置SelfLog.Out
:
SelfLog.Out = Console.Error;
这将打印接收器引发的任何异常,让您可以快速放大错误所在位置。
【讨论】:
谢谢,我试试看。有没有办法将缓冲延迟设置为 0?这将使测试变得更加容易。 传递period: TimeSpan.Zero
应该可以。
(虽然几毫秒可能更理智 - 零完全未经测试的 IIRC :))
我在哪里传递“期间:TimeSpan.Zero”?可以给个代码示例吗?
.WriteTo.MongoDB("mongodb://localhost/mydb", period: TimeSpan.FromMilliseconds(1))
【参考方案2】:
我接受了 Nicholas 和 redwards 的答案(感谢你们俩!),进行了更多实验,并在以下位置捕获了结果: http://jsnlog.com/Documentation/GetStartedLogging/StructuredLogging
【讨论】:
【参考方案3】:有趣的是,在我将连接字符串切换为
之前,我得到了完全相同的错误mongodb://myMachineName/mydb
之前,我有 mongo://localhost/mydb。
但是,虽然 mongo vs mongodb 解决了异常问题,但它并没有将记录插入 mydb!所以我把它改成了
.WriteTo.MongoDB("mongodb://localhost/logs", restrictedToMinimumLevel: LogEventLevel.Verbose)
现在它正在工作! “logs”是使用“log”作为保存 JSON 数据的集合创建的。
【讨论】:
以上是关于Serilog:无法使用 MongoDb 接收器登录到 MongoDb的主要内容,如果未能解决你的问题,请参考以下文章
无法从Windows服务中托管的Asp.net核心网站启动多个Serilog接收器