【问题标题】:Serilog log statement disappears after first log statementSerilog 日志语句在第一个日志语句后消失
【发布时间】:2017-03-14 17:40:40
【问题描述】:

我正在使用 .NET Framework 4.6.1。在 Serilog 之上开发了一个记录器组件,并希望使用 Azure Document Db sink。我有一个奇怪的行为。我的第一个日志语句出现在 Document Db 中,但是在应用程序重新启动后,后续的日志消息不会出现。

    internal class SeriLogger : ILogger
    {

        private static readonly string EndpointUri = "https://mysample.documents.azure.com:443/";
        private static readonly string AuthKey = "UkgOMJT08bA5KOvd1O9IYgo0w==";
        private static readonly string DatabaseName = "Diagnostics";
        private static readonly string CollectionName = "Logs";

        protected readonly Serilog.Core.Logger logger;

        public SeriLogger()
        {
            logger = new LoggerConfiguration()
            .WriteTo.AzureDocumentDB(EndpointUri, AuthKey, DatabaseName, CollectionName)
                .CreateLogger();
            //logger = new LoggerConfiguration()
            //.WriteTo.RollingFile(Path.Combine(
            //    AppDomain.CurrentDomain.BaseDirectory, "log-{Date}.txt"), fileSizeLimitBytes: 536870912)
            //    .CreateLogger();
        }

public void Log(string message, LogLevelEnum logLevel)
        {
            switch (logLevel)
            {
                case LogLevelEnum.Debug: logger.Debug(message); break;
                case LogLevelEnum.Information: logger.Information(message); break;
                case LogLevelEnum.Warning: logger.Warning(message); break;
                case LogLevelEnum.Error: logger.Error(message); break;
                case LogLevelEnum.Fatal: logger.Fatal(message); break;
            }
        }

我第一次调用 Log() 方法会创建一个新文档,但这会从第二次调用病房时停止。如果我重新启动应用程序,第一次调用会创建一个日志条目作为新文档,之后不再工作。知道我做错了什么吗?以下是我正在使用的 Nuget 版本

<packages>
  <package id="Microsoft.Azure.DocumentDB" version="1.11.1" targetFramework="net461" />
  <package id="Newtonsoft.Json" version="6.0.8" targetFramework="net461" />
  <package id="Serilog" version="2.4.0" targetFramework="net461" />
  <package id="Serilog.Sinks.AzureDocumentDb" version="3.5.18" targetFramework="net461" />
  <package id="Serilog.Sinks.File" version="3.2.0" targetFramework="net461" />
  <package id="Serilog.Sinks.RollingFile" version="3.3.0" targetFramework="net461" />
</packages>

但日志记录与滚动文件接收器完美配合。请帮帮我。

我尝试为 serilog 启用诊断功能,如下所示Serilog.Debugging.SelfLog.Enable(msg =&gt; Debug.WriteLine(msg)); 现在我可以在我的 VS 输出窗口中看到两行。 2017-03-14T07:40:18.5291346Z 将 2 条消息批量发送到 DocumentDB 2017-03-14T07:40:22.1107764Z 发生一个或多个错误。

【问题讨论】:

  • 确保在应用关闭时释放 logger - 可能需要刷新批处理事件。
  • 您好,我尝试使用后处理。但是日志消息甚至没有到达 Document Db(甚至不是第一次)。我正在使用 .NET 4.6.1,这会是一个原因吗?
  • 我试图为 serilog 启用诊断,如下所示 Serilog.Debugging.SelfLog.Enable(msg => Debug.WriteLine(msg));现在我可以在我的 VS 输出窗口中看到两行 2017-03-14T07:40:18.5291346Z 将 2 条消息批量发送到 DocumentDB 2017-03-14T07:40:22.1107764Z 发生一个或多个错误。

标签: azure logging azure-cosmosdb serilog


【解决方案1】:

我根据您的代码对其进行了测试,在文档数据库中没有创建用于记录消息的文档。 但是如果我添加WriteTo.Console(),那么它就可以正常工作。请尝试使用以下代码。

logger = new LoggerConfiguration().WriteTo.Console()
             .WriteTo.AzureDocumentDB(EndpointUri, AuthKey, DatabaseName, CollectionName)
                 .CreateLogger();

以下是我的详细步骤。

  1. 使用 .net framework 4.6.1 创建控制台应用程序

  2. 添加一个名为SeriLogger的类

  1. 在 pramgram.cs 中添加测试代码

  1. 在控制台和 Azure 门户中检查结果

packages.config 文件

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Microsoft.Azure.DocumentDB" version="1.11.1" targetFramework="net461" />
  <package id="Newtonsoft.Json" version="6.0.8" targetFramework="net461" />
  <package id="Serilog" version="2.3.0" targetFramework="net461" />
  <package id="Serilog.Sinks.AzureDocumentDb" version="3.5.18" targetFramework="net461" />
  <package id="Serilog.Sinks.Console" version="2.1.0" targetFramework="net461" />
</packages>

【讨论】:

  • 嗨,汤姆,我也试过了。但问题依然存在。看起来我观察到了这种模式。如果集合为空,它将创建第一条日志消息,之后不会创建任何内容。如果您清空集合,它将再次创建第一个文档并在之后停止。
  • 就我而言,我无法重现您提到的问题。但是如果我不添加代码.WriteTo.Console(),将不会创建任何内容。我将用我的详细步骤更新答案。希望有用。
  • @TomSun-MSFT Serilog 的SelfLog 在输出窗口中产生的错误是:2017-03-14T07:40:22.1107764Z One or more errors occurred.(请参阅问题帖子中的 cmets。)有什么线索吗?干杯!
  • 感谢汤姆和尼古拉斯的投入。我还没有弄清楚我的代码/环境有什么问题。我什至在 Azure 中作为 Web 应用程序托管,但问题仍然存在。我正在考虑离开 Serilog 并继续使用 log4net。有一篇关于为 Doc DB korrozia.blogspot.in/2016/11/… 添加附加程序的博客文章。希望它会奏效。任何 cmets 都欢迎
  • 嘿,看起来是水槽的问题。我打开了一个问题github.com/serilog/serilog-sinks-azuredocumentdb/issues/48。我有一个笼统的问题。我可以将这个水槽用于生产吗?它们足够稳定吗?
猜你喜欢
  • 2016-12-16
  • 1970-01-01
  • 2013-12-11
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多