Удалить файлы журнала через x дней - PullRequest
40 голосов
/ 06 апреля 2011

Я хотел бы войти в Nlog, используя целевой файл, как в этом примере . Как я могу осуществить удаление файлов через X дня без их архивирования? Или можно архивировать файлы в одну папку?

Ответы [ 5 ]

68 голосов
/ 03 августа 2011

Вы можете просто использовать встроенную функцию архивации.Этот параметр сохранит 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>

См. Также документацию к целевому файлу

10 голосов
/ 28 мая 2011

Я обнаружил, что если я архивирую файлы с отметками даты в именах файлов журнала, журнал архивов запутывается, и {#} всегда переводится в «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", ...);
4 голосов
/ 06 мая 2016

Вы можете использовать название дня и установить maxArchiveFiles на фиксированное число.Например, в каждый день недели вы можете хранить до 100 файлов по 100 КБ:

<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 голосов
/ 08 апреля 2011

Я не знаю, отвечает ли это на ваш вопрос, но похоже, что maxArchiveFiles должен делать то, что вы хотите. Я сам на самом деле не использовал эту опцию, поэтому не могу сказать наверняка. Вы, безусловно, можете «заархивировать» свои файлы журналов в той же папке.

Если бы это был я, я бы сделал очень маленькую программу, которая делает некоторые записи и устанавливает время (archiveEvery="minute"), чтобы можно было легко заставить логику архивации включиться. Установите maxArchiveFiles на что-то вроде 5 и посмотрите, хранит ли NLog только 5 файлов журнала. Запустите вашу программу на некоторое время, возможно, сгенерировав сообщения журнала через таймер, чтобы вы могли легко размещать сообщения журнала в течение времени, достаточного для запуска логики архивирования / прокрутки NLog.

Поэкспериментируйте с шаблоном именования архивных файлов. Использование опции archiveNumbering дает вам некоторый контроль над тем, как нумеруются архивные файлы.

Извините, я не смог дать более точный ответ или конкретный пример, но я также не использовал эти варианты, поэтому мне просто пришлось бы провести такой же эксперимент (ы), и сейчас у меня не хватает времени.

2 голосов
/ 29 апреля 2015
     //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();
            }

        }
...