log4j通过ActiveMQ远程记录日志设计配置

log4j通过activeMQ远程记录日志设计配置

一、安装ActiveMQ

首先去http://activemq.apache.org/download.html 下载较新版本5.4.2release, 解压

apache-activemq-5.4.2-bin.zip (或者apache-activemq-5.4.2-bin.tar.gz)目录如下:

+bin (windows下面的bat和unix/linux下面的sh)

+conf (activeMQ配置目录,包含最基本的activeMQ配置文件)

+data (默认是空的)

+docs (相关文档)

+example (几个例子)

+lib (activemMQ使用到的lib)

连接安全配置:

将如下配置

<plugins> <!-- Configure authentication; Username, passwords and groups --> <simpleAuthenticationPlugin anonymousAccessAllowed="false"> <authenticationUser username="${activemq.username}" password="${activemq.password}" groups="admins"/> <users> </users> </simpleAuthenticationPlugin> </plugins>

Copy至conf/activemq.xml中,放在

<persistenceAdapter>

<kahaDB directory="${activemq.base}/data/kahadb"/>

</persistenceAdapter>

的下面(这是简单的用户名、密码的认证方式)!

用户名、密码的可在conf/credentials.properties中配置

可以使用bin\activemq.bat(activemq) 启动,如果一切顺利,你就会看见类似下面的信息:

Listening for connections at: tcp://127.0.0.1:61616

二、测试安装的ActiveMQ

由于ActiveMQ是一个独立的jms provider,所以我们不需要其他任何第三方服务器就可以马上做我们的测试了.编译example/src目录下面的程序 ProducerTool/ConsumerTool 是JMS参考里面提到的典型应用,Producer产生消息,Consumer消费消息,而且这个例子还可以加入参数帮助你测试刚才启动的本地 ActiveMQ或者是远程的ActiveMQ

ProducerTool broker的地址,默认的是tcp://localhost:61616 [true|flase] 是否使用topic,默认是false [subject] subject的名字,默认是TOOL.DEFAULT [durabl] 是否持久化消息,默认是false [messagecount] 发送消息数量,默认是10 [messagesize] 消息长度,默认是255 [clientID] durable为true的时候,需要配置clientID [timeToLive] 消息存活时间 [sleepTime] 发送消息中间的休眠时间 [transacte] 是否采用事务 ConsumerTool broker的地址,默认的是tcp://localhost:61616 [true|flase] 是否使用topic,默认是false [subject] subject的名字,默认是TOOL.DEFAULT [durabl] 是否持久化消息,默认是false [maxiumMessages] 接受最大消息数量,0表示不限制 [clientID] durable为true的时候,需要配置clientID [transacte] 是否采用事务 [sleepTime] 接受消息中间的休眠时间,默认是0,onMeesage方法不休眠 [receiveTimeOut] 接受超时 我们可以这样使用:

先启动activeMQ,再打开两个命令窗口,都进入D:\activemq\example\src,一个运行:ant consumer,一个运行:ant producer,如果成功发送/接收了消息就OK了。

ActiveMQ5版本默认启动时,启动了内置的jetty服务器,提供一个demo应用和用于监控ActiveMQ的admin应用。

admin:http://127.0.0.1:8161/admin/

demo:http://127.0.0.1:8161/demo/

三、在工程中导入支持activeMQ的jar包

在pom.xml文件中新增activeMQ依赖包。

<dependency> <groupId>org.apache.activemq.tooling</groupId> <artifactId>maven-activemq-memtest-plugin</artifactId> <version>5.4.2</version>

</dependency>

四、配置log4j文件,使其可以通过activeMQ向远程JMS服务发送日志

在log4j.xml日志文件中增加JMSAppender 。

<appender name="JMS" class="org.apache.log4j.net.JMSAppender"> <param name="Threshold" value="info" /> <param name="InitialContextFactoryName" <param name="ProviderURL" value="tcp://localhost:61616" /> <param name="userName" value="system" /> <param name="password" value="manager" /> <param name="TopicBindingName" value="EZRD.logTopic " /> <param name="TopicConnectionFactoryBindingName" value="org.apache.activemq.jndi.ActiveMQInitialContextFactory" /> value="ConnectionFactory" /> </appender>

五、配置jndi和初始化属性文件

在src/resouce目录下新增jndi.properties文件

##发送端和接收端可以通过EZRD.logTopic这个名字建立发送和接收消息 topic.EZRD.logTopic=EZRD.logTopic

在dbconfig目录下新增jms.properties属性文件

#JMS服务地址 jms_provider_url=tcp://localhost:61616

#用户名

jms_userName=system

#密码

jms_password=manager

#主题名

jms_topic_binding_name=EZRD.kk

#日志存放目录 jms_ezrd_logs=D:\\ezrdlogs

六、启动接收端主程序JmsLogReceiver

java JmsLogReceiver

JmsLogReceiver.java

七、查看生成的日志文件,每天产生一个日志文件。

在D:\\ezrdlogs 目录下生成当天的日志文件,如:

2011-08-18.log

注:使用jms需要注意的问题

1、 在activemq.xml配置文件中可以修改amq的内存限制,如:

<policyEntry topic=">" producerFlowControl="true" memoryLimit="100mb">

这里memoryLimit="100mb"表示topic的内存限制为100M,producerFlowControl="false"表示关闭流量控制,如果不关闭流量控制,在消息量发生累积时,amq会主动控制流量,减少消息的生产。

2、 不要频繁的建立和关闭连接

JMS使用长连接方式,一个程序,只要和JMS服务器保持一个连接就可以了,不要频繁的建立和关闭连接。频繁的建立和关闭连接,对程序的性能影响还是很大的。这一点和jdbc还是不太一样的。

3、 Connection的start()和stop()方法代价很高

JMS的Connection的start()和stop()方法代价很高,不能经常调用。我们试用的时候,写了个jms的connection pool,每次将connection取出pool时调用start()方法,归还时调用stop()方法,然而后来用jprofiler发现,一般的cpu时间都耗在了这两个方法上。

4、 start()后才能收消息

Connection的start()方法调用后,才能收到jms消息。如果不调用这个方法,能发出消息,但是一直收不到消息。不知道其它的jms服务器也是这样。

5、 显式关闭Session

如果忘记了最后关闭Connection或Session对象,都会导致内存泄漏。这个在我测试的时候也发现了。本来以为关闭了Connection,由这个Connection生成的Session也会被自动关闭,结果并非如此,Session并没有关闭,导致内存泄漏。所以一定要显式的关闭Connection和Session。

6、 对Session做对象池

对Session做对象池,而不是Connection。Session也是昂贵的对象,每次使用都新建和关闭,代价也非常高。而且后来我们发现,原来Connection是线程安全的,而Session不是,所以后来改成了对Session做对象池,而只保留一个Connection。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值