C# 如何设置NLog以在Xamarin表单上创建每小时日志文件?

C# 如何设置NLog以在Xamarin表单上创建每小时日志文件?,c#,xamarin,xamarin.forms,nlog,C#,Xamarin,Xamarin.forms,Nlog,我使用图书馆 在Xamarin表单上编写日志应用程序。 我的文件日志按小时写日志 示例:15点钟时,将创建一个文件日志名file_15.txt。 在文件namefile_15.txt上写入日志时,直到16点钟,将创建一个文件log namefile_16.txt。文件log namefile_15.txt是删除的日志内容,文件namefile_16.txt的当前日志写在文件log namefile_15.txt上 这是NLog的错误吗 这是我的代码使用Nlog public NLogge

我使用图书馆 在Xamarin表单上编写日志应用程序。 我的文件日志按小时写日志

示例:15点钟时,将创建一个文件日志名file_15.txt。 在文件namefile_15.txt上写入日志时,直到16点钟,将创建一个文件log namefile_16.txt。文件log namefile_15.txt是删除的日志内容,文件namefile_16.txt的当前日志写在文件log namefile_15.txt上

这是NLog的错误吗

这是我的代码使用
Nlog

    public NLoggerFactory(string folderLog, string version)
    {
        // Format file
        const string dateTimeFormat = "yyyyMMdd.HH";
        var fileName = $"Log_v{version}";

        // Create targets
        // File target
        var fileTarget = new FileTarget
        {
            Name = "FileTarget",
            FileName = Path.Combine(folderLog, $"{fileName}.{DateTime.Now.ToString(dateTimeFormat)}.txt"),
            Layout = new CsvLayout()
            {
                Columns =
                {
                    new CsvColumn("Time", @"${date:format=yyyy-MM-dd HH\:mm\:ss.fff}"),
                    new CsvColumn("Level", "${level}"),
                    new CsvColumn("Lessage", "${message}"),
                    new CsvColumn("Logger", "${logger}")
                }
            },
            ConcurrentWrites = true,
            KeepFileOpen = false,
            ArchiveFileName = Path.Combine(folderLog, fileName + ".{#}.txt"),
            ArchiveNumbering = ArchiveNumberingMode.Date,
            ArchiveDateFormat = dateTimeFormat,
            ArchiveEvery = FileArchivePeriod.Minute
        };

        // Console target
        var consoleTarget = new ConsoleTarget()
        {
            Name = "ConsoleTarget",
            Layout = @"${date:format=HH\:mm\:ss} ${logger} ${message}"
        };

        var config = new LoggingConfiguration();
        config.AddTarget(consoleTarget);
        config.AddTarget(fileTarget);

        // Define rules
        var rule1 = new LoggingRule("*", LogLevel.Debug, consoleTarget);
        config.LoggingRules.Add(rule1);

        var rule2 = new LoggingRule("*", LogLevel.Info, fileTarget);
        config.LoggingRules.Add(rule2);

        // Apply
        _logFactory = new LogFactory(config);
    }
请帮帮我

谢谢

如果使用NLog 4.5(或更新版本),那么我只需执行以下操作:

        var fileTarget = new FileTarget
        {
            Name = "FileTarget",
            FileName = Path.Combine(folderLog, fileName + ".${date:format=" + dateTimeFormat + "}.txt"),
            Layout = new CsvLayout()
            {
                Columns = {
                new CsvColumn("Time", @"${date:format=yyyy-MM-dd HH\:mm\:ss.fff}"),
                new CsvColumn("Level", "${level}"),
                new CsvColumn("Lessage", "${message}"),
                new CsvColumn("Logger", "${logger}")
                }
            },
            ConcurrentWrites = true,
            KeepFileOpen = false,
        };
由于您已将日期添加到
文件名
,因此无需配置任何存档选项,因为这是自动进行的(仅当写入静态文件名.Ex
log.txt时才需要存档选项)

考虑更改为
ConcurrentWrites=false
KeepFileOpen=true
。它将减少日志记录的开销(不会为每次写入操作打开和关闭文件)

如果您希望在达到一定大小时使用归档逻辑创建新文件。然后您可以激活
ArchiveAboveSize

        var fileTarget = new FileTarget
        {
            Name = "FileTarget",
            FileName = Path.Combine(folderLog, fileName + ".${date:format=" + dateTimeFormat + "}.txt"),
            ArchiveAboveSize = 2000000,
            ArchiveFileName = Path.Combine(folderLog, fileName + ".{#}.txt"),
            ArchiveNumbering = ArchiveNumberMode.DateAndSequence,
            ArchiveDateFormat = dateTimeFormat,
        };

@RoftKristensen,这是完美的工作。但我有一个问题,当我写日志14h->20h时,只有3个小时的文件日志(18、19、20)被删除,文件日志(14、15、16、17)被删除。这是Nlog的错误?不知道为什么文件会被删除。NLog仅在配置
maxArchiveFiles
时删除文件。您可以尝试检查NLog我想要检查文件日志的大小。如果文件大小>2MB,我将在文件日志名称后创建一个新的文件日志(添加字符“_1”、“_2”等)。如何在NLOg中处理它?@BillNguyen添加了如何使用ArchiveAboveSize的示例。但是文档总是一个好的开始:这是工作,@RoftKristensen,你是图书馆NLOg的大师,LOL:D