博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用logback实现http请求日志导入mongodb
阅读量:4315 次
发布时间:2019-06-06

本文共 7499 字,大约阅读时间需要 24 分钟。

spring boot自带logback作为其日志新系统,但是在实际工作中,常常需要对日志进行管理或分析,

如果只是单纯的将日志导入文本文件,则在查询时操作过于繁琐,
如果将其导入mysql等关系型数据库进行存储,又太影响系统性能,同时由于Mysql其结构化的信息存储结构,导致在存储时不够灵活。
因此,在此考虑将springboot系统中产出的日志(logback) 存入mongodb中

1.pom.xml 引入依赖

注意排除掉log4j的依赖

org.springframework.boot
spring-boot-starter-data-mongodb
1.5.8.RELEASE
ch.qos.logback
logback-core
1.2.3
ch.qos.logback
logback-classic
1.2.3
org.springframework.boot
spring-boot-starter-log4j
1.3.8.RELEASE
org.slf4j
slf4j-log4j12
org.springframework.boot
spring-boot-starter-aop
1.5.7.RELEASE

 

2.创建实体类: logback.MyLog.java

package com.wutongshu.springboot.logback;import java.io.Serializable;import java.util.Date;public class MyLog implements Serializable {    private String id;    private String msg;    private Date time;    private String threadName;    private String level;    public String getId() {        return id;    }    public void setId(String id) {        this.id = id;    }    public String getMsg() {        return msg;    }    public void setMsg(String msg) {        this.msg = msg;    }    public Date getTime() {        return time;    }    public void setTime(Date time) {        this.time = time;    }    public String getThreadName() {        return threadName;    }    public void setThreadName(String threadName) {        this.threadName = threadName;    }    public String getLevel() {        return level;    }    public void setLevel(String level) {        this.level = level;    }}
View Code

3.添加数据访问接口: LogRepository.java

package com.wutongshu.springboot.logback;import org.springframework.data.mongodb.repository.MongoRepository;public interface LogRepository extends MongoRepository
{}

4.Appender 类: MongoDBAppender.java

package com.wutongshu.springboot.logback;import ch.qos.logback.classic.spi.LoggingEvent;import ch.qos.logback.core.UnsynchronizedAppenderBase;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;import org.springframework.stereotype.Component;import java.util.Date;@Componentpublic class MongoDBAppender extends UnsynchronizedAppenderBase
implements ApplicationContextAware { private static LogRepository logRepository; @Override public void start() { super.start(); } @Override public void stop() { super.stop(); } @Override protected void append(LoggingEvent e) { MyLog myLog = new MyLog(); myLog.setLevel(e.getLevel().toString()); myLog.setMsg(e.getFormattedMessage()); myLog.setThreadName(e.getThreadName()); myLog.setTime(new Date(e.getTimeStamp())); logRepository.save(myLog); } @Override public void setApplicationContext(ApplicationContext applicationContext) { if (applicationContext.getAutowireCapableBeanFactory().getBean(LogRepository.class) != null) { logRepository = (LogRepository) applicationContext.getAutowireCapableBeanFactory().getBean(LogRepository.class); } }}

5.创建切面类记录日志信息

logger取名为MONGODB

通过getBasicDBObject函数从HttpServletRequest和JoinPoint对象中获取请求信息,并组装成BasicDBObject
getHeadersInfo函数从HttpServletRequest中获取header信息
通过logger.info(),输出BasicDBObject对象的信息到mongodb

package com.wutongshu.springboot.logback;import com.mongodb.BasicDBObject;import org.apache.log4j.Logger;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;import org.springframework.core.annotation.Order;import org.springframework.stereotype.Component;import org.springframework.web.context.request.RequestContextHolder;import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;import java.util.Arrays;import java.util.Enumeration;import java.util.HashMap;import java.util.Map;/** * 日志切面类 */@Aspect@Component@Order(5)public class WebLogAspect {    private Logger logger=Logger.getLogger("MONGODB");    private ThreadLocal
startTime=new ThreadLocal<>(); @Pointcut("execution(public * com.*.*.web.*.*(..))") public void webLog(){ } @Before(value = "webLog()") public void doBefore(JoinPoint point){ startTime.set(System.currentTimeMillis()); logger.info("WebLogAspect.doBefore............"); ServletRequestAttributes attributes= (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request=attributes.getRequest(); // 获取要记录的日志内容 BasicDBObject logInfo = getBasicDBObject(request, point); logger.info(logInfo); } private BasicDBObject getBasicDBObject(HttpServletRequest request, JoinPoint point) { // 基本信息 BasicDBObject r = new BasicDBObject(); r.append("requestURL", request.getRequestURL().toString()); r.append("requestURI", request.getRequestURI()); r.append("queryString", request.getQueryString()); r.append("remoteAddr", request.getRemoteAddr()); r.append("remoteHost", request.getRemoteHost()); r.append("remotePort", request.getRemotePort()); r.append("localAddr", request.getLocalAddr()); r.append("localName", request.getLocalName()); r.append("method", request.getMethod()); r.append("headers", getHeadersInfo(request)); r.append("parameters", request.getParameterMap()); r.append("classMethod", point.getSignature().getDeclaringTypeName() + "." + point.getSignature().getName()); r.append("args", Arrays.toString(point.getArgs())); return r; } /** * 获取头信息 * * @param request * @return */ private Map
getHeadersInfo(HttpServletRequest request) { Map
map = new HashMap<>(); Enumeration headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { String key = (String) headerNames.nextElement(); String value = request.getHeader(key); map.put(key, value); } return map; }}
View Code

 6.创建logback.xml

 

UTF-8
%d [%thread] %-5level %logger{
68} %line - logId[[%X{client}][%X{request_id}]] - %msg%n
TRACE
${logDir}/file-%d{yyyy-MM-dd}.log
10
%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n
UTF-8

 

 

 

7.在application.properties里添加mongodb的uri

启动MongoDB数据库,可看到多了一个名为logs的database

在java的项目结构上也多了个logs的文件夹

 

转载于:https://www.cnblogs.com/wutongshu-master/p/10930812.html

你可能感兴趣的文章
字符数组 字符指针
查看>>
Jedis的使用
查看>>
文献笔记(一)
查看>>
Linux(CentOS6.5)下修改Nginx初始化配置
查看>>
windows 重写调试输出
查看>>
反向代理服务器(Reverse Proxy)
查看>>
Android全屏
查看>>
HTML 标签。
查看>>
[bzoj2783][JLOI2012]树_树的遍历
查看>>
2018.10.20 bzoj1068: [SCOI2007]压缩(区间dp)
查看>>
Perl的IO操作(2):更多文件句柄模式
查看>>
由拖库攻击谈口令字段的加密策略
查看>>
Alpha 冲刺 (4/10)
查看>>
并发编程之线程池进程池
查看>>
初始化 Flask 虚拟环境 命令
查看>>
脚本简介jQuery微信开放平台注册表单
查看>>
将PHP数组输出为HTML表格
查看>>
Java中的线程Thread方法之---suspend()和resume() 分类: ...
查看>>
经典排序算法回顾:选择排序,快速排序
查看>>
BZOJ2213 [Poi2011]Difference 【乱搞】
查看>>