当前位置: 首页 > 知识库问答 >
问题:

Wildfly上的Log4j附加器

葛念
2023-03-14

我通过添加以下注释创建了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);
    }
}

我还需要将JMS添加到WildFly的standalone.xml中,方法是从standalone-full.xml复制所有与JMS相关的行。我还需要将我的队列添加到standalone.xml中,将这一行添加到:

<jms-queue name="SequenceQueue" entries="java:/jms/queue/MyQueue"/>

我不确定,我该怎么做。我应该把JMSQueueApender类放在哪里?我应该为queueConnectionFactoryBindingName和queueBindingName以及initialContextFactory和ProviderURL提供什么值?

我读取了int this SO线程,因此我应该将log4j.properties文件放在我的ear/meta-inf中。我还在这个SO线程中读到了log4j.properties应该是什么样子的。

但是,我不确定需要向JMSQueueApender类提供哪些值,以及应该将它放在哪里(如何初始化它)。

由于我的项目是在应用服务器(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个答案

谭嘉容
2023-03-14

我找到了一种在Wildfly10.1 Final上使用这个附加器的方法。

我按原样使用了JMSQueueApender类。

我将log4j.properties文件添加到ear/application/meta-inf(我使用的是Maven)。

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
 类似资料:
  • 我正在将log4j1升级到log4j2。我在log4j1中创建了一个自定义appender,并在append(LoggingEvent事件)方法中使用事件检索错误堆栈跟踪。getThrowableStrRep()并为每行追加'\t'。 我在log4j2中没有看到getThrowableStrRep。你能帮我解决我们如何在log4j2中做到这一点吗?

  • 我想根据不同的模块登录不同的应用程序... 我有3个附件:控制台,一个用于记录控制器和服务的滚动文件,另一个用于记录作业中的某些内容的滚动文件。我只想为其滚动文件记录作业的代码,并只使用另一个滚动文件记录控制器和服务。 这是我的grails log4j配置: 使用此配置,日志将写入两个滚动文件和标准输出。如果从根目录中删除滚动附加器,滚动文件将保持为空,即使为文件组指定了附加器。 有人建议将日志分

  • 我已经将log4j放入了buildpath中,但在运行应用程序时会收到以下消息: 这些警告意味着什么?这里的附加符是什么?

  • 我得到这个错误 这是我的主要任务 这是我的log.properties档案 这是我的文件结构。 我正处于Log4J的学习阶段,并试图实施一个虚拟项目来深入理解它。

  • 我已经把我的log4j放好了。我的webapp的lib文件夹中的properties文件我还尝试在META-INF中输入如下内容: 这是我的log4j.properties.我得到以上警告和记录器是不写任何文件。我也创建了文件夹结构,如上所述。

  • 问题内容: 我已经将log4j放到了我的构建路径中,但是在运行应用程序时收到以下消息: 这些警告是什么意思?这里的追加器是什么? 问题答案: 这个log4j指南的简短介绍有些陈旧,但仍然有效。 该指南将为你提供有关如何使用记录器和附加器的信息。 为了让你步入正轨,你可以采用两种简单的方法。 首先是将这一行添加到你的main方法中: 第二种方法是将这个标准文件log4j.properties(来自上