2012-08-08 19 views
5

Sto cercando di aggiungere il componente di registrazione al sistema distribuito. È scritto in AspectJ per evitare di concatenare il codice sorgente attuale. Uso l'appender socket per inviare i log, ma mi piacerebbe provare qualcosa di più efficace.Quali appendici dovrebbero essere utilizzati nel sistema distribuito? Come configurarli?

Ho sentito che dovrei usare JMSAppender e AsyncAppender, ma non sono riuscito a configurarlo. Devo creare Receiver che raccoglie i log e li passiamo al database e alla GUI (io uso ChainSaw)?

Ho provato a seguire turorial1 e tutorial2, ma non sono abbastanza chiari.

enter image description here

Edit:

In una piccola demo ho preparato ho mandato 6 registri per una richiesta (simulazione di 3 componenti)

[2012-08-08 15:40:28,957] [request1344433228957] [Component_A] [start] 
[2012-08-08 15:40:32,050] [request1344433228957] [Component_B] [start] 
[2012-08-08 15:40:32,113] [request1344433228957] [Component_C] [start] 
[2012-08-08 15:40:32,113] [request1344433228957] [Component_C] [end - throwing] 
[2012-08-08 15:40:32,144] [request1344433228957] [Component_B] [end] 
[2012-08-08 15:40:32,175] [request1344433228957] [Component_A] [end] 

Utilizzo della presa Appender. Così i miei log4j.properties è:

log4j.rootLogger=DEBUG, server 

log4j.appender.server=org.apache.log4j.net.SocketAppender 
log4j.appender.server.Port=4712 
log4j.appender.server.RemoteHost=localhost 
log4j.appender.server.ReconnectionDelay=1000 

così corro

>java -classpath log4j-1.2.17.jar org.apache.log4j.net.SimpleSocketServer 4712 log4j-server.properties 

con la configurazione

log4j.rootLogger=DEBUG, CA, FA 

# 
log4j.appender.CA=org.apache.log4j.ConsoleAppender 
log4j.appender.CA.layout=org.apache.log4j.PatternLayout 
log4j.appender.CA.layout.ConversionPattern=[%d] [%t] [%c] [%m]%n 

# 
log4j.appender.FA=org.apache.log4j.FileAppender 
log4j.appender.FA.File=report.log 
log4j.appender.FA.layout=org.apache.log4j.PatternLayout 
log4j.appender.FA.layout.ConversionPattern=[%d] [%t] [%c] [%m]%n 

Poi io mando il mio registri dal file da Chainsaw:

enter image description here

È assolutamente fondamentale, ma voglio imparare come farlo meglio. Prima di tutto, vorrei inviare i registri in modo asincrono. Quindi crea un ricevitore molto semplice, ad es. può passare i log in un file.

Ho provato a seguire i tutorial che ho elencato sopra, ma ho fallito. Quindi la domanda è: potresti fornire qualche configurazione di esempio? Esempio di file Receiver.java e log4.properties?

risposta

2

Finalmente ho trovato come configurarlo. Ho messo 2 file nella cartella src.

jndi.properties

topic.logTopic=logTopic 

e log4j-jms.properties

log4j.rootLogger=INFO, stdout, jms 

## Be sure that ActiveMQ messages are not logged to 'jms' appender 
log4j.logger.org.apache.activemq=INFO, stdout 

log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern= 

## Configure 'jms' appender. You'll also need jndi.properties file in order to make it work 
log4j.appender.jms=org.apache.log4j.net.JMSAppender 
log4j.appender.jms.InitialContextFactoryName=org.apache.activemq.jndi.ActiveMQInitialContextFactory 
log4j.appender.jms.ProviderURL=tcp://localhost:61616 
log4j.appender.jms.TopicBindingName=logTopic 
log4j.appender.jms.TopicConnectionFactoryBindingName=ConnectionFactory 

Poi eseguo il mio programma con VM argomento

-Dlog4j.configuration=log4j-jms.properties 

e ricevono i registri in classe Receiver.java

public class Receiver implements MessageListener { 

    PrintWriter pw = new PrintWriter("result.log"); 
    Connection conn; 
    Session sess; 
    MessageConsumer consumer; 

    public Receiver() throws Exception { 


     ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616"); 
     Connection conn = factory.createConnection(); 
     Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); 
     conn.start(); 
     MessageConsumer consumer = sess.createConsumer(sess.createTopic("logTopic")); 
     consumer.setMessageListener(this); 
    } 

    public static void main(String[] args) throws Exception { 
     new Receiver(); 

    } 

    public void onMessage(Message message) { 
     try { 
      LoggingEvent event = (LoggingEvent) ((ActiveMQObjectMessage) message).getObject(); 

      DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS"); 
      String nowAsString = df.format(new Date(event.getTimeStamp())); 

      pw.println("["+ nowAsString + "]" + 
        " [" + event.getThreadName()+"]" + 
        " ["+ event.getLoggerName() + "]" + 
        " ["+ event.getMessage()+"]"); 
      pw.flush(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
2

Vorrei utilizzare NFS o CDFS e montare un'unità su tutte le macchine. Chiedi a ogni istanza dell'applicazione di scrivere su un file diverso. Sarai in grado di trovare tutti i log in una directory (o unità) indipendentemente dal numero di macchine che utilizzi.

Non vorrei utilizzare NFS o CDFS su una WAN globale con una latenza elevata, ad es. > 50 ms andata e ritorno. In questa causa ho usato JMS (ma non ho usato log4j)

+0

Ho bisogno di dividere i registri su file diversi per tipo di richiesta, non per nome macchina. È possibile? – alicjasalamon

+0

Hai bisogno di farlo quasi in tempo reale o può essere elaborato durante la notte? Un file per richiesta potrebbe essere molto inefficiente. Se stai facendo qualcosa di sensibile al tempo non userei log4j in alcun modo. ;) –

+0

La mia idea era: i messaggi vengono inviati in modo asincrono dall'appender JMS a 'Receiver'. 'Ricevitore' sceglie le richieste più lunghe o una richiesta in un gruppo di 50, quindi passa a ChainSaw e al database. Non dovrei usare log4j in questa situazione? Sto cercando una soluzione ** easy ** – alicjasalamon

2

I miei due centesimi. Qualunque cosa tu faccia, assicurati di utilizzare un meccanismo asincrono per consegnare i tuoi registri al ricevitore, altrimenti alla fine si fermerà il tuo app. Un altro punto, per consegnare i registri in modo affidabile, dovrebbe essere considerato un meccanismo di failover incorporato nell'appender stesso: i ricevitori potrebbero andare offline per un tempo breve o lungo, se ci si preoccupa dei log, il failover è sicuramente richiesto. Abbiamo creato similar system che descrivi (scusa per l'aggiunta), ma se ti piace puoi usare il nostro appender (guarda in downloads), è gratuito e ha le fonti. C'è anche un video tutorial. Ha un failover e un meccanismo asincrono flessibile oltre a un back-up di backup.

Quante appendici dovresti usare? Un appender per jvm andrà tutto bene.I file di configurazione dovrebbero probabilmente essere per jvm, non è sicuro di come si intende implementare il ricevitore, in ogni caso gli appenders devono trovare il proprio ricevitore che di solito è almeno una coppia di porte host. Per quanto riguarda il database, la mia esperienza è molto acida con RDBMS (ci stiamo spostando su nosql) ma se non superi i duecento milioni di record, la maggior parte dei database commerciali farà qualche sforzo. Non è un compito semplice, devo dire, ci sono voluti un paio d'anni per costruire un sistema di qualità commerciale appena disegnato con pochi rettangoli magri :)

+0

Non è semplice, di sicuro :) Sicuramente non per gli studenti del 2 ° anno. LogFaces sembra fantastico e io ne sarò ispirato, senza dubbio. Il tuo consiglio è molto "di alto livello", quindi modificherai la mia domanda in un minuto per fornire maggiori dettagli. Sono nuovo di tutte le tecnologie che uso, sicuramente bisogno di supporto. – alicjasalamon

2

Consiglierei syslog e l'appender integrato in syslog. Usa TCP per la registrazione affidabile (+ appender di Asyc) o UDP per la registrazione fire-and-forget. Ho una configurazione di rsyslog se ne hai bisogno.

+0

Negativo dell'utilizzo di appender syslog è che si perde MOLTA delle informazioni strutturate fornite con log4j. Se il punto di partenza non fosse log4j, sicuramente sarebbe una buona opzione. –

+0

Accetto, ora, 3,5 anni dopo, non usiamo più syslog. (logback + appender di logenries). – Jan

Problemi correlati