我想使用文件目标登录Nlog,就像在example中一样。如何在X
天之后删除文件而不归档它们?或者是否可以将文件存档到同一文件夹?
答案 0 :(得分:68)
您可以简单地使用内置归档功能。此设置将保留7个旧日志文件以及当前日志。清理由NLog自动完成。
<?xml version="1.0" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
<target name="file" xsi:type="File"
layout="${longdate} ${logger} ${message}"
fileName="${basedir}/logs/logfile.txt"
archiveFileName="${basedir}/logs/log.{#}.txt"
archiveEvery="Day"
archiveNumbering="Rolling"
maxArchiveFiles="7"
concurrentWrites="true" />
</targets>
<rules>
<logger name="*" minlevel="Debug" writeTo="file" />
</rules>
</nlog>
另请参阅file target
的文档答案 1 :(得分:10)
我发现如果我在日志文件名中存档带有日期戳的文件,则归档日志会混淆,{#}
总是会转换为“0”,导致旧日志永远不会被删除。此外,如果我在日志文件名中使用GDC引用,它根本不会切换日志。
如果我想要这些花哨的日志文件名,我现在必须手动删除旧日志。他们在文件名中有日期的事实导致他们自动切换文件。
// Delete log files older than X days
var dirInfo = new DirectoryInfo(".");
var oldestArchiveDate = DateTime.Now - new TimeSpan(30, 0, 0, 0);
foreach (FileInfo fi in dirInfo.GetFiles())
if (fi.Name.StartsWith("log-") && fi.Name.EndsWith(".txt") && fi.CreationTime < oldestArchiveDate)
fi.Delete();
var midnight = DateTime.Today.AddDays(1);
_oldLogCleanUpThread = new System.Threading.Timer(OldLogCleanUpThreadMethod, null, midnight - DateTime.Now, TimeSpan.FromDays(1));
nlog target:
filename="${environment:variable=HOMEDRIVE}${environment:variable=HOMEPATH}\logs\log-${gdc:item=MySpecialId}-${date:format=yyyyMMdd}.txt"
GDC.Set("MySpecialId", ...);
答案 2 :(得分:4)
您可以使用当天的名称并将maxArchiveFiles
设置为固定数字。例如,在一周的前一天,您可以存储最多100个100Kb的文件:
<variable name="dayname" value="${date:format=dddd}" />
<target name="logfile" xsi:type="File"
fileName="${basedir}/Logs/MyLog_${dayname}.txt"
archiveFileName="${basedir}/Logs/Archives/MyLog_${dayname}.{#####}.txt"
archiveAboveSize="102400"
archiveNumbering="Sequence"
maxArchiveFiles="100"
concurrentWrites="true"
keepFileOpen="false"
encoding="iso-8859-2" />
答案 3 :(得分:3)
我不知道这是否能回答你的问题,但看起来maxArchiveFiles
应该做你想做的事。我自己实际上没有使用过这个选项,所以我不能肯定地说。您当然可以将日志文件“归档”在同一文件夹中。
如果是我,我会创建一个非常小的程序来执行一些日志记录并设置时间(archiveEvery="minute"
),这样就很容易强制归档逻辑启动。设置maxArchiveFiles
到类似于5的东西,看看NLog是否只保留5个日志文件。运行程序一段时间,可能通过计时器生成日志消息,这样您就可以在NLog的归档/滚动逻辑启动的足够时间内轻松分隔日志消息。
试用归档文件命名模板。使用archiveNumbering
选项可以控制存档文件的编号方式。
抱歉,我无法给出更明确的答案或具体的例子,但我也没有使用过这些选项,所以我只需要进行相同的实验,而且我现在时间紧迫。
答案 4 :(得分:2)
//Store the number of days after which you want to delete the logs.
int Days = 30;
// Storing the path of the directory where the logs are stored.
String DirPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase).Substring(6) + "\\Log(s)\\";
//Fetching all the folders.
String[] objSubDirectory = Directory.GetDirectories(DirPath);
//For each folder fetching all the files and matching with date given
foreach (String subdir in objSubDirectory)
{
//Getting the path of the folder
String strpath = Path.GetFullPath(subdir);
//Fetching all the files from the folder.
String[] strFiles = Directory.GetFiles(strpath);
foreach (string files in strFiles)
{
//For each file checking the creation date with the current date.
FileInfo objFile = new FileInfo(files);
if (objFile.CreationTime <= DateTime.Now.AddDays(-Days))
{
//Delete the file.
objFile.Delete();
}
}
//If folder contains no file then delete the folder also.
if (Directory.GetFiles(strpath).Length == 0)
{
DirectoryInfo objSubDir = new DirectoryInfo(subdir);
//Delete the folder.
objSubDir.Delete();
}
}
答案 5 :(得分:1)
NLog 4.5(或更高版本)使设置归档变得更加容易。您只需配置fileName
和maxArchiveFiles
:
<target name="logfile" type="File" fileName="Log-${shortdate}.txt" maxArchiveFiles="7" />
另请参阅:https://github.com/NLog/NLog/wiki/FileTarget-Archive-Examples
答案 6 :(得分:0)
在 NLog 4.5 (或更高版本)中,如果要在7天后删除,但每天使用的空间有限,在我们的示例中为700MB,则可以使用以下内容:
请注意,如果在存档文件夹中达到限制大小,您将找到最新的日志,而不必是最近7天的日志,这是因为这些选项是互斥的。
<target xsi:type="File" name="f"
fileName="${basedir}/logs/$currentLogfile.log"
archiveFileName="${basedir}/logs/archives/logfile.{#}.log"
layout="${longdate} ${uppercase:${level}} ${message} ${exception:format=toString}"
archiveNumbering="DateAndSequence"
archiveEvery="Day"
archiveDateFormat="yyyyMMdd"
maxArchiveFiles="7"
archiveAboveSize="104857600"
/>```