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 ConsoleAppender
Utilisation 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
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