Log4j JMS appender example

21,396

Solution 1

I think you have problem in you configuration log4j.properties file. Look carefuly to it configuration. You can try to find tutorials about configuration log4j with google for example look this

Solution 2

This is the tested code - In log4j.xml make entry for the JMSAppender class as below -

<appender name="amqAppender" class="com.appender.JMSQueueAppender"> 
         <param name="brokerUri" value="failover:(tcp://host1:port,tcp://host2:port,tcp://host3:port)?randomize=false" /> 
         <param name="queueName" value="MobiviteQueue" /> 
</appender>

And to use it -

<root>
    <level value="ERROR" />
    <appender-ref ref="amqAppender" />
</root>

And the appeneder class is -

package com.appender;

import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.ObjectMessage;
import javax.jms.Session;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.log4j.Appender;
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.Logger;
import org.apache.log4j.spi.LoggingEvent;


public class JMSQueueAppender extends AppenderSkeleton implements Appender {

private static Logger logger = Logger.getLogger(JMSQueueAppender.class);

private String brokerUri;
private String queueName;


@Override
protected synchronized void append(LoggingEvent event) {

    try {
        //System.out.println("JMSQueueAppender -----append  method is called  brokerUri ------ "+brokerUri);
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerUri);

        // Create a Connection
        javax.jms.Connection connection = connectionFactory.createConnection();
        connection.start();

        // Create a Session
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

        // Create the destination (Topic or Queue)
        Destination destination = session.createQueue(queueName);

        // Create a MessageProducer from the Session to the Topic or Queue
        MessageProducer producer = session.createProducer(destination);
        producer.setDeliveryMode(DeliveryMode.PERSISTENT);

        ObjectMessage message = session.createObjectMessage(event);

        // Tell the producer to send the message
        producer.send(message);
        // Clean up
        session.close();
        connection.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}



public String getBrokerUri() {
    return brokerUri;
}



public void setBrokerUri(String brokerUri) {
    this.brokerUri = brokerUri;
}



public String getQueueName() {
    return queueName;
}



public void setQueueName(String queueName) {
    this.queueName = queueName;
}



       public void close() {
       // TODO Auto-generated method stub

       }

        public boolean requiresLayout() {
        // TODO Auto-generated method stub
        return false;
    }
}
Share:
21,396
alicjasalamon
Author by

alicjasalamon

UX student at Tampere University of Technology in Finland

Updated on October 10, 2020

Comments

  • alicjasalamon
    alicjasalamon over 3 years

    I tried to follow this example, but when I copied this class to my project I failed to run it.

    I've no idea how my imports should look like, because eclipse suggests a lot of options. I tried

    import javax.jms.Connection;
    import javax.jms.Message;
    import javax.jms.MessageConsumer;
    import javax.jms.MessageListener;
    import javax.jms.Session;
    
    import org.apache.activemq.ActiveMQConnectionFactory;
    import org.apache.activemq.command.ActiveMQObjectMessage;
    import org.apache.log4j.Logger;
    import org.apache.log4j.spi.LoggingEvent;
    

    But I got:

    log4j:WARN No appenders could be found for logger (org.apache.activemq.transport.tcp.TcpTransport).
    log4j:WARN Please initialize the log4j system properly.
    log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
    

    This tutorial isn't clear for me. Do you know anything with more details (to absolute begginer)? Or maybe you know how to solve my problem with this exception?

    EDIT:

    log4.properties is exact copy of file in example

    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=%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=logTopic
    log4j.appender.jms.TopicConnectionFactoryBindingName=ConnectionFactory
    
    • Ishikawa Yoshi
      Ishikawa Yoshi almost 12 years
      can you show your log4j.properties file
    • Akhi
      Akhi almost 12 years
      @trebuchet the initialization of the log4j is failing. test by removing the jms appender from the root logger.configure the jms appender only for a single class and check the logging there.
  • alicjasalamon
    alicjasalamon almost 12 years
    I added my log4j.properties, but it is an exact copy of file shown in example. Could it be wrong?
  • alicjasalamon
    alicjasalamon almost 12 years
    Btw I tried to google it. But it isn't that simple (e.g. tutorial from you doesn't mention JMSAppender at all)
  • Ishikawa Yoshi
    Ishikawa Yoshi almost 12 years
    I'll try to repeat this case now
  • alicjasalamon
    alicjasalamon almost 12 years
    If you still want to help, I created more detailed question about it.