我在Wildfly 10.1 Final上运行Java EE项目。
我想创建一个自定义Log4j appender,它会记录到JMS队列。 我已经在我的Java EE应用程序中创建了一个 Message Driven Bean ,它从队列中接收日志消息。
我通过添加此注释创建了我的MDB:
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType",
propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destination",
propertyValue = "queue/MyQueue")
})
此bean还实现 MessageListener 接口,并覆盖它的 onMessage()方法,其中我在日志消息到达时定义了所需的行为。它看起来像这样:
public class myBean implements MessageListener {
@Override
public void onMessage(Message msg) {
if(msg instanceof TextMessage){
TextMessage txtMess = (TextMessage)msg;
String context = (String)txtMess.getText();
processLogData(context);
}
}
我还需要通过从 standalone-full.xml 复制所有与JMS相关的行来将JMS添加到Wildfly的 standalone.xml 。我还需要将我的队列添加到 standalone.xml ,方法是将此行添加到 :
<jms-queue name="SequenceQueue" entries="java:/jms/queue/MyQueue"/>
现在,我想使用apache提供的JMSQueueAppender类来将日志消息发送到MyQueue。
我不确定,我该怎么办呢。我应该把JMSQueueApender课放在哪里?我应该为 queueConnectionFactoryBindingName 和 queueBindingName 以及 initialContextFactory 和 providerURL 提供什么值?
我在这个SO帖子中读到了我应该将log4j.properties
文件放在我的EAR/META-INF
中。我还在this SO线程中读到 log4j.properties 应该是什么样子。
但是,我不确定我需要向 JMSQueueApender 类提供哪些值,我应该在哪里放置它(如何初始化)。
由于我的项目在Application Server(Java EE环境)中运行,并且我的队列是该容器的一部分,我可以编写一个更简单的JMSQueuApender类。像这样:
@Singleton
@Startup
public class JMSQueueAppender extends AppenderSkeleton {
private Logger log = LoggerFactory.getLogger(LogSomethingBean.class);
@Inject
private JMSContext context;
@Resource(mappedName = "java:/jms/queue/MyQueue")
private Queue queue;
public void append(LoggingEvent event) {
try {
TextMessage msg = queueSession.createTextMessage();
String str = (String)event.getMessage();
msg.setText(str);
context.createProducer().send(queue, msg);
} catch (JMSException e) {
log.error("An error has occured while trying to send a msg to queue", e);
}
}
}
编辑:以某种方式可以为整个Wildfly实例定义一个log4j.properties文件,以便在其上运行的每个项目都读取该配置吗?
答案 0 :(得分:0)
我找到了一种在Wildfly 10.1 Final上使用此appender的方法。
我按原样使用了JMSQueueApender类。
我将log4j.properties文件添加到 ear / application / META-INF (我正在使用Maven)。
我的log4j.properties看起来像这样:
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
log4j.appender.jms=rs.netset.authority.log4j.JMSQueueAppender
log4j.appender.jms.initialContextFactory=org.apache.activemq.jndi.ActiveMQInitialContextFactory
log4j.appender.jms.providerUrl=tcp://localhost:61616
log4j.appender.jms.queueBindingName=java:/jms/queue/MyQueue
log4j.appender.jms.queueConnectionFactoryBindingName=ConnectionFactory
而且,一切正常