Docker mongoDB 4.2.1 安装并收集springboot日志

10 篇文章 1 订阅
7 篇文章 0 订阅

一:docker安装好mongodb

第一步:docker安装好mongodb  不推荐

最新版本的安装,不推荐

[root@iZbp1gp1t778obaz5m8vk8Z /]# docker search mongo

[root@iZbp1gp1t778obaz5m8vk8Z /]# docker pull mongo:latest

Trying to pull repository docker.io/library/mongo ... 
latest: Pulling from docker.io/library/mongo
f22ccc0b8772: Pull complete 
3cf8fb62ba5f: Pull complete 
e80c964ece6a: Pull complete 
329e632c35b3: Pull complete 
3e1bd1325a3d: Pull complete 
4aa6e3d64a4a: Pull complete 
035bca87b778: Pull complete 
874e4e43cb00: Pull complete 
08cb97662b8b: Pull complete 
f623ce2ba1e1: Pull complete 
f100ac278196: Pull complete 
6f5539f9b3ee: Pull complete 
Digest: sha256:02e9941ddcb949424fa4eb01f9d235da91a5b7b64feb5887eab77e1ef84a3bad
Status: Downloaded newer image for docker.io/mongo:latest

[root@iZbp1gp1t778obaz5m8vk8Z /]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/mongo     latest              3068f6bb852e        5 days ago          493 MB

#这是最新版本的启动命令
[root@iZbp1gp1t778obaz5m8vk8Z /]# docker run -itd --name mongo --restart=on-failure:10 -d -m 1G --memory-swap 4G -p 27017:27017 -v /data/mongodb:/data/db mongo 
1bcf117db0a8e86840a1acac769338053e8dff25a41bd1488d7a274ea171371a
[root@iZbp1gp1t778obaz5m8vk8Z mongodb]# 
[root@iZbp1gp1t778obaz5m8vk8Z mongodb]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
1bcf117db0a8        mongo               "docker-entrypoint..."   7 seconds ago       Up 7 seconds        0.0.0.0:27017->27017/tcp   mongo

此处我们设置为非登录可见
新docker人请参考前期文章知晓参数,启动完成后。咱们开始整账户

 第二步:启动docker中的mongodb 推荐

指定版本安装,推荐版本,最新的版本的-Auth 启动有问题,截至到2021-01-25

安装4.2.1
[root@iZbp1gp1t778obaz5m8vk8Z ~]$ docker pull mongo:4.2.1

这个是4.2.1 版本的启动
[root@iZbp1gp1t778obaz5m8vk8Z mongodb]# docker run -itd --name mongo --restart=on-failure:10 -d -m 1G --memory-swap 4G -p 27017:27017 \
-v /data/mongodb:/data/db \
mongo:4.2.1 --auth

[root@iZbp1gp1t778obaz5m8vk8Z mongodb]# 
[root@iZbp1gp1t778obaz5m8vk8Z mongodb]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
1bcf117db0a8        mongo               "docker-entrypoint..."   7 seconds ago       Up 7 seconds        0.0.0.0:27017->27017/tcp   mongo

此处我们设置为非登录可见
新docker人请参考前期文章知晓参数,启动完成后。咱们开始整账户

日志查看命令:
[root@iZbp1gp1t778obaz5m8vk8Z mongodb]# docker logs -f mongo

补充:假如上面命令启动不了,日志提示/data/db 没有权限,则是你使用了最新版本docker
[root@iZbp1gp1t778obaz5m8vk8Z mongodb]# docker run -itd --name mongo --privileged=true --restart=on-failure:10 -d -m 1G --memory-swap 4G -p 27017:27017 \
-v /data/mongodb:/data/db \
mongo:4.2.1 --auth

关键授权属性:--privileged=true  

 《docker常见参数操作方法

第三步:mongodb 配置好用户信息

为MongoDb创建账户信息,初始化admin账号

# 连接至docker中的命令操作界面
[root@izwz99z5o9dc90keftqhlrz ~]# docker exec -it mongo mongo admin

# 创建一个名为 admin,密码为 123456的用户。
>  db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'}]});

# 尝试使用上面创建的用户信息进行连接。
> db.auth('admin', '123456')

# 给admin授权、读写权限
> db.grantRolesToUser("admin", [ { role: "readWrite", db: "admin" } ])

上面是创建了管理账号,下面我们创建业务账号

# 创建新的业务数据库:guides
> use guides

# 创建新的业务数据库管理员:guides ,且授权数据管理管理员权限:必须在 use guides 之后执行
> db.createUser({user:"guides",pwd:"123456",roles:[{role:"dbOwner",db:"guides"}]})

# 查看新的业务数据库:guides 下面的管理员信息
> db.getUsers();

#退出本次登录
> exit;



# 再次连接至docker中的命令操作界面
[root@izwz99z5o9dc90keftqhlrz ~]# docker exec -it mongo mongo admin

# 切换到我们刚刚创建的新的业务数据库:guides
> use guides

# 使用上面创建的用户信息进行连接。
> db.auth('guides', '123456')

# 在新的业务数据库:guides 下面写入数据,圆满完成创建数据库,账号,写入数据的测试,后面我们使用自己的代码来连接系统操作
> db.guides.insert({"name":"liux", "age":31})


 二:springboot采集日志至mongodb

采集日志就特别粗旷了

第一步:pom.xml添加配置

<!--  mongodb数据库操作 -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

第二步:application.yml 配置好连接

#告诉Spring Boot应该在何处mongodb,没开验证 --auth 不需要输入用户名和密码,记住
spring  
  data:
    mongodb:
      host: 47.120.157.115
      port: 27017
      authentication-database: guides
      database: guides
      username: guides
      password: '123456'
      max-connection-idle-time: 1000
      max-connection-per-host: 200
      max-wait-time: 60000
      max-connection-life-time: 0
      connect-timeout: 1000
      socket-timeout: 2000


4.0以上authentication-database: 不要再写admin了,或者说4.2.1
authentication-database: guides

第三步:AOP切片日志获取

package com.zhx.guides.assistant.dto;

import com.zhx.guides.assistant.util.object.TimeHelper;

import java.io.Serializable;
import java.util.Date;

/**
 * @Date 创建时间: 2020-12-17 14:33
 * @Author 作者姓名: Liux
 * @Version 1.0
 * @Copyright Copyright by
 * @Direction 类说明
 */
public class HttpRequestLog implements Serializable {

    public final static String collectName = "guides" ;

    private String url ;
    private String httpMethod ;
    private String className ;
    private String methodName ;
    private String ip ;
    private String requestParam ;
    private Date nowTime = TimeHelper.getCurrentDate() ;

    .... get set 省略

}
package com.zhx.guides.assistant.web.aspect;

import com.alibaba.fastjson.JSONObject;
import com.zhx.guides.assistant.dto.HttpRequestLog;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;

/**
 * @Class WebLogAspect
 * @Version 1.0
 * @Date 创建时间:2020-03-03 10:05
 * @Copyright Copyright by company
 * @Direction 类说明
 */
@Aspect
@Component
public class WebLogAspect {

    @Autowired
    private MongoTemplate mongoTemplate;

    private final static Logger logger = LoggerFactory.getLogger(WebLogAspect.class);

    /** 以 controller 包下定义的所有请求为切入点 */
    @Pointcut("execution(public * com.zhx.guides.assistant.interfaces.controller..*.*(..))")
    public void webLog() {}

    /**
     * 在切点之前织入
     * @param joinPoint
     * @throws Throwable
     */
    @Before("webLog()")
    public void doBefore(JoinPoint joinPoint) throws Throwable {
        // 开始打印请求日志
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();

        HttpRequestLog httpRequestLog = new HttpRequestLog() ;
        httpRequestLog.setUrl( request.getRequestURL().toString() );
        httpRequestLog.setHttpMethod( request.getMethod() );
        httpRequestLog.setClassName( joinPoint.getSignature().getDeclaringTypeName() );
        httpRequestLog.setMethodName( joinPoint.getSignature().getName());
        httpRequestLog.setIp( request.getRemoteAddr() );

        // 打印请求相关参数
        logger.info("======================= Start ======================");
        // 打印请求 url
        logger.info("URL            : {}", httpRequestLog.getUrl() );
        // 打印 Http method
        logger.info("HTTP Method    : {}", httpRequestLog.getHttpMethod() );
        // 打印调用 controller 的全路径以及执行方法
        logger.info("Class Method   : {}.{}", httpRequestLog.getClassName() , httpRequestLog.getMethodName());
        // 打印请求的 IP
        logger.info("IP             : {}", httpRequestLog.getIp() );
        // 打印请求入参
        try {
            Object requestParam = joinPoint.getArgs();
            httpRequestLog.setRequestParam( JSONObject.toJSONString(requestParam) );
            logger.info("参数            : {}", httpRequestLog.getRequestParam() );
        }catch (Exception e){
            logger.info("参数打印失败,异常: {}", e.getMessage() );
        }finally {
            httpRequestLog.setClassName( null );
            try{mongoTemplate.save( httpRequestLog , HttpRequestLog.collectName );}catch (Exception e){}
        }
    }

    /**
     * 在切点之后织入
     * @throws Throwable
     */
    @After("webLog()")
    public void doAfter() throws Throwable {
        logger.info("=======================  End  ======================");
    }

    /**
     * 环绕
     * @param proceedingJoinPoint
     * @return
     * @throws Throwable
     */
    @Around("webLog()")
    public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        long startTime = System.currentTimeMillis();
        Object result = proceedingJoinPoint.proceed();
        // 打印出参
        logger.info("返回值 : {}", JSONObject.toJSONString(result));
        // 执行耗时
        logger.info("耗时   : {} ms", System.currentTimeMillis() - startTime);
        return result;
    }

}
package com.zhx.guides.assistant.util.object;

import org.apache.commons.lang.StringUtils;

import java.util.Date;

/**
 * @Class TimeHelper
 * @Version 1.0
 * @Date 创建时间:2018/12/21 09:26
 * @Copyright Copyright by
 * @Direction 类说明
 */
public class TimeHelper {   

    /**
     *当前时间
     * @return
     */
    public static Date getCurrentDate(){
        Calendar calendar = Calendar.getInstance();
        return calendar.getTime();
    }

}

三:看看存储日志的效果

备注:请注意使用的mongodb版本:4.2.1 依次配置使用即可

如果你使用的最新版本,有可能发生各种 权限不能通过的问题,那么请切换至4.2.1稳定版本,用最新版本有点当小白鼠的感觉。

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值