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

C# Discussion :

Problème FileSystemWatcher et Apache


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 69
    Par défaut Problème FileSystemWatcher et Apache
    Bonjour.

    J'ai actuellement un problème que je n'arrive pas à résoudre. J'essaye de détecter un changement dans le fichier "access.log" qui contient mes logs Apache (sous Windows).

    Le problème est que la méthode "FileChanged" n'est pas appelée à chaque fois qu'Apache écrit dans ce fichier.

    J'ai essayé de faire un tail sur ce même fichier avec un autre outil, et ce dernier détecte bien les changements tandis que mon prog ne détecte rien.

    Autre remarque : Mon prog est en marche et que je sais que des messages ont été générés. Si je vais dans l'explorateur Windows et que je clique une fois sur ce fichier access.log, mon prog détecte un changement, comme s'il fallait "titiller" un peu ce fichier pour pouvoir détecter des changements.

    Quelqu'un a-t-il une idée?

    D'avance merci.

    Mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    static void Main()
    {
    	FileSystemWatcher _watcher = new FileSystemWatcher();
    	_watcher = new FileSystemWatcher("C:\\Program Files (x86)\\Apache Software Foundation\\Apache2.2\\logs", "access.log");
    	_watcher.Changed += new FileSystemEventHandler(FileChanged);
    	_watcher.EnableRaisingEvents = true;
    	_watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.Size;
    	Console.ReadLine();
    }
     
    static void FileChanged(object sender, FileSystemEventArgs args)
    {
    	Console.WriteLine("Changement détecté");
    }

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 201
    Par défaut
    Je ne suis absolument pas certain de ce que j'avance, mais serait-il possible que Apache est une sorte d'handler en écriture en permanence, permettant tout de même au autre prog de simplement lire? (accès en écriture quoi).

    Et que donc, Windows, ne considère pas le fichier modifier tant que ce handler n'a pas relâché le fichier ?

    Ça pourrait peut-être expliqué que si tu le sélectionne avec l'explorateur (qui créé un accès puis le libère surement immédiatement) le FileWatcher réagisse ?

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 69
    Par défaut
    Merci DarkHerumor pour ta réponse rapide.

    Ton idée semble correcte. En effet on ne peut pas directement écrire dans ce fichier tant qu'Apache est en fonctionnement.

    J'ai regardé les codes de certains tails, et j'ai remarqué qu'ils contrôlaient à interval de temps régulier la taille du fichier (en utilisant un FileInfo par ex), et si cette taille est supérieure alors ils récupèrent les nouvelles lignes en l'ouvrant avec un FileStream ou autre.

    C'est dommage car je pensais que le FileSystemWatcher permettait de faire cela directement grâce au "NotifyFilters.Size".

    Sinon je vais vérifier, mais il me semble qu'au bout d'un moment (entre 30 minutes et 1 heure) mon watcher détecte le changement sans rien toucher. C'est balot si on veut faire de l'analyse en temps réél ^^.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 201
    Par défaut
    Il y a surement une solution avec le FileSystemWatcher alors... Peut-être en testant les autres Filtre de notifications avec peut-être un LastAccess (mais j'ai des doutes :/ )?

    Sinon, tu peux passer par un Timer, qui vérifiera toutes les x secondes / minutes la tailles du fichiers à la façon des tails dont tu parles.

  5. #5
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 69
    Par défaut
    Avec tous les filtres dispos, j'ai le même résultat.

    L'idée du timer toutes les X secondes est mon idée de secours. Je vais surement l'appliquer d'ici quelques jours si personne n'a d'autre idée à me proposer.

    Merci!

  6. #6
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 54
    Par défaut
    Bonjour,

    si j'ai bien compris tu vas vérifier toutes les X secondes si oui ou non la taille du fichier a changé? Si oui, bon je n'apporte rien de nouveau mais juste une mise en garde car tu pourrais passer au travers de certaines modifications.

    PS: Et sinon du cote du LastModify tu as peut être une solution, je te lance une idée sans pouvoir être sur que ce soit applicable.

  7. #7
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 69
    Par défaut
    Bonjour morgan2b.

    Du côté du LastModify, je crois avoir testé cela sans succès.

    Toutefois j'ai un nouveau problème. J'ai lâché le FileSystemWatcher pour utiliser un StreamReader que j'ouvre sur mon fichier de logs Apache et sur lequel je veux faire un while(true) puis faire un "_reader.ReadLine()".

    Mon problème est que dans mon StreamReader, la propriété Length ne change jamais même si le fichier a été modifié (modifié par Apache lui-même) .

    Toute cette histoire m'ennuie assez. Merci pour vos idées!

Discussions similaires

  1. Problème d'accès apache
    Par Florent08800 dans le forum Apache
    Réponses: 1
    Dernier message: 17/12/2006, 21h16
  2. Problème pour installer apache
    Par nissac dans le forum Administration système
    Réponses: 5
    Dernier message: 03/10/2006, 18h36
  3. Problème de redémarrage apache
    Par piR86 dans le forum Apache
    Réponses: 6
    Dernier message: 27/04/2006, 17h05
  4. [Apache]Problème se services Apache
    Par bartmarley dans le forum Apache
    Réponses: 6
    Dernier message: 15/07/2004, 14h13

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