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

Tomcat et TomEE Java Discussion :

handler de logs tomcat


Sujet :

Tomcat et TomEE Java

  1. #1
    Membre averti Avatar de Rayndell
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 289
    Points : 323
    Points
    323
    Par défaut handler de logs tomcat
    Bonjour !

    Dans le but de centraliser les logs passant par des serveurs tomcat, j'ai programmé mon propre handler de logs, qui récupère les informations et les envoie par socket UDP à une machine tierce. Mais en voulant utiliser mon handler, je m'aperçois avec consternation que ça ne fonctionne pas.

    Mon code est inspiré du FileHandler de Tomcat, pour qu'il marche pareil. Voici ma 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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
     
    package org.apache.juli;
     
    import java.util.logging.*;
    import java.net.*;
    import java.io.FileWriter;
     
    public class UDPSocketHandler extends Handler {
     
    	protected String host;
    	protected int port;
    	protected DatagramSocket socket;
    	protected String msg;
     
    	protected FileWriter fw;
     
    	private void configure() {
            String className = UDPSocketHandler.class.getName();
     
            ClassLoader cl = Thread.currentThread().getContextClassLoader();
     
            if(port == 0) port = Integer.parseInt(getProperty(className + ".port", "" + 9632));
            if(host == null) host = getProperty(className + ".host", "localhost");
     
            setLevel(Level.parse(getProperty(className + ".level", "" + Level.ALL)));
     
            try {
            	setFilter((Filter) cl.loadClass(getProperty(className + ".filter", null)).newInstance());
            	setFormatter((Formatter) cl.loadClass(getProperty(className + ".formatter", null)).newInstance());
            	setEncoding(getProperty(className + ".encoding", null));
            }
            catch(Exception e){
            	e.printStackTrace();
            }
        }
     
    	public UDPSocketHandler(){
    		this(null, 0);
    	}
     
    	public UDPSocketHandler(String host, int port){
    		try{
    		fw = new FileWriter("toto.txt");
    		}catch(Exception e){}
    		this.port = port;
    		this.host = host;
    		configure();
    		connect();
    	}
     
    	private void connect(){
    		if (port == 0) throw new IllegalArgumentException("Bad port : " + port);
    		if (host == null) throw new IllegalArgumentException("Null host name : " + host);
     
    		// Try to open a new socket.
    		try {
    			socket = new DatagramSocket();
    			//socket.connect(InetAddress.getByName(host), port);
    		}
    		catch(Exception e){
    			System.err.println("Unable to connect to host " + host + " on port " + port);
    			e.printStackTrace();
    		}
    	}
     
    	public void close() throws SecurityException {
    		socket.close();
    		socket = null;
    		try{fw.close();}catch(Exception e){}
    	}
     
    	public void flush(){
    		byte[] buffer = msg.getBytes();
    		try {
    			DatagramPacket sentData = new DatagramPacket(buffer, buffer.length,
    					InetAddress.getByName(host), port);
    			socket.send(sentData);
    		}
    		catch(Exception e){
    			e.printStackTrace();
    		}
    	}
     
    	public void publish(LogRecord record){
    		if(!isLoggable(record)) return;
    		msg = getFormatter().format(record);
    		try{fw.append(msg);}catch(Exception e){}
    		flush();
    	}
     
    	private String getProperty(String name, String defaultValue) {
            String value = LogManager.getLogManager().getProperty(name);
            if (value == null) value = defaultValue;
            else value = value.trim();
            return value;
        }
    }
    Et dans le fichier de config logging.properties, j'ai rajouté ceci en plus des handlers de base :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    handlers = [...], 6localhost.org.apache.juli.UDPSocketHandler
     
    6localhost.org.apache.juli.UDPSocketHandler.host = 192.168.1.10
    6localhost.org.apache.juli.UDPSocketHandler.formatter = java.util.logging.SimpleFormatter
    6localhost.org.apache.juli.UDPSocketHandler.port = 9632
     
    org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = 2localhost.org.apache.juli.FileHandler, 6localhost.org.apache.juli.UDPSocketHandler
    C'est bien la bonne adresse ip, le bon port (j'ai un serveur qui récupère les paquets qui tourne), la classe se lance (le FileWriter crée le fichier toto.txt), mais rien ne se passe. J'ai fait un test, la méthode publish n'est même pas invoquée puisque rien n'est écrit dans toto.txt.

    Je ne sais plus quoi faire, alors si vous avez une idée, si vous voyez pourquoi mon code ne marche pas, merci d'avance.

  2. #2
    Membre averti Avatar de Rayndell
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 289
    Points : 323
    Points
    323
    Par défaut
    Problème résolu. Il faut ajouter dans la méthode configure() une ligne comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    setErrorManager(new ErrorManager());
    Par contre les logs de Tomcat c'est de la merde, ils sont totalement inexploitables, donc ce que j'ai fait ne sert à rien... sigh...

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

Discussions similaires

  1. Redirection de log tomcat de la console eclipse vers un fichier
    Par Esil2008 dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 04/07/2009, 09h10
  2. absence des logs tomcat et access log
    Par toine62 dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 23/06/2009, 16h33
  3. Access log tomcat
    Par toine62 dans le forum Tomcat et TomEE
    Réponses: 0
    Dernier message: 16/04/2009, 14h17
  4. affichage des logs Tomcat dans console
    Par gloglo dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 29/01/2009, 16h42
  5. Log Tomcat 5 dans ma console?
    Par toutoune60 dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 15/10/2006, 23h01

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