题
如何-如果可能的话,我可以使用时间复杂作为一个过渡文件记录?因为如果:
我想有在最31文件为31天和当时一个新的一天开始,如果有一个古老的天登录文件的##.日志,然后应删除,但在那一天所有的日志所附的,并将有至少为27天。
解决方案
最后我与基于大小的文件存档解决。我用了一招一个月就在一天后,命名该文件,我需要基于尺寸的文件档案,因为它确实有助于当你开始日志增长超过几百兆字节。它有助于使 - 例如 - 日志20点MB的块,因此可以很容易地采取快速看看它与记事本等++重量轻的工具
这是现在的工作了近一年。这是我的NLog.config
文件的简化版本:
<?xml version="1.0" encoding="utf-8" ?>
<nlog autoReload="true" throwExceptions="true"
xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<variable name="LogDir" value="${specialfolder:folder=MyDocuments}/MyApp/Log"/>
<variable name="LogDay" value="${date:format=dd}"/>
<targets>
<target name="LogTarget1" xsi:type="File" fileName="${LogDir}/${LogDay}.log" encoding="utf-8"
maxArchiveFiles="10" archiveNumbering="Sequence" archiveAboveSize="1048576" archiveFileName="${LogDir}/{#######}.a" />
</targets>
<rules>
<logger name="AppLog" writeTo="LogTarget1" />
</rules>
</nlog>
此配置使得1 MB日志文件月份中的每一天,并保持至多10存档在My Documents\MyApp\Log
文件夹1 MB日志块;像29.log
,30.log
和31.log
。
编辑:这一段时间,我用这个NLog.config
文件,它涵盖了几乎每一个案件,我需要。我在不同的文件中不同类别,不同级别的日志记录时,他们已经得到了很大的,他们将获得根据大小存档,以每小时方式:
<?xml version="1.0" encoding="utf-8" ?>
<nlog autoReload="true" throwExceptions="true" internalLogFile="nlog-internals.log"
xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<variable name="LogHome" value="${basedir}/Log"/>
<variable name="DailyDir" value="${LogHome}/${date:format=yyyy}/${date:format=MM}/${date:format=dd}"/>
<variable name="HourlyArchive" value="${DailyDir}/${date:format=HH}-Archive/${level}-${logger}-{#######}-archived.a"/>
<variable name="AppLogPath" value="${DailyDir}/${level}-${logger}.log"/>
<variable name="DataLogPath" value="${DailyDir}/_data/inouts-${shortdate}.log"/>
<variable name="EventSource" value="Application" />
<targets>
<target name="AppAsyncTarget" xsi:type="AsyncWrapper">
<target xsi:type="RetryingWrapper" retryDelayMilliseconds="3000" retryCount="10">
<target xsi:type="File" fileName="${AppLogPath}" encoding="utf-8"
maxArchiveFiles="50" archiveNumbering="Sequence" archiveAboveSize="1048576" archiveFileName="${HourlyArchive}"
layout="`${longdate}`${level}`${message}" />
</target>
</target>
<target name="DataAsyncTarget" xsi:type="AsyncWrapper">
<target xsi:type="RetryingWrapper" retryDelayMilliseconds="1500" retryCount="300">
<target xsi:type="File" fileName="${DataLogPath}" encoding="utf-8"
layout="`${longdate}`${message}" />
</target>
</target>
<target name="EventLogAsyncTarget" xsi:type="AsyncWrapper">
<target xsi:type="RetryingWrapper">
<target xsi:type="EventLog" source="${EventSource}" machineName="." />
</target>
</target>
</targets>
<rules>
<logger name="Data" writeTo="DataAsyncTarget" final="true" />
<logger name="Event" writeTo="EventLogAsyncTarget" final="true" />
<logger name="*" writeTo="AppAsyncTarget" />
</rules>
</nlog>
和每个类,我想有一个日志记录功能,我把这个:
static readonly Logger SlotClassLogger = LogManager.GetCurrentClassLogger();
static Logger ClassLogger { get { return SlotClassLogger; } }
两个附加记录器是用于打桩每天的基础上的一些数据和写入到Windows事件日志;其是应用范围记录程序:
public static Logger DataLog { get; private set; }
public static Logger AppEventLog { get; private set; }
和它们应该在应用程序开始初始化是:
DataLog = LogManager.GetLogger("Data");
AppEventLog = LogManager.GetLogger("Event");
请注意:有时你的应用程序退出你的NLOG产生的异常。这是因为未初始化的东西,不能得到处置!你刚才写在应用程序启动一个空的进入你的记录,说:
DataLog.Info(string.Empty);
我已经加入这个尺寸的限制,日志文件可以在低端服务器上(比如说)记事本观看,为快速的评价。你应该根据你的需要进行修改。
其他提示
我建议您单独的问题分为两个不同的方面:
- 滚到一个新的文件名称的每一天(铭记时区;UTC天也许?)
- 删除旧记录的文件
以我的经验,这将是值得保留的日期在登录文件的名称,例如
debug-2010-06-08.log
这部分应该方便有时间复杂,给予 例在文档.
现在,第二部分可以很容易地在第二线或甚至可能是一个完全不同的进程-这只需要看看有多少文件都存和删除最古老的,如果必要的。找到"最古老的"应该很容易,如果该日期是在文件,甚至如果你不想相信的文件系统的信息。
事实上,看着时间复杂文件,它看起来像 "基于时间的文件档案" 目标可能做你想要什么...但即使如果没有,正常的"一个登录文件的每一天"的方法和自己的清理应该是容易的。