最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot如何使用mongo做日志存儲(chǔ)

 更新時(shí)間:2025年06月24日 17:28:01   作者:yololee_  
這篇文章主要介紹了springboot如何使用mongo做日志存儲(chǔ)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

springboot使用mongo做日志存儲(chǔ)

導(dǎo)入依賴

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

實(shí)體類

package com.hl.springbootmongodb.pojo;

import lombok.Data;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.format.annotation.DateTimeFormat;

import java.util.Date;

//配置MongoDB的表名稱
@Document(collection = "logs")
@Data
public class LogBean {
    private String id;
    private Integer userId;
    private String username;

    @DateTimeFormat(pattern="yyyy-MM-dd")
    private Date createDate;
    private String ip;
    private String className;//類名
    private String method;//方法名
    private String requestURI;//請(qǐng)求
    private String responseResults;//響應(yīng)結(jié)果
}

工具類

package com.hl.springbootmongodb.util;

import javax.servlet.http.HttpServletRequest;

public class CommonUtils {
     /**
     * 默認(rèn)IP地址
     */
   	 public final static String ERROR_IP = "127.0.0.1";
    
     public static String getUserIP(HttpServletRequest request) {
        // 優(yōu)先取 X-Real-IP
        String ip = request.getHeader("X-Real-IP");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("x-forwarded-for");
        }

        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
            if ("0:0:0:0:0:0:0:1".equals(ip)) {
                ip = ERROR_IP;
            }
        }
        if ("unknown".equalsIgnoreCase(ip)) {
            ip = ERROR_IP;
            return ip;
        }
        int index = ip.indexOf(',');
        if (index >= 0) {
            ip = ip.substring(0, index);
        }
        return ip;
    }
}

切面類

package com.hl.springbootmongodb.aspect;


import com.hl.springbootmongodb.pojo.LogBean;
import com.hl.springbootmongodb.util.CommonUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
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;
import java.util.Date;

@Component
@Aspect
public class MongoDbLogAspect {
    @Autowired
    private MongoTemplate mongoTemplate;

    //切點(diǎn)的注解  是指那些方法需要被執(zhí)行"AOP"
    @Pointcut("execution(* com.hl.springbootmongodb.controller.*.*(..))")
    public void logPointCut(){

    }

    //返回后通知value="logPointCut()"是指通知是在logPointCut()切點(diǎn)返回后通知的
    //returning="rtv"是返回值
    //@AfterReturning這個(gè)注解是返回后通知的注解
    @AfterReturning(value="logPointCut()",returning="rtv")
    //JoinPoint是連接點(diǎn)的意思我們要獲取到的如類名,方法名,請(qǐng)求參數(shù)等都是從連接點(diǎn)中取出來的
    public void afterLog(JoinPoint joinpoint, Object rtv) {
        System.out.println("進(jìn)去切點(diǎn)。。。。。");
        LogBean logBean = new LogBean();
        //獲取類名
        String classname = joinpoint.getTarget().getClass().getSimpleName();
        //獲取方法名
        String method = joinpoint.getSignature().getName();
        //獲取請(qǐng)求參數(shù)
        String requestParam = "";
        logBean.setClassName(classname);
        logBean.setMethod(method);
        logBean.setResponseResults(requestParam);
        logBean.setCreateDate(new Date());
        //返回值
        if (rtv != null) {
            logBean.setResponseResults(rtv.toString());
        }
        //獲取request對(duì)象
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = requestAttributes.getRequest();
        String requestURI = request.getRequestURI();
        logBean.setRequestURI(requestURI);
		/*	UserBean user = (UserBean) request.getSession().getAttribute("user");
		if(user!=null){
			logBean.setUserId(user.getId());
		}*/
        //獲取ip地址是封裝好的一個(gè)類
        String ip = CommonUtils.getUserIP(request);
        logBean.setIp(ip);
//        User user = (User) SecurityUtils.getSubject().getPrincipal();
//        logBean.setUsername(user.getName());
        //保存mongodb
        mongoTemplate.save(logBean);
        System.out.println("日志存儲(chǔ)成功.........");
    }
}

controller層

@RestController
public class TestLog {

    @PostMapping("/hello")
    public String test(){
        return "ok";
    }
}

配置文件

spring.data.mongodb.uri=mongodb://testuser:password@127.0.0.1:27017/test

測(cè)試結(jié)果

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java程序之檢索文件方式(含內(nèi)容)

    Java程序之檢索文件方式(含內(nèi)容)

    該項(xiàng)目通過遞歸掃描指定目錄及子目錄,檢查文件名和內(nèi)容是否包含關(guān)鍵字,返回匹配文件的完整代碼,適用于文件搜索任務(wù),提供高效解決方案
    2025-09-09
  • RestTemplate如何使用JSON發(fā)送Post請(qǐng)求

    RestTemplate如何使用JSON發(fā)送Post請(qǐng)求

    這篇文章主要介紹了RestTemplate如何使用JSON發(fā)送Post請(qǐng)求問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java中spring boot 字符串判斷是否為空方法小結(jié)

    Java中spring boot 字符串判斷是否為空方法小結(jié)

    這篇文章主要介紹了Java中spring boot字符串判斷是否為空,通過安裝依賴,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-11-11
  • springBoot自動(dòng)配置的全過程

    springBoot自動(dòng)配置的全過程

    這篇文章主要介紹了springBoot自動(dòng)配置的全過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • java 文件上傳到讀取文件內(nèi)容的實(shí)例

    java 文件上傳到讀取文件內(nèi)容的實(shí)例

    今天小編就為大家分享一篇java 文件上傳到讀取文件內(nèi)容的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • java 中同步方法和同步代碼塊的區(qū)別詳解

    java 中同步方法和同步代碼塊的區(qū)別詳解

    這篇文章主要介紹了java 中同步方法和同步代碼塊的區(qū)別是什么的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • java開發(fā)中嵌套類的詳解及實(shí)例

    java開發(fā)中嵌套類的詳解及實(shí)例

    這篇文章主要介紹了 java開發(fā)中嵌套類的詳解及實(shí)例的相關(guān)資料,一般把定義內(nèi)部類的外圍類成為包裝類(enclosing class)或者外部類,需要的朋友可以參考下
    2017-07-07
  • 使用feign發(fā)送http請(qǐng)求解析報(bào)錯(cuò)的問題

    使用feign發(fā)送http請(qǐng)求解析報(bào)錯(cuò)的問題

    這篇文章主要介紹了使用feign發(fā)送http請(qǐng)求解析報(bào)錯(cuò)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 解決Mybatis-Plus中分頁插件Page中total=0的問題

    解決Mybatis-Plus中分頁插件Page中total=0的問題

    在使用Mybatis-Plus進(jìn)行分頁查詢時(shí),如果遇到`total=0`的情況,即使查詢到了數(shù)據(jù),也無法正確分頁,這通常是由于依賴版本問題導(dǎo)致的,對(duì)于低版本,需要手動(dòng)配置分頁攔截器;對(duì)于高版本,可能需要添加特定的依賴配置來解決這個(gè)問題
    2025-11-11
  • java僅用30行代碼就實(shí)現(xiàn)了視頻轉(zhuǎn)音頻的批量轉(zhuǎn)換

    java僅用30行代碼就實(shí)現(xiàn)了視頻轉(zhuǎn)音頻的批量轉(zhuǎn)換

    這篇文章主要介紹了java僅用30行代碼就實(shí)現(xiàn)了視頻轉(zhuǎn)音頻的批量轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04

最新評(píng)論

榕江县| 安吉县| 水城县| 安宁市| 五河县| 蚌埠市| 曲阜市| 大埔县| 唐河县| 凤城市| 武强县| 通化市| 佛冈县| 开平市| 苏尼特左旗| 工布江达县| 广灵县| 陆河县| 沙坪坝区| 孝义市| 眉山市| 阿拉善盟| 南康市| 甘德县| 高安市| 钦州市| 宣威市| 邢台市| 富蕴县| 忻州市| 金山区| 鹤岗市| 临安市| 怀仁县| 双鸭山市| 克什克腾旗| 南京市| 安国市| 天柱县| 宿州市| 文化|