如何设置 NLog 以在 Xamarin Forms 上创建每小时日志文件?

How to setup NLog to create hourly log files on Xamarin Forms?

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

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

NLog的bug吗?

这是我 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,
        };

因为您已经将日期添加到 FileName,所以您不需要配置任何存档选项,因为它会自动发生(只有在写入静态文件名时才需要存档选项。例如log.txt)

考虑更改为 ConcurrentWrites=falseKeepFileOpen=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,
        };