How to use JMS Appender?
Emily Wong
Inmy research about JMS Appenders I've found turorial1 and tutorial2 . I've tried to follow them, but I couldn't run example program.
Fistly I created file log4j.properties
log4j.rootLogger=INFO, stdout, jms
#
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
#
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=ConnectionFactoryand jndi.properties
topic.logTopic=logTopicThen I added Receiver.java to my project
public class Receiver implements MessageListener { 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); Logger log = Logger.getLogger(Receiver.class); log.info("Test log"); Thread.sleep(1000); consumer.close(); sess.close(); conn.close(); System.exit(1); } public static void main(String[] args) throws Exception { new Receiver(); } @Override public void onMessage(Message message) { try { // receive log event in your consumer LoggingEvent event = (LoggingEvent)((ActiveMQObjectMessage)message).getObject(); System.out.println("Received log [" + event.getLevel() + "]: "+ event.getMessage()); } catch (Exception e) { e.printStackTrace(); } }
}I need make Receiver to gather all logs from project, but I cannot even run this simple example. Probably I don't know how to configure it correctly, because I get this output:
log4j:WARN No appenders could be found for logger (org.apache.activemq.transport.WireFormatNegotiator).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See for more info.Did I miss adding some lines in code or some files to classpath? I'm new to log4j.
EDIT:
I set Logger in AspectJ class. But I think that also in Receiver Logger is created and log is sent, so probably it should be done in Receiver, not in other class in my project.
static final Logger logger = Logger.getLogger(ReportingAspect.class);
@Before("setLoggingFile()")
public void setProperties() { PropertyConfigurator.configure("log4j.properties");
}
ProjectJMS
|
\_ src
| \_ packages...
\_jndi.propeties
\_log4j.properties 6 3 Answers
To configure log4j use : -Dlog4j.configuration= path to config file
Path to conf file CAN be: À file in a path outside of classpath , if so préfix it with file:/// , example:
- -Dlog4j.configuration=file:/c:/foobar.lcf
Else in classpath in That case:
- -Dlog4j.configuration=foobar.lcf where foobar.lcf is at root of your source folder
See:
For jms:
-Add jms.jar at least to classpath
- ensure you have a JMS broker running ( activemq for example)
Regards
Philippe
1You need to move the log4j.properties under 'src' folder so it'll be included in the classpath, since it's not there it is not being loaded.
Have you validated, that your Method setProperties() is called before you used your logger?
Usually that kind of error only pops up, when either the configuration file (log4j.properties) was not found while initializing log4j by PropertyConfigurator, or you tried to log something before you initialized log4j with your PropertyConfigurator.
First your should make sure, that setProperties() is called the way you expect it to be called and if this should work you could try to validate if the configuration can be loaded. From what I see, I guess your configuration file should be found. To validate this, you could load the configuration in several steps to make sure, it was found:
Properties props = new Properties(); props.load( new FileInputStream( "log4j.properties" ) ); PropertyConfigurator.configure( props );If your configuration will not be found, you'll receive a FileNotFoundException.