C# 企业库记录器的配置

C# 企业库记录器的配置,c#,logging,app-config,enterprise-library,C#,Logging,App Config,Enterprise Library,我想将企业库记录器配置为写入文件,直到文件达到指定大小 达到指定大小后,我希望它执行以下操作之一: 请滚动文件(删除旧的日志行并添加新的日志行,而不是清除整个文件) 将内容保留在文件中并清除日志文件(仅保留一个备份文件) 目前我有一个文件的配置,每次文件满时都会清除。这是我的配置 <listeners> <add fileName="C:\ProgramData\Hamoub\Log\TransferLog.log" formatter="Text Fo

我想将企业库记录器配置为写入文件,直到文件达到指定大小
达到指定大小后,我希望它执行以下操作之一:

  • 请滚动文件(删除旧的日志行并添加新的日志行,而不是清除整个文件)
  • 将内容保留在文件中并清除日志文件(仅保留一个备份文件)
目前我有一个文件的配置,每次文件满时都会清除。这是我的配置

<listeners>
  <add fileName="C:\ProgramData\Hamoub\Log\TransferLog.log" 
       formatter="Text Formatter" 
       header="----------------------------------------"
       rollFileExistsBehavior="Overwrite" 
       rollSizeKB="100000" 
       listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.RollingFlatFileTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
       traceOutputOptions="None" 
       filter="All" 
       type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.RollingFlatFileTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
       name="Rolling Flat File Trace Listener"/>
</listeners>


感谢您的帮助

看起来企业库4.1没有这样的配置选项


如果您更改为
rollFileExistsBehavior=“Increment”
,然后创建一个计划任务,该任务将删除除两个最新文件以外的所有文件,该怎么办?

因此,仅在配置中无法做到这一点。
我的解决方案是在输出文件夹中添加FileSystemWatcher,每当在那里创建新文件时,我都会检查是否需要删除。
我已在删除之前对文件夹文件进行了排序,因此只会删除旧文件(保留当前和以前的日志文件)。

观察者代码:

        try
        {
            FileSystemWatcher fsw = new FileSystemWatcher(@"C:\ProgramData\Hamoub\Log");
            fsw.EnableRaisingEvents = true;
            fsw.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite |
                   NotifyFilters.DirectoryName | NotifyFilters.FileName;
            fsw.Created += new FileSystemEventHandler(FileCreatedOnLogFolder);
        }
        catch (Exception ex)
        {
            Logger.Log("Failed creating file system watcher: " + ex.Message, Severity.Warning);
        }
    void FileCreatedOnLogFolder(object sender, FileSystemEventArgs e)
    {
        try
        {
            DirectoryInfo logsDir = new DirectoryInfo(@"C:\ProgramData\Hamoub\Log");
            var logFiles = logsDir.GetFiles("*TransferServiceTrace*.log");
            var orderedLogFiles = logFiles.OrderBy(e => e.CreationTime);

            if (orderedLogFiles.Count() > 1)
            {
                Logger.Log("Maintenance is needed, More than 2 log files found", Severity.Verbose);
                for (int i = 0; i < orderedLogFiles.Count() - 2; i++)
                {
                    try
                    {
                        var toDeleteFile = (orderedLogFiles.ElementAt(i) as FileInfo);
                        if (toDeleteFile != null)
                        {
                            toDeleteFile.Delete();
                        }
                    }
                    catch (Exception)
                    {
                        Logger.Log("Can't delete log file " + (orderedLogFiles.ElementAt(i) as FileInfo).Name, Severity.Warning);
                    }
                }
                // Store last file as TransferService.Last.Log
                (orderedLogFiles.ElementAt(orderedLogFiles.Count() - 2) as FileInfo).CopyTo(Path.Combine(logsDir.FullName, "TransferService.Last.Log"), true);
                (orderedLogFiles.ElementAt(orderedLogFiles.Count() - 2) as FileInfo).Delete();
            }
        }
        catch (Exception ex)
        {
            Logger.Log("Error during folder maintenance. " + ex.Message, Severity.Warning);
        }
    }
处理程序代码:

        try
        {
            FileSystemWatcher fsw = new FileSystemWatcher(@"C:\ProgramData\Hamoub\Log");
            fsw.EnableRaisingEvents = true;
            fsw.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite |
                   NotifyFilters.DirectoryName | NotifyFilters.FileName;
            fsw.Created += new FileSystemEventHandler(FileCreatedOnLogFolder);
        }
        catch (Exception ex)
        {
            Logger.Log("Failed creating file system watcher: " + ex.Message, Severity.Warning);
        }
    void FileCreatedOnLogFolder(object sender, FileSystemEventArgs e)
    {
        try
        {
            DirectoryInfo logsDir = new DirectoryInfo(@"C:\ProgramData\Hamoub\Log");
            var logFiles = logsDir.GetFiles("*TransferServiceTrace*.log");
            var orderedLogFiles = logFiles.OrderBy(e => e.CreationTime);

            if (orderedLogFiles.Count() > 1)
            {
                Logger.Log("Maintenance is needed, More than 2 log files found", Severity.Verbose);
                for (int i = 0; i < orderedLogFiles.Count() - 2; i++)
                {
                    try
                    {
                        var toDeleteFile = (orderedLogFiles.ElementAt(i) as FileInfo);
                        if (toDeleteFile != null)
                        {
                            toDeleteFile.Delete();
                        }
                    }
                    catch (Exception)
                    {
                        Logger.Log("Can't delete log file " + (orderedLogFiles.ElementAt(i) as FileInfo).Name, Severity.Warning);
                    }
                }
                // Store last file as TransferService.Last.Log
                (orderedLogFiles.ElementAt(orderedLogFiles.Count() - 2) as FileInfo).CopyTo(Path.Combine(logsDir.FullName, "TransferService.Last.Log"), true);
                (orderedLogFiles.ElementAt(orderedLogFiles.Count() - 2) as FileInfo).Delete();
            }
        }
        catch (Exception ex)
        {
            Logger.Log("Error during folder maintenance. " + ex.Message, Severity.Warning);
        }
    }
void FileCreatedOnLogFolder(对象发送方,FileSystemEventArgs e)
{
尝试
{
DirectoryInfo logsDir=新的DirectoryInfo(@“C:\ProgramData\Hamoub\Log”);
var logFiles=logsDir.GetFiles(“*TransferServiceTrace*.log”);
var orderedLogFiles=logFiles.OrderBy(e=>e.CreationTime);
如果(orderedLogFiles.Count()>1)
{
Logger.Log(“需要维护,找到2个以上的日志文件”,严重性.Verbose);
对于(int i=0;i
希望这篇文章能帮助那些寻找这种解决方案的人


Barak Hamou

信息:我目前使用的是EntLib 4.1,我看到在EntLib 5中有MaximumLogFilesBeforePurge选项。当文件满时,增量标志会添加一个新文件。它不会限制创建的新文件的数量。我知道。Enterprise Library 4.1似乎没有提供配置选项来完全满足您的需要。我试图为你提供一个解决办法。