Log4j JMS appender example

2019-08-12 23:20发布

问题:

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

回答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



回答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;
    }
}


标签: java log4j jms