【问题标题】:How to use JMSAppender log4j2 JAVA如何使用 JMSAppender log4j2 JAVA
【发布时间】:2026-02-15 06:45:02
【问题描述】:

我正在尝试使用 log4j2 中的 JMS 将日志推送到 ActiveMqueue。

我已在我的 log4j2.properites 中完成此操作

<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="5">
    <Appenders> 

        <RollingFile name="fishLogstash"
                fileName="E:/xxx/log/xxx.server/xxxLogstash.log" append="false"
                immediateFlush="false" bufferSize="1000"
                filePattern="/soft/log/xxx.server/xxxx-%i.log">
            <PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss.SSS} %5p %c{1} - %m%n" />
            <Policies>
                <SizeBasedTriggeringPolicy size="100M" />
            </Policies>
            <DefaultRolloverStrategy max="10" />
        </RollingFile>

        <JMS name="jmsQueue" destinationBindingName="logQueue"
                factoryName="org.apache.activemq.jndi.ActiveMQInitialContextFactory"
                factoryBindingName="ConnectionFactory"
                providerURL="tcp://localhost:61616">
            <PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss.SSS} %5p %c{1} - %m%n" />
        </JMS>
    </Appenders>

    <Loggers>
        <Root level="warn">
            <AppenderRef ref="fish" />
        </Root>
    </Loggers>

</Configuration>

在这之后,我想知道如何使用 JMS appender 来登录我的 java 代码?如何检索这个特定的附加程序,是否有类似

Logger log = Logger.getAppender("jmsQueue") ?

提前致谢。

【问题讨论】:

    标签: java jms log4j2


    【解决方案1】:

    1.

    在您的属性文件中,有xml 内容。所以我假设您正在尝试使用 xml 样式属性文件。如果是这样,请将您的属性文件重命名为具有 .xml 扩展名。例如。 log4j2.xml。记得写 log4j2 支持的 xml。例子可以在here找到。

    2.

    在属性文件的Loggers 部分中将您定义的附加程序的name 值称为AppenderRef。根据您的Appenders 部分,Loggers 部分可以是

    <Loggers>
        <Logger name="jmsLogger" level="warn">
            <AppenderRef ref="jmsQueue" />
        </Logger>
        <Root level="warn">
            <AppenderRef ref="fishLogstash" />
        </Root>
    </Loggers> 
    

    3.

    在您的代码中,按如下方式获取 JMS 记录器:

    Logger log = LogManager.getLogger("jmsLogger");
    

    您可以使用log 变量记录任何内容。例如

    log.info("some message");
    

    希望这个答案对你有所帮助。

    【讨论】:

    • 感谢您的帮助。它就像一个魅力。还有一件事,我现在可以在队列中看到我的消息,但同时,同样的日志被写入 STDOUT(控制台)。我怎样才能避免这种情况?因为 I/O 的成本很高。我为此更新了我的帖子
    • 简而言之,删除/注释“”。但这会通过 log4j 禁用所有控制台输出。
    • 但是,我建议您撤消上一次编辑并发布一个提及您的问题/期望的新问题。这将增加您获得更好解决方案的机会。