Подтвердить что ты не робот

Удаление файлов журнала через x дней

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

Вы можете использовать имя дня и установить 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" />   

Ответ 5

     //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();
            }

        }