如何使用JMS Appender?

时间:2012-08-06 14:35:37

标签: java log4j jms

关于JMS Appenders的Inmy研究我发现turorial1tutorial2。我试图跟随他们,但我无法运行示例程序。

我刚刚创建了log4j.properties文件

log4j.rootLogger=INFO, stdout, jms

#
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

#
log4j.appender.jms=org.apache.log4j.net.JMSAppender
log4j.appender.jms.InitialContextFactoryName=org.apache.activemq.jndi.ActiveMQInitialContextFactory
log4j.appender.jms.ProviderURL=tcp://localhost:61616
log4j.appender.jms.TopicBindingName=logTopic
log4j.appender.jms.TopicConnectionFactoryBindingName=ConnectionFactory

和jndi.properties

topic.logTopic=logTopic

然后我将Receiver.java添加到我的项目

public class Receiver implements MessageListener {

    public Receiver() throws Exception {
        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost: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);
        Logger log = Logger.getLogger(Receiver.class);

        log.info("Test log");

        Thread.sleep(1000);
        consumer.close();
        sess.close();
        conn.close();
        System.exit(1);
    }

    public static void main(String[] args) throws Exception {
        new Receiver();
    }

    @Override
    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();
        }
    }
}

我需要让Receiver从项目中收集所有日志,但我甚至无法运行这个简单的例子。可能我不知道如何正确配置它,因为我得到了这个输出:

log4j:WARN No appenders could be found for logger (org.apache.activemq.transport.WireFormatNegotiator).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

我是否错过了在代码或某些文件中添加一些行到classpath?我是log4j的新手。

编辑: 我在AspectJ课程中设置了Logger。但我认为同样在Receiver Logger中创建并发送日志,所以可能应该在Receiver中完成,而不是在我项目的其他类中完成。

static final Logger logger = Logger.getLogger(ReportingAspect.class);

@Before("setLoggingFile()")
public void setProperties() {
    PropertyConfigurator.configure("log4j.properties");
}

ProjectJMS
|
\_ src
|   \_ packages...
\_jndi.propeties
\_log4j.properties

3 个答案:

答案 0 :(得分:1)

配置log4j使用: -Dlog4j.configuration =配置文件的路径

conf文件的路径可以是: À文件在类路径之外的路径中,如果是这样,请使用file:///进行修复,例如:

  • -Dlog4j.configuration =文件:/ C:/foobar.lcf

在那种情况下,在类路径中:

  • -Dlog4j.configuration = foobar.lcf其中foobar.lcf位于源文件夹的根目录

请参阅:

对于jms:

- 至少将jms.jar添加到classpath

  • 确保您运行JMS代理(例如activemq)

此致

菲利普

答案 1 :(得分:1)

你需要移动'src'文件夹下的log4j.properties,这样它才会被包含在类路径中,因为它没有被加载。

答案 2 :(得分:0)

您是否验证过,在使用记录器之前调用了方法setProperties()

通常只有在PropertyConfigurator初始化log4j时找不到配置文件(log4j.properties),或者在用{{1}初始化log4j之前尝试记录某些内容时,才会弹出那种错误}}

首先,您应该确保PropertyConfigurator被调用的方式是您希望它被调用的方式,如果这应该有效,您可以尝试验证是否可以加载配置。从我看到的,我猜你应该找到你的配置文件。要验证这一点,您可以通过几个步骤加载配置,以确保找到它:

setProperties()

如果找不到您的配置,您将收到 Properties props = new Properties(); props.load( new FileInputStream( "log4j.properties" ) ); PropertyConfigurator.configure( props );