IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Purger un fichier log pour ne garder que les 50000 dernières lignes


Sujet :

Scripts/Batch

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Purger un fichier log pour ne garder que les 50000 dernières lignes
    Bonjour à tous

    J'aurais besoin de votre aide car j'ai un besoin urgent, sauf que je suis totalement noob sur la programmation Windows.
    Je vous explique mon problème:
    Je voudrais faire un script en tache planifiée, qui se lancerait tout les 1ers lundi du mois par exemple.
    Ce script irait voir le fichier C:\Program Files\Implex\Call\Service\UserData\trace.log, et le purgerait de manière à ne garder que les 50.000 dernières lignes.
    J'ai essayé de chercher sur le net, mais comme je n'ai strictement aucun niveau, je ne suis pas capable d'adapter un script déjà existant et qui ressemblerait à ce que je voudrais.
    Si quelqu'un sur ce forum, avait la bonté de m'aider, je lui en serais énormément reconnaissante.
    j'avais trouvé ce post: http://www.developpez.net/forums/d75...oyer-fichiers/ qui avait l'air pas trop mal, mais je suis larguée....

    Cordialement

  2. #2
    Membre habitué
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2015
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2015
    Messages : 66
    Points : 126
    Points
    126
    Par défaut
    D'après ton message tu es ouverte à peu près à tout type de réponse, j'ai bien vu qu'il y avait [batch] dans l'intitulé, et ce qui suit est du Powershell, donc désolé si tu veux qu'une commande cmd.

    Mais si tu es ouverte à Powershell, voici:

    1. On définit une variable qui contient le nom de ton log, $file
    2. Ensuite on récupère les dernières 50000 lignes dans une variable (tail = queue de fichiers, on prend les 50K dernières lignes)
    3. On supprime le log
    4. et on sauvegarde le contenu de la variable dans le fichier de log $file



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $file = 'a.txt'                      
    $50K = Get-Content $file -tail 50000
    Remove-Item $file
    $50K |Out-File $file -Force
    Ceci purgera ton fichier de log tout en gardant les 50K dernières lignes.

    PS. Comme je n'ai pas vu de réponse en cmd, et que j'en fais pas, je me suis dit, Powershell c'est mieux que rien

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci d avoir pris du temps pour me répondre. Effectivement en powershell ça à l air pas mal, et bien moins tordu quë ce que j avais vu jusque la. Je testerais demain au taff et te tient au courant.
    Encore merci, bonne soirée

  4. #4
    Membre éclairé Avatar de suchiwa
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2010
    Messages
    435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2010
    Messages : 435
    Points : 899
    Points
    899
    Par défaut
    Citation Envoyé par mickyballadelli Voir le message
    D'après ton message tu es ouverte à peu près à tout type de réponse, j'ai bien vu qu'il y avait [batch] dans l'intitulé, et ce qui suit est du Powershell, donc désolé si tu veux qu'une commande cmd.

    Mais si tu es ouverte à Powershell, voici:

    1. On définit une variable qui contient le nom de ton log, $file
    2. Ensuite on récupère les dernières 50000 lignes dans une variable (tail = queue de fichiers, on prend les 50K dernières lignes)
    3. On supprime le log
    4. et on sauvegarde le contenu de la variable dans le fichier de log $file



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $file = 'a.txt'                      
    $50K = Get-Content $file -tail 50000
    Remove-Item $file
    $50K |Out-File $file -Force
    Ceci purgera ton fichier de log tout en gardant les 50K dernières lignes.

    PS. Comme je n'ai pas vu de réponse en cmd, et que j'en fais pas, je me suis dit, Powershell c'est mieux que rien
    Bonjour mickyballadelli

    Je ne suis pas certain que la solution réponde à la question.

    Il y a bien récupération des 50000 dernières lignes, ce qui est juste, mais la seconde partie, la suppression du fichier pour en créer un autre, n'est pas recommandée, en cas de permissions sur le fichier, sont-elles gardées ?
    Une purge correspond plus à garder le contenu sans toucher au contenant.

    D'après ce document fort utile, http://www.developpez.com/telecharge...447fd0c40e4f46, je propose le code powershell suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # variable $file type string, une chaine de caractère
    [string]$file = "C:\temp\file.txt"
    # variable $tab de type array, un tableau
    [array]$tab = Get-Content $file
    # Supprime les éléments d'un tableau de l'index 0 à $tab.Count-50001) 
    [System.Array]::Clear($tab,0,($tab.Count-50001))
    # Ecrit le contenu du tableau dans le fichier, qui correspond aux 50000 lignes du fichier
    $tab | Set-Content $file -Force
    A défaut d'être fonctionnel et de garder que l'utile, ce n'est pas forcément optimisé pour des gros fichiers. Si vous avez d'autres approches, je suis preneur.

    Cordialement,
    Vincent
    Dans le doute, reboot...

    https://mcp.microsoft.com/authenticate/validatemcp.aspx
    931584 | Micr0s0ft

  5. #5
    Membre habitué
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2015
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2015
    Messages : 66
    Points : 126
    Points
    126
    Par défaut
    Oui très bonne approche Vincent, passer par Set-Content est une meilleure idée.

    Micky

  6. #6
    Nouveau Candidat au Club
    Femme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci à vous deux, je testerais ça lundi (pas de bol, me suis levée ce matin avec un torticolis carabiné, pas pu aller bosser)
    Bon w-e à vous

  7. #7
    Nouveau Candidat au Club
    Femme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Malheureusement, cela ne fonctionne pas:
    PS C:\tmp> .\purge.ps1
    Get-Content : Exception of type 'System.OutOfMemoryException' was thrown.
    At C:\tmp\purge.ps1:4 char:26
    + [array]$tab = Get-Content <<<< $file
    + CategoryInfo : NotSpecified: ( [Get-Content], OutOfMemoryExce
    ption
    + FullyQualifiedErrorId : System.OutOfMemoryException,Microsoft.PowerShell
    .Commands.GetContentCommand

    Exception calling "Clear" with "3" argument(s): "Array cannot be null.
    Parameter name: array"
    At C:\tmp\purge.ps1:6 char:22
    + [System.Array]::Clear <<<< ($tab,0,($tab.Count-50001))
    + CategoryInfo : NotSpecified: ( [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException

    Set-Content : The process cannot access the file 'C:\Program Files\Implex\Call
    Service\UserData\trace.log' because it is being used by another process.
    At C:\tmp\purge.ps1:8 char:19
    + $tab | Set-Content <<<< $file -Force
    + CategoryInfo : NotSpecified: ( [Set-Content], IOException
    + FullyQualifiedErrorId : System.IO.IOException,Microsoft.PowerShell.Comma
    nds.SetContentCommand

  8. #8
    Membre habitué
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2015
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2015
    Messages : 66
    Points : 126
    Points
    126
    Par défaut
    Actuellement le script essaye de récupérer la totalité du contenu du fichier de log.
    D'après le message, le poste n'a pas assez de mémoire pour tout récupérer d'un coup.

    Il faudrait essayer de réduire la mémoire requise, en modifiant la ligne suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [array]$tab = Get-Content $file
    en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [array]$tab = Get-Content $file -tail 50000

  9. #9
    Membre éclairé Avatar de suchiwa
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2010
    Messages
    435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2010
    Messages : 435
    Points : 899
    Points
    899
    Par défaut
    Bonjour,

    Ton fichier ce lit en Mo ou en Go ?
    Car tout importer comme je le précisais, suivant la taille du fichier, peut-être très pénalisant.

    La bonne approche de mickyballadelli d'inclure le "-tail" dans le tableau doit pouvoir limiter les I/O.
    Par contre ça ne solutionnera pas le fait qu'un processus est en train d'écrire dans le fichier au moment où tu fais le Set-content.

    Si tu veux écrire dans le même fichier, tu dois arrêter l'application qui écrit dans le log.

    Cordialement,
    Vincent
    Dans le doute, reboot...

    https://mcp.microsoft.com/authenticate/validatemcp.aspx
    931584 | Micr0s0ft

Discussions similaires

  1. regex pour ne garder que les chiffres et les ;
    Par webol dans le forum Langage
    Réponses: 5
    Dernier message: 12/02/2015, 15h48
  2. Réponses: 1
    Dernier message: 13/04/2013, 12h19
  3. Réponses: 8
    Dernier message: 15/06/2009, 13h36
  4. Fichier log pour suivre les actions d'un utilisateur
    Par Maxi-môme dans le forum VBA Access
    Réponses: 6
    Dernier message: 01/08/2007, 12h37
  5. [Oracle 8i/Fichier de log] - fichier log pour analyse erreur
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 4
    Dernier message: 25/01/2005, 19h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo