如何设置 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=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,
};
我使用图书馆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=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,
};