Azure Serilog Seq接收器不总是捕获事件

Azure Serilog Seq接收器不总是捕获事件,azure,asp.net-core,serilog,seq-logging,getseq,Azure,Asp.net Core,Serilog,Seq Logging,Getseq,我正在Azure实例(Windows Server 2012 R2数据中心)上运行Seq,并使用Serilog从本地工作站上运行的控制台应用程序进行日志记录。我配置了3个接收器-文件、控制台和序列。我也在运行dnxcore50(以防你认为我的设置不够可靠)。所有我的事件都100%显示在控制台和文件中。Seq只捕获大约5次或更多次运行中的1次事件,也就是说,它将捕获该次运行的所有事件,或者不捕获任何事件。我正在使用免费的单用户许可证来评估Seq,但我没有发现任何迹象表明有任何限制会导致这种行为 我

我正在Azure实例(Windows Server 2012 R2数据中心)上运行Seq,并使用Serilog从本地工作站上运行的控制台应用程序进行日志记录。我配置了3个接收器-文件、控制台和序列。我也在运行dnxcore50(以防你认为我的设置不够可靠)。所有我的事件都100%显示在控制台和文件中。Seq只捕获大约5次或更多次运行中的1次事件,也就是说,它将捕获该次运行的所有事件,或者不捕获任何事件。我正在使用免费的单用户许可证来评估Seq,但我没有发现任何迹象表明有任何限制会导致这种行为

我已经在记录器上设置了SelfLog.Out,但除了我添加的测试行之外,它什么也不记录,我添加了测试行以确保自日志至少可以写入指定的文件

公共抽象类SerilogBaseLogger:SerilogTarget
{
受保护的SerilogBaseLogger(SerilogOptions选项、字符串loggerType)
{
LoggerConfiguration=新的LoggerConfiguration();
选项=选项;
LevelSwitch.MinimumLevel=options.LogLevel.ToSerilogLevel();
var file=file.CreateText(Path.Combine(options.LogFilePath,string.Format(“SelfLog-{0}.txt”,loggerType));
file.AutoFlush=true;
SelfLog.Out=文件;
WriteLine(“测试自日志”);
}
//……剪。。。。
}
公共类SerilogSeqTarget:SerilogBaseLogger
{
公共字符串服务器=>Options.Seq.Server;
公共SerilogSeqTarget(SerilogOptions选项)
:base(选项,string.Format(“SerilogSeqTarget[{0}]”,typeof(T)))
{
记录器配置
.书面
.Seq(服务器);
InitializeLogger();
}
公共重写字符串ToString()
{
返回string.Format(“SerilogSeqTarget”,typeof(T).Name);
}
}
公共类SerigherFactory:LoggerFactory
{
//……剪断。。。。
公共覆盖IMylogger接口GetLogger()
{
var myLogger=new SerilogDefaultLogger()
.AddTarget(SerilogTargetFactory.GetFileTarget(选项))
.AddTarget(SerilogTargetFactory.GetConsoleTarget(选项))
.AddTarget(SerilogTargetFactory.GetSeqTarget(选项));
Info(“使用{@options}初始化的记录器和目标:{targets}”,options,((SerilogDefaultLogger)myLogger.targets);
返回myLogger;
}
}
公共类SerilogTargetFactory
{
//…剪断。。。
公共静态SerilogTarget GetSeqTarget(SerilogOptions选项)
{
return!string.IsNullOrEmpty(options.Seq.Server)
?新的SerilogSeqTarget(选项)
:null;
}
}

有什么建议吗?这仅仅是处于前沿的副作用,处理预发布的所有内容(尽管在这种情况下,我希望事情会一直失败)

当针对
dnxcore50
/CoreCLR时,Serilog无法挂接到
AppDomain
关闭以确保始终刷新任何缓冲消息。(
AppDomain
在该配置文件中不存在:-)

有两种选择:

  • 停机时处理记录器(尤其是Seq one):

    (记录器作为IDisposable)?.Dispose()

  • 使用静态
    Log
    类并在关机时调用其
    CloseAndFlush()
    方法:

    Log.CloseAndFlush()


  • 后者——使用静态
    Log
    类而不是各种
    ILogger
    实例——可能是最快、最容易处理的,但它的效果与处理记录器完全相同,因此任何一种方法都应该这样做。

    这就成功了。我让我的
    SerilogBaseLogger
    实现了
    IDisposable
    ,也为我的目标(用Serilog的说法就是汇),这似乎让事情变得更加可靠。无论如何,这可能是一个好主意(我正在使用/转换一个旧的日志框架/包装器,很有可能它本身并没有得到正确的清理)。干杯所以,事实证明我仍然看到了这个问题,但是通过设置缓冲区文件名,它至少最终达到了目的。在这一点上,我倾向于责怪我的IDisposable模式或dnxcore50的RC stat。在最终版本发布后,我将重新访问并更新,但以防其他人同时遇到此问题…我使用的是
    Serilog.Sinks.MSSqlServer
    ,并且出现了相同的问题。文件和控制台日志存在,但数据库日志根本没有写入。使用调用
    Log.CloseAndFlush()
    的路由,最终在一个实例中将所有500多行日志写入数据库。