如何將 log4j JMS appender 與 ActiveMQ Classic 搭配使用
常見問題 > 使用 Apache ActiveMQ Classic > 如何將 log4j JMS appender 與 ActiveMQ Classic 搭配使用
Log4j JMS appender 可用於將您的日誌訊息發送到 JMS 訊息代理程式。要使用 ActiveMQ Classic 作為您訊息的目的地,您需要正確設定 JMS appender。下面的程式碼範例顯示了範例設定
log4j.rootLogger=INFO, stdout, jms
## Be sure that ActiveMQ Classic 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://127.0.0.1:61616
log4j.appender.jms.TopicBindingName=logTopic
log4j.appender.jms.TopicConnectionFactoryBindingName=ConnectionFactory
重要的是不要將 ActiveMQ Classic 的日誌發送到 JMS appender,因為這可能會導致錯誤,因為訊息代理程式會在連線建立之前就想要記錄。您還需要一個 JNDI 設定,以便 appender 可以找到適當的主題來發送日誌訊息。範例 jndi.properties
檔案看起來像這樣
topic.logTopic=logTopic
最後,您可以訂閱該主題並監聽日誌訊息
public class Log4jJMSAppenderExample implements MessageListener {
public Log4jJMSAppenderExample() throws Exception {
// create a logTopic topic consumer
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://127.0.0.1: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);
// log a message
Logger log = Logger.getLogger(Log4jJMSAppenderExample.class);
log.info("Test log");
// clean up
Thread.sleep(1000);
consumer.close();
sess.close();
conn.close();
System.exit(1);
}
public static void main(String[] args) throws Exception {
new Log4jJMSAppenderExample();
}
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();
}
}
}
請注意,appender 會將記錄事件包裝在物件訊息中發送,因此您可以提取諸如記錄器名稱、級別以及當然還有訊息等資訊。
從 ActiveMQ Classic 5.3 開始,此範例已包含在標準發行版中。您可以執行以下命令來執行它
ant log4j-jms
在 example/
資料夾內。您應該會看到以下輸出結果
log4j-jms:
[echo] Running a Log4j JMS Appender example
[java] 2009-08-11 13:58:46,767 INFO Log4jJMSAppenderExample - Test log
[java] Received log [INFO]: Test log
[java] Java Result: 1