spring boot自带logback作为其日志新系统,但是在实际工作中,常常需要对日志进行管理或分析,
如果只是单纯的将日志导入文本文件,则在查询时操作过于繁琐,
如果将其导入mysql等关系型数据库进行存储,又太影响系统性能,同时由于Mysql其结构化的信息存储结构,导致在存储时不够灵活。
因此,在此考虑将springboot系统中产出的日志(logback) 存入mongodb中

1.pom.xml 引入依赖

注意排除掉log4j的依赖

  <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
<version>1.5..RELEASE</version>
</dependency> <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-core -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.</version>
</dependency> <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.</version>
</dependency>
<!-- log4j 记录日志-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<version>1.3.8.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency> <!--AOP-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>1.5.7.RELEASE</version>
</dependency>

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

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

package com.wutongshu.springboot.logback;

import org.springframework.data.mongodb.repository.MongoRepository;

public interface LogRepository extends MongoRepository<MyLog,String> {
}

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;
@Component
public class MongoDBAppender extends UnsynchronizedAppenderBase<LoggingEvent> 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()
public class WebLogAspect {
private Logger logger=Logger.getLogger("MONGODB"); private ThreadLocal<Long> 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<String, String> getHeadersInfo(HttpServletRequest request) {
Map<String, String> 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;
} }

6.创建logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml> <configuration scan="true" scanPeriod="3600 seconds" debug="false"> <property name="logDir" value="logs"/> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<charset>UTF-</charset>
<pattern>%d [%thread] %-5level %logger{} %line - logId[[%X{client}][%X{request_id}]] - %msg%n</pattern>
</encoder>
</appender> <appender name="RollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>TRACE</level>
</filter> <!-- 可让每天产生一个日志文件,最多 个,自动回滚 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${logDir}/file-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory></maxHistory>
</rollingPolicy> <encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
<charset>UTF-</charset>
</encoder>
</appender>
<!--appender类的路径-->
<appender name="MONGODB" class="com.wutongshu.springboot.logback.MongoDBAppender"/> <root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="RollingFile"/>
<appender-ref ref="MONGODB"/>
</root>
</configuration>

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

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

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

使用logback实现http请求日志导入mongodb的更多相关文章

  1. Spring Boot中使用log4j实现http请求日志入mongodb

    之前在<使用AOP统一处理Web请求日志>一文中介绍了如何使用AOP统一记录web请求日志.基本思路是通过aop去切web层的controller实现,获取每个http的内容并通过log4 ...

  2. slf4j+logback搭建超实用的日志管理模块

    文章转自http://www.2cto.com/kf/201702/536097.html slf4j+logback搭建超实用的日志管理模块(对日志有编号管理):日志功能在服务器端再常见不过了,我们 ...

  3. 46. Spring Boot中使用AOP统一处理Web请求日志

    在之前一系列的文章中都是提供了全部的代码,在之后的文章中就提供核心的代码进行讲解.有什么问题大家可以给我留言或者加我QQ,进行咨询. AOP为Aspect Oriented Programming的缩 ...

  4. springboot aop + logback + 统一异常处理 打印日志

    1.src/resources路径下新建logback.xml 控制台彩色日志打印 info日志和异常日志分不同文件存储 每天自动生成日志 结合myibatis方便日志打印(debug模式) < ...

  5. MySQL导入MongoDB

    一.MongoDB的导入导出 mongoDB的导入导出,分为mongoDB官方提供的工具类,和第三方的工具类.下面依次介绍下: 1.1.mongoDB提供的工具 1.1.1.mongoimport工具 ...

  6. Logback+ELK+SpringMVC搭建日志收集服务器

    (转) 1.ELK是什么? ELK是由Elasticsearch.Logstash.Kibana这3个软件的缩写. Elasticsearch是一个分布式搜索分析引擎,稳定.可水平扩展.易于管理是它的 ...

  7. 用SignalR实现实时查看WebAPI请求日志

    实现的原理比较直接,定义一个MessageHandler记录WebAPI的请求记录,然后将这些请求日志推送到客户端,客户端就是一个查看日志的页面,实时将请求日志展示在页面中. 这个例子的目的是演示如何 ...

  8. 使用Python 将shapefile导入mongodb

    使用Python 将shapefile导入mongodb 随着big data时代的到来,各个行业都在考虑能不能把big data的思路.方法引入进来,GIS行业也不能免俗. 下面就介绍一下如何将sh ...

  9. Nginx日志导入到Hive0.13.1,同步Hbase0.96.2,设置RowKey为autoincrement(ID自增长)

    ---------------------------------------- 博文作者:迦壹 博客地址:Nginx日志导入到Hive,同步Hbase,设置RowKey为autoincrement( ...

随机推荐

  1. R语言图表

    条形图 在R语言中创建条形图的基本语法是 barplot(H, xlab, ylab, main, names.arg, col) H是包含在条形图中使用的数值的向量或矩阵 xlab是x轴的标签 yl ...

  2. 【Centos7】Tomcat安装及一个服务器配置多个Tomcat

    完成解压 参考 http://www.cnblogs.com/h--d/p/5074800.html https://www.cnblogs.com/tudou-22/p/9330875.html 步 ...

  3. SQL查询性能优化

    使用高效的查询 使用 EXISTS 代替 IN -- 查询A表中同时存在B表的数据 -- 慢 SELECT * FROM Class_A WHERE id IN (SELECT id FROM Cla ...

  4. bootstrap table 生成的表格里动态添加HTML元素按钮,JS中添加点击事件,点击没反应---解决办法

    bootstraptable中onExpandRow属性---js  方法添加的 html代码,然后给这代码里面的 元素 添加 事件,却获取不该元素.(称之为未来元素),由于是未来的 所以现在没有这个 ...

  5. Node.js之错误处理

    Node.js之错误处理 1. 使用 domain 模块处理错误 try..catch 多用于捕捉同步方法中的抛出错误,但不能用try..catch捕捉异步方法中抛出de错误 如: 1 var htt ...

  6. Opencv学习之路—Opencv下基于HOG特征的KNN算法分类训练

    在计算机视觉研究当中,HOG算法和LBP算法算是基础算法,但是却十分重要.后期很多图像特征提取的算法都是基于HOG和LBP,所以了解和掌握HOG,是学习计算机视觉的前提和基础. HOG算法的原理很多资 ...

  7. VMware Workstation搭建Linux操作系统

    1.单击“创建新的虚拟机”选项,并在弹出的“新建虚拟机向导”界面中选择“自定义”单选按钮,然后单击“下一步”. 新建虚拟机向导 2.选择虚拟机硬件兼容性,是否兼容之前旧的版本. 兼容性选择 3.选中“ ...

  8. Serial Fluent UDF on Windows

    test test Table of Contents 1. Serial UDF on Windows OS 1 Serial UDF on Windows OS Note: Udf has to ...

  9. Master Nginx(8) - Troubleshooting Techniques

    Analyzing log files Error log file formats Error log file entry examples Configuring advanced loggin ...

  10. ACM的你伤不起

    劳资六年前开始搞ACM啊!!!!!!!!!!  从此踏上了尼玛不归路啊!!!!!!!!!!!!  谁特么跟劳资讲算法是程序设计的核心啊!!!!!!  尼玛除了面试题就没见过用算法的地方啊!!!!!!  ...