Spring log4j mq实现日志记录

版权声明:本文为博主anzy原创文章,转载请注明地址 https://blog.csdn.net/qq_24549805/article/details/79915522

Spring log4j mq实现日志记录,对于一般系统还是很实用的,简单方便。记得之前做过一个项目是解析的log日志文件,今天突发奇想log4j能不能将信息推送到mq于是百度查阅资料写了这个例子。

1、导入对应jar

<!-- Use to call write log methods -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

<!-- Log4j use this lib. -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.13</version>
</dependency>

<!-- Spring jms lib -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jms</artifactId>
    <version>4.0.0.RELEASE</version>
</dependency>

<!-- ActiveMQ lib -->
<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-core</artifactId>
    <version>5.7.0</version>
</dependency>

2、配置log4j

## Be sure that ActiveMQ messages are not logged to 'jms' appender
log4j.logger.org.apache.activemq=INFO, stdout
log4j.rootLogger=INFO, stdout, jms
## 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

3、添加jndi配置

topic.logTopic=logTopic

4、编写接收代码

package com.anzy.frame.jms;

import java.io.Serializable;
import java.net.InetAddress;
import java.net.UnknownHostException;

import org.apache.log4j.EnhancedPatternLayout;
import org.apache.log4j.spi.LoggingEvent;
/**
 * Created by anzy on 2018/4/12.
 */
public class LoggingEventWrapper implements Serializable{

    private static final String ENHANCED_PATTERN_LAYOUT = "%throwable";
    private static final long serialVersionUID = 3281981073249085474L;
    private LoggingEvent loggingEvent;

    private Long timeStamp;
    private String level;
    private String logger;
    private String message;
    private String detail;
    private String ipAddress;
    private String hostName;

    public LoggingEventWrapper(LoggingEvent loggingEvent){
        this.loggingEvent = loggingEvent;

        //Format event and set detail field
        EnhancedPatternLayout layout = new EnhancedPatternLayout();
        layout.setConversionPattern(ENHANCED_PATTERN_LAYOUT);
        this.detail = layout.format(this.loggingEvent);
    }

    public Long getTimeStamp() {
        return this.loggingEvent.timeStamp;
    }

    public String getLevel() {
        return this.loggingEvent.getLevel().toString();
    }

    public String getLogger() {
        return this.loggingEvent.getLoggerName();
    }

    public String getMessage() {
        return this.loggingEvent.getRenderedMessage();
    }

    public String getDetail() {
        return this.detail;
    }

    public LoggingEvent getLoggingEvent() {
        return loggingEvent;
    }

    public String getIpAddress() {
        try {
            return InetAddress.getLocalHost().getHostAddress();
        } catch (UnknownHostException e) {
            return "Could not determine IP";
        }
    }

    public String getHostName() {
        try {
            return InetAddress.getLocalHost().getHostName();
        } catch (UnknownHostException e) {
            return "Could not determine Host Name";
        }
    }
}
package com.anzy.frame.jms;

import org.apache.log4j.Logger;
import org.apache.log4j.spi.LoggingEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
/**
 * Created by anzy on 2018/4/12.
 */
@Component
public class LogQueueListener implements MessageListener
{
    public static Logger logger = Logger.getLogger(LogQueueListener.class);


    public void onMessage( final Message message )
    {
        if ( message instanceof ObjectMessage )
        {
            try{
                final LoggingEvent loggingEvent = (LoggingEvent)((ObjectMessage) message).getObject();
                LoggingEventWrapper loggingEventWrapper = new LoggingEventWrapper(loggingEvent);
                loggingEvent.getMDC("user");
                System.out.println("===========================" + loggingEventWrapper.getLevel());
                System.out.println("===========================" + loggingEventWrapper.getTimeStamp());
                System.out.println("===========================" + loggingEvent.getMDC("user"));
            }
            catch (final JMSException e)
            {
                logger.error(e.getMessage(), e);
            } catch (Exception e) {
                logger.error(e.getMessage(),e);
            }
        }
    }
}

因为做的是demo因此我单独写在了一个服务上了,实际项目中可以单独拿出来做日志系统。


以上思路提供给大家参考。

咱们放在MDC中的数据同样也可以拿到    loggingEvent.getMDC("user");

====================================================

我在编写的时候第一次一直没成功,因为

log4j.rootLogger=INFO, stdout, jms
没加jms,希望大家注意。







猜你喜欢

转载自blog.csdn.net/qq_24549805/article/details/79915522