上午搞定了使用aop方式来记录日志,根据上回分析,下午继续弄头儿要求的logback+jms appender+日志filter
关于jms appender可是把我头疼坏了,上网查找相关的信息,竟然没有一个成功的案例,于是乎,开始找些英文的论坛文章看,在logback.xml中加入了如下的配置:
<appender name="jms" class="ch.qos.logback.classic.net.JMSQueueAppender"> <InitialContextFactoryName> org.apache.activemq.jndi.ActiveMQInitialContextFactory </InitialContextFactoryName> <ProviderURL>tcp://ip:port</ProviderURL> <QueueConnectionFactoryBindingName>ConnectionFactory</QueueConnectionFactoryBindingName> <QueueBindingName>cdata.response.musicproducttest</QueueBindingName> </appender>
但是始终报一个错误(截取部分)
at javax.naming.NameNotFoundException: data.response.musicproducttest
at at org.apache.activemq.jndi.ReadOnlyContext.lookup(ReadOnlyContext.java:225)
at at javax.naming.InitialContext.lookup(InitialContext.java:392)
at at ch.qos.logback.core.net.JMSAppenderBase.lookup(JMSAppenderBase.java:36)
at at ch.qos.logback.classic.net.JMSQueueAppender.start(JMSQueueAppender.java:109)
不知道为什么,于是请教有经验的同事,读了logback的源码,最终发现,原来是因为logback找不名称为到data.response.musicproducttest的队列,需要在jndi中进行声明,于是加了jndi.properties文件进buildpath,于是问题完美解决!
接下来,需要根据日志的内容,对日志不同输出进行不同队列的写入。先不考虑往队列里发(因为此时,同事正在研究logback源码。。。),我们就指定往文件里写入吧
<appender name="logfile-dao" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> <evaluator name="myEval"> <expression>message.contains("dao")</expression> </evaluator> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <Encoding>UTF-8</Encoding> <File>${log.base}%d{yyyy-MM-dd}.dao.log</File> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>${log.base}.%d{yyyy-MM-dd}.log.zip</FileNamePattern> </rollingPolicy> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern> </layout> </appender> <appender name="logfile-service" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> <evaluator name="myEval"> <expression>message.contains("service.impl")</expression> </evaluator> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <Encoding>UTF-8</Encoding> <File>${log.base}%d{yyyy-MM-dd}.service.log</File> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>${log.base}.%d{yyyy-MM-dd}.log.zip</FileNamePattern> </rollingPolicy> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern> </layout> </appender>
配置文件logback.xml中加入了如上代码,主要是<expression>message.contains("dao")</expression> ,<onMatch>ACCEPT</onMatch>和<onMismatch>DENY</onMismatch>,
这三部分的声明,分别是对日志内容的过滤,符合该条件即ACCEPT,不符合就DENY,ok,于是成功解决问题。