2010-01-19 12 views
1

J'essaie de produire une journalisation d'expédition de preuve de concept à partir de Log4J via JMS à l'aide de la version log4J JMSAppender. J'ai essayé ActiveMQ et l'exemple fourni avec. J'ai déchiré cet exemple, et l'ai rendu plus générique et compatible avec plusieurs plates-formes. Il semble que tout ait été corrigé, car je peux voir une connexion avec l'ActiveMQ, mais le code se bloque lorsque j'obtiens l'InitialContext (avec -Dlog4j.debug, les classes du client ActiveMQ semblent invoquer log4J et charger les propriétés qui, à son tour, essaient de se connecter au JMS pour JMSAppender), puis le code se bloque. J'ai essayé d'isoler les messages du journal se dirigeant vers la JMS que de définir le appender pour un seul enregistreur nommé, et le paquet org.apache.activemq est configuré pour utiliser le ConsoleAppenderUtilisation de Log4J JMSAppender avec ActiveMQ

Le même code fonctionne très bien lorsqu'il est pointé à un Weblogic Server avec une file d'attente JMS configurée mais pour une compatibilité maximale Je dois essayer de la faire fonctionner avec ActiveMQ

Y a-t-il un peu de configuration «magique» qui me manque pour faire fonctionner ActiveMQ correctement?

- quelques bits échantillons du travail jusqu'à la chair cette question un peu maintenant j'ai le code à la main

log4j-jms.properties

log4j.rootLogger=INFO, stdout 

## Be sure that ActiveMQ messages are not logged to 'jms' appender 

log4j.logger.org.apache=ERROR, stdout 
log4j.logger.javax=ERROR,stdout 
log4j.logger.java=ERROR,stdout 

log4j.logger.demo=DEBUG,jms 

log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%d %-5p %c - %m%n 

## 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=topic.logTopic 
log4j.appender.jms.TopicConnectionFactoryBindingName=ConnectionFactory 

L'objet de cette était de créer un appender nommé «démo» et dans l'exemple de saisir le code que de se connecter pour s'assurer que la journalisation activemq n'essayait pas de se envoyer à l'exemple de code JMS

. C'est un peu un bordel comme je l'ai été piratage avec elle pour essayer de faire fonctionner les choses. En l'état, cela fonctionnera quand je le pointerai vers Weblogic, et changerai la configuration log4j de la même façon. L'objet de ce code était de faire que j'avais l'auditeur pour le sujet cours d'exécution dans un thread séparé

NewLog4jJMSAppenderExample.java

import javax.jms.*; 
import javax.naming.Context; 
import javax.naming.InitialContext; 
import javax.naming.NamingException; 
import org.apache.log4j.Logger; 
import org.apache.log4j.spi.LoggingEvent; 

import java.util.Properties; 
/** 
* A simple example of log4j jms appender in conjuction with ActiveMQ 
*/ 
public class NewLog4jJMSAppenderExample { 
    Runnable listener; 
    Thread runner; 

    private enum MQImplementation { 
     ActiveMQ, Weblogic 
    }; 

    public NewLog4jJMSAppenderExample() { 
     // create a logTopic topic consumer 

     listener = new BigEars(); 
     System.out.println("******* Listener Created **********"); 

     runner = new Thread(listener); 
     runner.start(); 

     try { 
      Thread.sleep(10); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
     } 

    } 

    public static void main(String[] args) throws Exception { 
     System.out.println("******* I HAVE STARTED **********"); 


     new NewLog4jJMSAppenderExample(); 


     System.out.println("******* LOGGING **********"); 

     // log a message 

     Logger log = Logger.getLogger("demo"); 
     log.error("Test log"); 

     Thread.sleep(100000); 

     System.exit(1); 

    } 

    public class BigEars implements Runnable, MessageListener { 
     ConnectionFactory factory; 
     Connection conn; 
     Session sess; 
     MessageConsumer consumer; 

     public BigEars() { 

      MQImplementation inUse = MQImplementation.ActiveMQ; 

      System.out.println("Constructing Bigears"); 
      try { 
       Properties env = new Properties(); 

       switch (inUse) { 

        case Weblogic: 
         env.put(Context.INITIAL_CONTEXT_FACTORY, 
           "weblogic.jndi.WLInitialContextFactory"); 
         env.put(Context.PROVIDER_URL, 
           "t3://localhost:7001"); 
         break; 

        case ActiveMQ: 
         env.put(Context.INITIAL_CONTEXT_FACTORY, 
           "org.apache.activemq.jndi.ActiveMQInitialContextFactory"); 
         env.put(Context.PROVIDER_URL, 
           "tcp://localhost:61616"); 
         break; 
       } 

       System.out.println("Initial Context"); 

       InitialContext jndi = new InitialContext(env); 
       System.out.println("Factory"); 
       factory = (TopicConnectionFactory) jndi.lookup("ConnectionFactory"); 

       Topic theTopic = (Topic) jndi.lookup("topic.logTopic"); 


       System.out.println("Connection"); 
       conn = factory.createConnection(); 

       System.out.println("******* I HAVE set up and created connection **********"); 
       System.out.println("session"); 
       sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); 
       System.out.println("consumer"); 
       consumer = sess.createConsumer(theTopic); 
       System.out.println("listener"); 
       consumer.setMessageListener(this); 

       conn.start(); 



      } catch (JMSException jme) { 
       System.out.println(jme); 
      } catch (NamingException ne) { 
       System.out.println(ne); 
      } 
     } 


     public void run() { 
      try { 
       System.out.println("******* zzzzzzzz! **********"); 

       Thread.sleep(100000); 
      } catch (Exception e) { 
       e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
      } 
     } 

     public void onMessage(Message message) { 
      try { 
       try { 
        System.out.println("******* I GOT A MESSAGE **********"); 
        // receive log event in your consumer 
        System.out.println(message.toString()); 

        LoggingEvent event = (LoggingEvent) (((ObjectMessage) message).getObject()); 
        System.out.println("Received log [" + event.getLevel() + "]: " + event.getMessage()); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

      } finally { 

       try { 
        consumer.close(); 
        sess.close(); 
        conn.close(); 
       } catch (JMSException jme) { 
        System.out.println(jme); 
       } 
      } 
     } 

}}

exploitation forestière présenté lors -Dlog4j .debug mis

******* I HAVE STARTED ********** 
Constructing Bigears 
Initial Context 
log4j: Trying to find [log4j-jms.properties] using context classloader [email protected] 
log4j: Using URL [file:/Users/kevin/Desktop/apache-activemq-5.3.0/example/target/classes/log4j-jms.properties] for automatic log4j configuration. 
log4j: Reading configuration from URL file:/Users/kevin/Desktop/apache-activemq-5.3.0/example/target/classes/log4j-jms.properties 
log4j: Parsing for [root] with value=[INFO, stdout]. 
log4j: Level token is [INFO]. 
log4j: Category root set to INFO 
log4j: Parsing appender named "stdout". 
log4j: Parsing layout options for "stdout". 
log4j: Setting property [conversionPattern] to [%d %-5p %c - %m%n]. 
log4j: End of parsing for "stdout". 
log4j: Parsed "stdout" options. 
log4j: Parsing for [org.apache] with value=[ERROR, stdout]. 
log4j: Level token is [ERROR]. 
log4j: Category org.apache set to ERROR 
log4j: Parsing appender named "stdout". 
log4j: Appender "stdout" was already parsed. 
log4j: Handling log4j.additivity.org.apache=[null] 
log4j: Parsing for [demo] with value=[DEBUG,jms]. 
log4j: Level token is [DEBUG]. 
log4j: Category demo set to DEBUG 
log4j: Parsing appender named "jms". 
log4j: Setting property [initialContextFactoryName] to [org.apache.activemq.jndi.ActiveMQInitialContextFactory]. 
log4j: Setting property [topicBindingName] to [topic.logTopic]. 
log4j: Setting property [topicConnectionFactoryBindingName] to [ConnectionFactory]. 
log4j: Setting property [providerURL] to [tcp://localhost:61616]. 
log4j: Getting initial context. 
log4j: Looking up [ConnectionFactory] 
log4j: About to create TopicConnection. 
log4j: Creating TopicSession, non-transactional, in AUTO_ACKNOWLEDGE mode. 

Ici, il se bloque juste et finalement fois sur

Répondre

1

Finalement, le chargement de la configuration de log4j a semblé être un problème, avec la configuration de JMS lorsque l'appender JMS établissait la connexion. Si je charge la config sans les niveaux de journalisation ActiveMQ ou les appenders définis alors le problème ne se produit pas une fois que JMSAppender est attaché alors je peux charger la config supplémentaire pour lui permettre de se connecter au JMS

0

Comme vous n'a pas fourni beaucoup de détails (sur la configuration, les journaux, traces, etc.), puis-je demander si vous suiviez How do I use log4j JMS appender with ActiveMQ. Si oui, et si cet échantillon fonctionnait, quels changements avez-vous faits?

En note, au lieu de log4j, je considérerais utiliser logback, son successeur. Découvrez son Appenders.

+0

Suivi exactement cet exemple et avec ActiveMQ 5.3 où il est fourni avec le code, il ne fonctionne pas hors de la boîte. Je vais jeter un coup d'œil au logback, mais l'un de mes principaux critères pour ce travail est que je dois travailler de manière transparente avec le code existant qui a déjà log4J dans le code. J'ai essayé de brancher slf4J mais cela n'a pas résolu le problème avec ActiveMQ. J'ai ajouté quelques exemples de code, de configuration et de sortie de journal à la question d'origine maintenant que j'ai le code à remettre – Kevin

0

Vous pouvez essayer d'utiliser AsynchAppender, ce qui permet aux threads log4j de ne PAS bloquer (c'est-à-dire se bloquer) sur une instruction log en cas d'erreur. J'ai été capable de le faire pour un JMSAppender et un appender de console à la fois dans un AsynAppender. Cependant, vous devez changer votre fichier log4j.properties en une configuration de fichier log4j.xml. format.