首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在分布式系统中应该使用哪些评价器?如何配置它们?

在分布式系统中应该使用哪些评价器?如何配置它们?
EN

Stack Overflow用户
提问于 2012-08-08 11:09:55
回答 4查看 1.8K关注 0票数 5

我试图将日志组件添加到分布式系统中。它是用AspectJ编写的,以避免链接当前的源代码.我使用socket发送日志,但是我想尝试一些更有效的方法。

我听说我应该使用JMSAppenderAsyncAppender,但是我没有配置它。我应该创建Receiver来收集日志并将它们传递给数据库和GUI (我使用ChainSaw)吗?

我试着跟踪turorial1tutorial2,但它们不够清晰。

编辑:

在我准备的一个小演示中,我为一个请求发送了6条日志(模拟3个组件)

代码语言:javascript
运行
复制
[2012-08-08 15:40:28,957] [request1344433228957] [Component_A] [start]
[2012-08-08 15:40:32,050] [request1344433228957] [Component_B] [start]
[2012-08-08 15:40:32,113] [request1344433228957] [Component_C] [start]
[2012-08-08 15:40:32,113] [request1344433228957] [Component_C] [end - throwing]
[2012-08-08 15:40:32,144] [request1344433228957] [Component_B] [end]
[2012-08-08 15:40:32,175] [request1344433228957] [Component_A] [end]

使用套接字附件。所以我的log4j.properties是:

代码语言:javascript
运行
复制
log4j.rootLogger=DEBUG, server

log4j.appender.server=org.apache.log4j.net.SocketAppender
log4j.appender.server.Port=4712
log4j.appender.server.RemoteHost=localhost
log4j.appender.server.ReconnectionDelay=1000

所以我跑了

代码语言:javascript
运行
复制
>java -classpath log4j-1.2.17.jar org.apache.log4j.net.SimpleSocketServer 4712 log4j-server.properties

有配置

代码语言:javascript
运行
复制
log4j.rootLogger=DEBUG, CA, FA

#
log4j.appender.CA=org.apache.log4j.ConsoleAppender
log4j.appender.CA.layout=org.apache.log4j.PatternLayout
log4j.appender.CA.layout.ConversionPattern=[%d] [%t] [%c] [%m]%n

#
log4j.appender.FA=org.apache.log4j.FileAppender
log4j.appender.FA.File=report.log
log4j.appender.FA.layout=org.apache.log4j.PatternLayout
log4j.appender.FA.layout.ConversionPattern=[%d] [%t] [%c] [%m]%n

然后我把我的日志从文件发送到链锯:

这是绝对基本的,但我想学习如何做得更好。首先,我想异步发送日志。然后创建非常简单的接收器,例如可以将日志传递给文件。

我试着遵循上面列出的教程,但失败了。所以问题是:您能提供一些示例配置吗?Receiver.javalog4.properties文件的例子?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-13 13:27:29

最后,我找到了如何配置它。我将两个文件放入src文件夹。

jndi.properties

代码语言:javascript
运行
复制
topic.logTopic=logTopic

和log4j-jms.properties

代码语言:javascript
运行
复制
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= 

## Configure 'jms' appender. You'll also need jndi.properties file in order to make it work
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

然后我使用VM参数运行我的程序。

代码语言:javascript
运行
复制
-Dlog4j.configuration=log4j-jms.properties

并在类Receiver.java中接收日志

代码语言:javascript
运行
复制
public class Receiver implements MessageListener {

    PrintWriter pw = new PrintWriter("result.log");
    Connection conn;
    Session sess;
    MessageConsumer consumer;

    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);
    }

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

    }

    public void onMessage(Message message) {
        try {
            LoggingEvent event = (LoggingEvent) ((ActiveMQObjectMessage) message).getObject();

            DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS"); 
            String nowAsString = df.format(new Date(event.getTimeStamp())); 

            pw.println("["+ nowAsString + "]" + 
                    " [" + event.getThreadName()+"]" +
                    " ["+ event.getLoggerName() + "]" +
                    " ["+ event.getMessage()+"]");
            pw.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
票数 2
EN

Stack Overflow用户

发布于 2012-08-08 11:23:48

我会使用NFS或CDFS,并在所有机器上安装一个驱动器。让每个应用程序实例写入不同的文件。无论您使用多少台机器,您都可以在一个目录(或驱动器)中找到所有日志。

我不会在高延迟的全球广域网上使用NFS或CDFS,例如> 50 ms往返。在这个原因中,我使用了JMS (但我没有使用log4j)

票数 2
EN

Stack Overflow用户

发布于 2012-08-08 18:54:33

我的两分钱..。无论您做什么,请确保您使用异步机制将您的日志传递给接收者,否则它最终会使您的应用程序陷入停顿。另一点,要可靠地交付日志,您应该考虑一个内置在附录本身中的故障转移机制--接收者可能会在短时间或很长时间内脱机,如果您关心日志,则绝对需要故障转移。我们已经构建了您描述的相似系统 (很抱歉添加),但是如果您愿意的话,可以使用我们的附录(在下载中查看),它是免费的,并且有源代码。还有一个视频教程。它已经失败和灵活的异步机制,再加上备份回退。

你应该使用多少个附加程序?每个jvm都有一个附加器就行了。配置文件可能应该是每个jvm,不确定您打算如何实现接收器,无论如何,追加程序需要找到您的接收器,它通常至少是主机端口对。关于数据库,我在RDBMS方面的经验非常糟糕(我们将转向nosql),但是如果您不超过数亿条记录,大多数商业数据库将需要付出一定的努力。我必须说,这并不是一项简单的任务,我们花了几年时间才建立起你刚刚画出的几个瘦长方形的商业质量体系:)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11863251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档