Chainsaw: un frontend per Log4j

Vediamo come utilizzare Chainsaw, un tool che ci permette di avere le informazioni di logging in una comoda ed utile GUI

Chainsaw v2

Chainsaw è un’applicazione grafica realizzata dall’Apache Group, che ci permette di visualizzare in tempo reale e soprattutto utilizzando una comoda GUI, i log delle nostre applicazioni. Immagino che molti di voi avranno avuto a che fare con log4j e lunghi/corposi log che vengono generati magari su una macchina diversa da quella che utilizziamo per sviluppare. Spesso siamo quindi costretti a leggere i log in una console, magari andando in tail sul file. Questo strumento ci aiuta proprio in questi casi ed ora vedremo come è possibile integrarlo in pochi passi nel nostro progetto. Prima di tutto dobbiamo scaricare la distribuzione dal seguente url

http://logging.apache.org/chainsaw/download.html

Poi dobbiamo avviare il programma, utilizzando chainsaw.bat (o .sh). All’avvio Chainsaw si accorge che non abbiamo nessuna configurazione e ci chiede se vogliamo definire un Receiver. Questo serve appunto per ricevere le informazioni che di solito andrebbero solo nel file di log o in altri appender (email, ftp etc. etc.). Praticamente tramite un SocketAppender di log4j noi possiamo ricevere queste informazioni e visualizzarle in questa GUI. Al primo avvio potete quindi utilizzare il semplice SocketReceiver che viene messo in ascolto sulla porta 4445 come mostrato in figura

ChainSaw 1

Ora che abbiamo definito il Receiver, Chainsaw è in attesa sulla porta 4445, quindi dobbiamo andare a configurare log4j per comunicare le informazioni di logging su questa porta

Configurazione log4j

Una delle cose più interessanti di questo software è che appunto se vogliamo utilizzarlo non dobbiamo stravolgere niente, perchè basta aggiungere un appender nella configurazione di log4j (appender che magari nella configurazione d’esercizio dovrebbe essere levato 😛 ). Vediamo quindi come definire questo ulteriore appender da aggiungere alla configurazione del nostro log4j

log4j.rootCategory=, Chainsaw, stdout
log4j.appender.Chainsaw=org.apache.log4j.net.SocketAppender
log4j.appender.Chainsaw.RemoteHost=localhost
log4j.appender.Chainsaw.Port=4445
log4j.appender.Chainsaw.LocationInfo=true
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%5p] %d{mm:ss} (%F:%M:%L)%n%m%n%n

Questa configurazione aggiunge un nuovo appender, di tipo SocketAppender, specificando host e porta. In questo modo dobbiamo soltanto aggiungere queste informazioni al nostro file di properties e la nostra applicazione comunicherà le informazioni anche a Chainsaw.

Il codice d’esempio

Viene ora riportato una semplice classe che inizializza due logger e stampa alcune informazioni, utilizzando il log4j.properties che abbiamo definito prima

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import java.io.IOException;
import java.net.URL;

public class TestChainsaw {

    private static Logger logger1 = Logger.getLogger(TestChainsaw.class);
    private static Logger logger2 = Logger.getLogger("AltraClasse");

    public static void main(String args[]) {
        String resource = "log4j.properties";
        URL configFileResource = TestChainsaw.class.getResource(resource);
        PropertyConfigurator.configure(configFileResource);
        logger1.debug("Prova debug logger1");
        logger1.debug("Prova debug logger1");
        logger2.debug("Prova debug logger2");
        logger2.debug("Prova debug logger2");
        logger2.info("Prova info logger2");
        logger2.info("Prova info logger2");
        logger1.warn("Prova warn logger1");
        logger1.warn("Prova warn logger1");
        logger1.warn("Prova warn logger1");
        logger2.error("Prova error logger2");
        logger2.error("Prova error logger2", new IOException("Habemus IOException"));
        logger2.fatal("Prova fatal logger2", 
                new SecurityException("Habemus SecurityException"));
        try {
            Thread.sleep(5000);
        } catch (InterruptedException ie) {
            logger2.error("E che non lo usiamo qui?!");
        }
    }
}

Prima di avviare questa classe dobbiamo essere sicuri che Chainsaw abbia effettivamente avviato il receiver. Se lo avete semplicemente avviato e definito il receiver classico dovreste trovarvi a destra una finestra come la seguente, dove viene mostrato il menu contestuale al receiver

ChainSaw 2

Qui potete avviare, ristartare, mettere in pausa e fermare il receiver. Inoltre è possibile definire che livello di logging ci interessa. A questo punto abbiamo quindi il receiver in esecuzione e possiamo avviare la classe d’esempio. Il risultato sarà che nella console avremo tutti i classici log e all’interno di Chainsaw verrà visualizzata una nuova finestra dove saranno riportati gli stessi log, con tutte le informazioni del caso

ChainSaw 3

 

Possono essere definiti diversi receiver, quindi possiamo nello stesso momento ricevere diverse informazioni. E’ inoltre possibile salvare gli eventi in un formato XML di log4j. Questo file può essere poi ricaricato da Chainsaw per analizzare i log in modalità offline

Chainsaw v2 Homepage

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.