Serilog 破坏多个日志?

Serilog clobbering over multiple logs?

这太离奇了。我有 2 个完全独立的程序,它们都使用 Serilog,例如:

            Log.Logger = new LoggerConfiguration ()
            .MinimumLevel.Debug ()
            .Filter.ByExcluding (e => e.MessageTemplate.Text.Contains ("Could not find file"))
            .WriteTo.File ("testA-.log", rollingInterval: RollingInterval.Day, retainedFileCountLimit: 1, outputTemplate: template)
            .CreateLogger ();

第二个程序记录到“testB-.log”。现在,奇怪的部分是,当程序 B 记录到“testB-.log”时……它在“testA-.log”(原文如此!)中结束。没有狗屎。这就像 Windows 说“Ony 1 program can use this dll at time.”。哈哈。这里发生了什么奇怪的融合?!

N.B。这些程序 运行 通过 SHVDN:https://github.com/crosire/scripthookvdotnet/releases

您使用 ScriptHookVDotNET 执行的两个 apps/scripts 似乎共享您存储记录器实例 (Log.Logger) 的相同静态上下文,因此最后一个运行的脚本会更改实例并影响第一个脚本。

ScriptHookVDotNET 似乎没有提供您在常规 .NET 应用程序中所期望的隔离,因此我建议询问他们的 Gitter chat 如果这通过设计以及创建隔离静态上下文的推荐“ScriptHookVDotNET 方式”是什么。

一种可能的解决方法是将您的记录器实例存储为属于特定脚本的实例变量,它可以与脚本的实例方法共享。例如

public class Main : Script
{
    private ILogger _log = Logger.None;

    public Main()
    {
        _log = new LoggerConfiguration()
            .MinimumLevel.Debug()
            .Filter.ByExcluding(e => e.MessageTemplate.Text.Contains("Could not find file"))
            .WriteTo.File("testA-.log", rollingInterval: RollingInterval.Day, retainedFileCountLimit: 1)
            .CreateLogger();

        KeyDown += OnKeyDown;
        Interval = 1000;
    }

    private void OnKeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.T)
        {
            _log.Information("Create AI Script and store as AIone");
            // ...
        }

        // ...
    }
}