Wildfly上的Log4j appender

时间:2018-03-08 09:55:16

标签: java java-ee log4j jms wildfly

我在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文件,以便在其上运行的每个项目都读取该配置吗?

1 个答案:

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

而且,一切正常