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接收器

无法使用 Serilog 从 HttpContext 访问用户声明以进行日志记录

哪个 Serilog 接收器用于发送到 Logstash?

根据上下文源将 Serilog 日志过滤到不同的接收器?

每个功能的 serilog 多个实例

关于c#:Filter Serilog日志取决于上下文源到不同的接收器?