如何將 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

Apache、ActiveMQ、Apache ActiveMQ、Apache 羽毛標誌和 Apache ActiveMQ 專案標誌是 The Apache Software Foundation 的商標。版權所有 © 2024,The Apache Software Foundation。根據 Apache License 2.0 授權。