【问题标题】:Why does RollingInterval.Day keep creating new Serilog Logs files?为什么 RollingInterval.Day 不断创建新的 Serilog 日志文件?
【发布时间】:2019-06-12 19:43:33
【问题描述】:

我正在使用 Serilog 作为我的程序的记录器。尝试制作将 yyyymmdd 日期附加到每个文件的滚动间隔文件。

下面的代码正是我一直使用的代码,它在 4 到 5 天的时间里很好地测试和进一步开发了我的 UWP 应用程序。然后我认为我的应用程序开始创建多个具有相同日期的文件,将它们命名为 logs-yyyymmdd_01、logs-yyyymmdd_02 等。

这是在 MainPageViewModel 构造函数中

            Log.Logger = new LoggerConfiguration().MinimumLevel.Debug()
            .WriteTo.File(this.GetFile("logs-"), rollingInterval: RollingInterval.Day)
            .CreateLogger();

        public string GetFile(String FileName)
        {
            string s = ApplicationData.Current.LocalFolder.Path;
            return s + "\\" + FileName;
        }

我怀疑它多次调用构造函数,这可能是问题的一部分。但是滚动间隔应该只在新的一天创建一个新文件,对吗?因为当应用程序多次启动时,它曾经使用与今天日期对应的任何文件。所以我要么需要一种方法来使 Log.Logger 成为静态以便它是通用的,要么需要一种让它只使用一个文件的方法。任何帮助将不胜感激

【问题讨论】:

  • 很确定它应该像你希望的那样附加 - 也许它达到了大小限制? serilog.sinks.file 存储库中的代码非常干净 - 建议从那里弄清楚(测试也很好地指定了各种行为)

标签: c# xaml uwp serilog


【解决方案1】:

更新:

由于滚动文件已被弃用,您可以使用 Nuget 中的 Serilog.Sinks.File 包来实现。滚动文件的语法是:

        Log.Logger = new LoggerConfiguration()
            .MinimumLevel.Debug()
            .WriteTo.Console()
            .WriteTo.File($@"{logPath}\log-.txt", rollingInterval: RollingInterval.Day)
            .CreateLogger();

您是否从 NuGet 安装了 Serilog.Sinks.RollingFile?我的理解是Serilog.Sinks.File 的滚动文件方面仍然依赖于这种依赖关系。

话虽如此,我使用以下内容:

        Log.Logger = new LoggerConfiguration()
            .MinimumLevel.Debug()
            .WriteTo.Console()
            .WriteTo.RollingFile($@"{Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)}\Organization\{Path.GetFileNameWithoutExtension(Process.GetCurrentProcess().MainModule.FileName)}\Logs\log.txt")
            .CreateLogger();

除非大小变得太大,否则默认为每日日志文件。

【讨论】:

  • 是的,我之前已经有 Serilog.Sinks.File,看起来 RollingFile 添加了您刚刚介绍的语法。我试过了,我仍然在创建多个文件。如果我的构造函数多次运行,这还会发生吗?在我的代码中是否有更好的地方放置我的 Logger 构造函数以确保它只运行一次?
  • 正如 BWhelan 所说 @Greg,File 的滚动支持是......滚动的,不依赖于 .RollingFile
  • @RubenBartelink 啊我明白了,我把它读作需要 RollingFile 的 Serilog.Sinks.File。我的坏
  • @BWhelan 好吧,它不应该在构造函数中。你应该在你的入口点或一个抽象的提供者中拥有该代码,只构建一次。
  • @Greg 谢谢,我使用调用层次结构来确定我的 MainViewModel 的构造函数在哪里被多次调用,从而解决了问题。感谢您使用 RollingFile 语法的新方法!
【解决方案2】:

有同样的问题。在 WriteTo.File() 调用中添加 shared 参数为我修复了它:

Log.Logger = new LoggerConfiguration()
            .MinimumLevel.Debug()
            .WriteTo.File(@"C:\Logs\Log_.txt", shared: true, rollingInterval: RollingInterval.Day)
            .CreateLogger();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多