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

Logging Java Discussion :

Journalisation JAVA, FileHandler


Sujet :

Logging Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 17
    Par défaut Journalisation JAVA, FileHandler
    Bonjour,

    J'ai développé une appli java demandé pour un tp en cours.
    Je dois rajouter la fonction de journalisation, logging, appelé là comme vous le voulez.
    Je me suis donc renseigné et j'arrive parfaitement à inscrire des données dans le meme fichier quand les informations à marquer sont dans la même classe.
    Par contre si j'ai d'autres informations à marquer provenant d'une même classe dans le même fichier, vu qu'apparemment je dois créer un nouveau FileHandler, du coup ça m'écrase mon fichier ou il y avait les premières infos.

    en gros j'ai ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       		logger = Logger.getLogger("log");
       		file = new FileHandler("log");
       		file.setFormatter(new SimpleFormatter());	// Fichier de sortie en format texte
       		logger.info("test");
       		logger.addHandler(file);
       		file.close();
    Du coup il faudrait au lieu de recréer un FileHandler, quelques chose qui puisse me retourner cette objet.

    J'ai donc crée cette classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    import java.io.IOException;
    import java.util.logging.FileHandler;
     
    import java.util.logging.Logger;
    import java.util.logging.SimpleFormatter;
     
    public class Logging {
    	public Logger logger;
    	public FileHandler file;
     
    	public Logging() {}
     
    	public void initialiser() throws SecurityException, IOException{
       		logger = Logger.getLogger("log");
       		file = new FileHandler("log");
       		file.setFormatter(new SimpleFormatter());	// Fichier de sortie en format texte
       		logger.info("Initialisation de la journalisation");
       		logger.addHandler(file);
       		file.close();
    	}
     
     
    	public void setAjout(String message){
    		logger = Logger.getLogger("log");
    		logger.info(message);
    		logger.addHandler(getFichier());
    		file.close();
    	}
    	public FileHandler getFichier(){
    		return file;
    	}
     
    	public Logger getLogger(){
    		return logger;
    	}
    }
    que j'utilise comme ceci dans mes différentes classes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    		Logging log = new Logging();
     
    		log.initialiser();
    		log.setAjout("Démarrage de l'application");
    Mais ceci n'est pas la solution car j'initialise donc l'ensemble des mes variables.

    J'ai donc parti après sur cette solution:
    Mettre cette partie ou j'ai besoin d'enregistrer une info :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       		Logger logger = Logger.getLogger("log");
       		FileHandler fichier = new FileHandler("log");
       		fichier.setFormatter(new SimpleFormatter());	// Fichier de sortie en format texte
       		logger.addHandler(fichier);
       		logger.log(Level.INFO, "début affichage");
    Puis mettre le même principe ailleurs, mais de ce cas là je n'ai que la dernière inscription dans le fichier de log.
    J'ai donc réessayé en me disant que sans recréer le FileHandler en appelant juste le logger par getLogger() et ajouter la nouvelle inscription, mais ça ne marche pas. Je ne dois pas être loin mais je n'ai plus d'idée...
    Aurez vous une solution alors pour écrire dans le même fichier de log à partir de différentes classes?

    Merci d'avance,

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 17
    Par défaut
    Je me permets de faire avancer le sujet seul
    Alors après de multiples essais, j'ai essaye d'effectuer ces opérations sur un projet sans package. Et là pas de soucis, il retrouve sans soucis le Logger.
    Apparemment l'idéal serait de créer un logger par package, mais dans ce cas, j'aurai donc X fichiers de log en sortie. Malheureusement pour moi toutes les actions du début jusqu'à la fin du logiciel doivent être enregistré dans le même fichier. Bien évidemment je n'ai pas qu'un seul package.

    avez vous une idée d'y remédier?

  3. #3
    Membre expérimenté

    Inscrit en
    Octobre 2009
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 133
    Par défaut
    Bonjour,

    pour permettre a ton programme d'écrire dans le fichier sans le supprimer, il faut utiliser le boolean append de la classe FileHandler, ton appel devra donc être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new FileHandler("log", true);
    En ce qui concerne le fait d'écrire dans des répertoires différents ton fichier de log, le problème vient du même appel, le constructeur FileHandler va créer un fichier "log" dans le répertoire ou la classe se trouve, tu as donc 2 solutions rapides a mettre en place :
    - Créer une classe unique qui va créer le FileHandler en append, de ce fait, la création se fera dans un seul répertoire
    - Modifier le "log" pour "%h/log", cela devrait créer ton fichier dans le répertoire user.home

    Clairement, ces 2 solutions sont la pour etre facile et rapide a mettre en place mais elles ne sont pas très propres.
    La meilleure solution pour moi serait de créer une classe singleton Logging qui initialiserait tous les besoins pour tes logs (dont ton FileHandler) et l'appel au logging se ferait par cette classe (via une méthode qui écrirait dans le fichier).
    Le pattern singleton n'est pas difficile a apprendre et cela ne serait pas difficile a implémenter, si tu as le temps, je te conseillerais donc cela, sinon, tu pourras le voir plus tard.

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    vu que tu utilise visiblement un système de logging standard (log4j ou commons loggin, va savoir) pourquoi t'emm* tu à créer des filehandler. Laisse le système de logging que tu as choisit créer ses propre handler en interne et contente toi de lui faire un beau fichier de configuration, comme un log4j.xml si tu utilise log4j.... Ton application ne devrais rien avoir à faire de plus que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Logger log = Logger.getLogger("nomduLogger");
    .....
    log.info("Il s'est passé ceci...");
    La création éventuelle de fichiers, l'envoi sur base de données ou par email, c'est la popotte interne du logger en fonction de son fichier de configuration. A part créer le fichier de configuration, tu n'a rien à faire de ce coté là.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 17
    Par défaut
    Bizarre j'avais demandé de suivre cette discussion et c'est en revenant au hasard que je vois qu'il y a des réponses.
    Alors au final, tout marche correctement. Allez savoir pourquoi (si je regardais en détail je saurai) mais au moins ça marche. Pour répondre aux quelques questions, j'utilise le système de log intégré de base au JDK :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    import java.util.logging.*;
    Au final, j'ai crée une classe qui contient toute la "gestion" des logs (initialisation et ajout de texte) et il me suffit donc seulement d'appeler les méthodes de cette classes pour faire ce que je veux.
    Je laisse mon code au cas où quelqu'un en voudra :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    /**
     * 
     */
    package controleur;
     
    import java.io.IOException;
    import java.util.Date;
    import java.util.logging.FileHandler;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import java.util.logging.SimpleFormatter;
     
    import vue.Vue;
     
    /**
     * @author E098893S
     *
     */
    public class ControleurLogging {
    	private Vue vue;
    	private static FileHandler fichier;
    	private Logger logger;
     
    	public ControleurLogging() {}
     
    	public void init() throws SecurityException, IOException{
       		logger = Logger.getLogger("logging");
       		Date date = new Date();
    		fichier = new FileHandler("Journalisation_"+date.getDate()+"-"+(date.getMonth()+1)+"-"+(date.getYear()+1900)+"_"+date.getHours()+"h"+date.getMinutes()+"m"+date.getSeconds()+"s_%g",false);   // contrainte exigé par le TP (un log par demarrage de l'appli....)
    		fichier.setFormatter(new SimpleFormatter());	
    		logger.addHandler(fichier);
    		setFichier(fichier);
    	}
     
    	/**
             * @param fichier2
             */
    	private void setFichier(FileHandler fichier2) {
    		fichier = fichier2;
    	}
     
    	public void ajouter(String str){
    		Logger logger = Logger.getLogger("logging");
       		logger.log(Level.INFO, str);
    	}
     
    	public void closeFichier(){
    		fichier.close();
    	}
    }
    Au première appel de mon logger j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    			controleurLog.init();
    			controleurLog.ajouter("Affichage de l'application");
    pis après dans les appels suivant dans d'autres classes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new ControleurLogging().ajouter("Ouverture du fichier effectuée");
    Je ne sais pas si tout celà respecte les différentes normes JAVA si j'ai envie de dire mais au moins ça marche.
    Après pour le pattern du nom de fichier le : %g chez moi donne toujours 0 mais de toute façon avec l'objet Date() je n'ai pas vraiment besoin de l'utiliser. Il faudrait que 2 utilisateurs démarre l'appli à la même seconde...
    Sinon j'ai une petite interrogation au niveau des threads mais bon je chercherai une réponse sur le forum ou je posterai un message en tant venu (oui les threads et moi ça fais...10 doInBackground() trop pour moi )

    Merci encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/06/2010, 15h39
  2. webcam : lire sur un port usb en c/c++ ou java. sous win. ?
    Par flo007 dans le forum Choisir un environnement de développement
    Réponses: 2
    Dernier message: 24/05/2002, 23h24
  3. Service de nommage java C++
    Par Anonymous dans le forum CORBA
    Réponses: 3
    Dernier message: 15/04/2002, 12h48

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