2016-08-17 1 views
0

J'ai prévu un travail par lots à exécuter toutes les 4 heures pour récupérer les derniers enregistrements de la base de données.Comment supprimer le fichier journal après une semaine?

De plus, je gère le fichier journal qui sera mis à jour chaque fois que le travail par lots sera exécuté. Afin de compenser la mémoire de stockage, j'ai besoin de supprimer le fichier journal chaque semaine.

J'avais essayé de résoudre la tâche avec Batch file to delete files older than N days.

Dans mon cas, les fichiers journaux seront mis à jour toutes les 4 heures.

+0

Vous voulez donc supprimer les entrées dans le fichier journal qui datent de plus de 7 jours? – aschipfl

+0

Je dois supprimer le fichier journal ou vider les détails du journal –

+0

Pour supprimer des fichiers journaux * en fonction de leur date de modification, utilisez 'forfiles'; pour les supprimer en fonction de leur date de création, 'forfiles' ne peut pas être utilisé, et comme les scripts batch ne sont pas capables de faire de vraies maths de date/heure, je recommande une autre langue (PowerShell, par exemple). Supprimer * contenu * de fichiers journaux est quelque chose de complètement différent, et vous devez être en mesure d'identifier l'âge d'une entrée par une sorte d'horodatage; et vous devez nous montrer quelques échantillons. Quoi qu'il en soit, vous pourriez être intéressé par ceci: [Equivalent de LogRotate pour Windows?] (Http://serverfault.com/q/358172) – aschipfl

Répondre

1

Il est déconseillé de supprimer le fichier journal complet sur lequel les lignes sont ajoutées régulièrement car cela entraîne la perte de toutes les informations pour les N derniers jours à un moment donné. Par exemple, supprimer le fichier journal chaque dimanche et détecter le lundi matin que quelque chose de mal est arrivé lors de la dernière sauvegarde et que vous voulez savoir ce qui s'est passé, vous avez vraiment un problème car l'information n'est plus disponible. En général, la durée de conservation des fichiers journaux et de sauvegarde importe peu, car la taille du support de stockage limite la taille d'un fichier journal ou le nombre de sauvegardes de taille X pouvant être stockées avant que le support de stockage soit plein. Donc, à mon avis, il est préférable de se concentrer sur l'utilisation de la taille de stockage par les fichiers journaux et de sauvegarde, puis sur une période donnée. Il peut y avoir le plus souvent plus de fichiers de sauvegarde avec seulement quelques MiB stockés que de grandes sauvegardes avec plusieurs GiB. Ainsi, pour les petites sauvegardes, le nombre de sauvegardes (= période de sauvegarde) peut être plus important que pour les petites sauvegardes. Et pour les fichiers journaux, la quantité de données ajoutées à chaque exécution avant que la taille du fichier journal devienne critique est plus importante que le nombre d'exécutions de sauvegarde au cours d'une période de temps qui ajoute des données au fichier journal.

Donc, en mettant l'accent sur la taille du fichier journal au lieu de la période de temps, je suggère ce qui suit:

@echo off 
setlocal EnableExtensions 

rem Define file size limit for the log file with 4 MiB. 
set "SizeLimit=4194304" 
set "LogFile=C:\BackupFolder\Backup.log" 

for %%I in ("%LogFile%") do (
    if %%~zI GEQ %SizeLimit% move /Y "%%I" "%%~dpnI_old%%~xI" 
) 

endlocal 

Sur chaque exécution de ce petit fichier batch la taille du fichier du fichier journal spécifié est comparée à la limite de taille de fichier défini dans le fichier batch. Si la taille du fichier journal est supérieure ou égale à la limite de taille de fichier définie, le fichier journal actuel est déplacé dans le même répertoire en insérant _old avant l'extension de fichier en remplaçant un _old déjà existant. fichier avec le même nom et l'extension de fichier.

En d'autres termes, ce fichier batch déplaceC:\BackupFolder\Backup.log-C:\BackupFolder\Backup_old.log avec automatiquement un C:\BackupFolder\Backup_old.log écrasant déjà existant le plus probable chaque fois que le fichier journal a 4 ou plus MiB. Le résultat est qu'il y a au moins toujours 1 fichier journal, Backup.log ou Backup_old.log avec les messages enregistrés des N dernières opérations de sauvegarde. Et la taille totale nécessaire sur les supports de stockage pour les deux fichiers journaux est dans le pire des cas d'environ 8 Mio plus quelques KiB de la dernière opération de sauvegarde.

La limite de taille de fichier peut être définie en fonction de la quantité de données ajoutées par défaut à chaque opération de sauvegarde.Par exemple, si une opération de sauvegarde typique exécuté toutes les 4 heures joint 96 Kio sur des données dans le fichier journal, la formule de la limite de taille de fichier est:

96 KiB x 6 backups per day x 7 days = 4032 KiB 

4032 Kio est un peu plus petit que 4096 Kio (= 4 MiB). Ainsi, avec la sauvegarde suivante, la limite de taille de fichier 4 MiB est atteinte et le fichier journal actuel est déplacé en remplacement de l'ancien fichier journal. En d'autres termes, sur les sauvegardes typiques, chaque fichier journal contient les messages de journal d'environ une semaine avant la création d'un nouveau. Ce fichier batch simple peut également être défini pour être appelé à partir d'autres fichiers batch pour différents fichiers journaux avec différentes limites de taille de fichier, ce qui permet d'utiliser un fichier batch pour de nombreux fichiers journaux différents sur un serveur.

@echo off 
setlocal EnableExtensions 
if "%~1" == "" goto EndFileSizeCheck 
set "LogFile=%~1" 

rem Define default file size limit for the log file with 4 MiB. 
set "SizeLimit=4194304" 
if not "%~2" == "" set "SizeLimit=%~2" 

for %%I in ("%LogFile%") do (
    if %%~zI GEQ %SizeLimit% move /Y "%%I" "%%~dpnI_old%%~xI" 
) 

:EndFileSizeCheck 
endlocal 

Le fichier de commandes ci-dessus nécessite comme premier paramètre le nom d'un fichier journal. En tant que deuxième paramètre, la limite de taille de fichier peut être spécifiée en option. 4 MiB est utilisé par défaut s'il n'y a pas de limite de taille de fichier transmise au fichier batch.

IMPORTANT: La comparaison de taille de fichier ne fonctionne que jusqu'à 2 GiB - 1 = 2^31 - 1 octets = 2147483647 octets. Par conséquent, utilisez une limite de taille de fichier sur laquelle la taille actuelle du fichier journal est plus ou moins garantie jamais 2 Gio ou plus.

Le code de traitement ci-dessus peut également être utilisé pour tous les fichiers * .log d'un répertoire. Mais dans ce cas, il est important de déplacer le fichier journal vers un autre répertoire, ou de changer l'extension du fichier en déplacement, ou d'ajouter du code supplémentaire pour vous assurer que l'ancien fichier journal n'est pas déplacé encore et encore et encore.

@echo off 
setlocal EnableExtensions EnableDelayedExpansion 
if "%~1" == "" goto EndFileSizeCheck 
set "LogFile=%~1" 

rem Define default file size limit for the log file with 4 MiB. 
set "SizeLimit=4194304" 
if not "%~2" == "" set "SizeLimit=%~2" 

for %%I in ("%LogFile%") do (
    set "FileName=%%~nI" 
    if /I not "!FileName:~-4!" == "_old" (
     if %%~zI GEQ %SizeLimit% move /Y "%%I" "%%~dpnI_old%%~xI" 
    ) 
) 

:EndFileSizeCheck 
endlocal 

La variante de fichier batch ci-dessus peut être appelé à partir d'un autre fichier batch par exemple avec

call FileSizeCheck.bat "C:\BackupFolder\*.log" 16777216 

pour vérifier chaque fichier * .log dans le dossier C:\BackupFolder sur la limite de taille de fichier de 16 MiB avec ignorant déjà existants * _old.log fichiers dans ce répertoire. Pour comprendre les commandes utilisées et leur fonctionnement, ouvrez une fenêtre d'invite de commande, exécutez les commandes suivantes et lisez attentivement toutes les pages d'aide affichées pour chaque commande.

  • call /? ... explique %~1 et %~2
  • echo /?
  • endlocal /?
  • for /?
  • if /?
  • move /?
  • rem /?
  • set /?
  • setlocal /?

Les commandes setlocal EnableExtensions et endlocal ne seraient pas nécessaires dans les deux premiers fichiers batch que les extensions de commandes sont activées par défaut sur Windows. Mais l'utilisation permet de s'assurer que les variables d'environnement des fichiers de traitement par lots ne sont jamais modifiées par la taille du fichier de vérification du fichier de traitement par lots et de déplacer le fichier lorsque la limite de taille de fichier est atteinte.