1.引入包
configurations {
providedRuntime
// remove default logger
all*.exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
}
dependencies {
compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.springframework.boot:spring-boot-starter-data-redis')
compile('org.springframework.boot:spring-boot-starter-data-rest')
compile('org.springframework.boot:spring-boot-starter-freemarker')
compile('org.springframework.boot:spring-boot-starter-web')
compile('org.springframework.boot:spring-boot-starter-web-services')
compile('org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.2')
compile('org.springframework.boot:spring-boot-starter-log4j2:2.0.3.RELEASE')
compile('org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.2')
compileOnly('org.projectlombok:lombok')
runtime('mysql:mysql-connector-java')
compile ('com.alibaba:fastjson:1.2.47')
testCompile('org.springframework.boot:spring-boot-starter-test')
} 2.在路径rescourse下配置log4j2.properties
name = PropertiesConfig
#property.filename = target/logs
property.filename = D:\\log #appenders = console, file
#配置值是appender的类型,并不是具体appender实例的name
appenders = rolling appender.rolling.type = RollingFile
appender.rolling.name = RollingLogFile
appender.rolling.fileName=${filename}/automationlogs.log
appender.rolling.filePattern = ${filename}/automationlogs-%d{MM-dd-yy-HH-mm-ss}-%i.log
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern=[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
appender.rolling.policies.type = Policies
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.size.size=100MB
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.max = 5 rootLogger.level = trace
rootLogger.appenderRef.rolling.ref = RollingLogFile #rootLogger.appenderRef.rolling.ref = rolling 3.java ,其中@Slf4j注解相当于声明变量,可以直接使用log.info()
@WebFilter(filterName = "RequestLog", urlPatterns = "/*")
@SpringBootApplication
//重点
@ServletComponentScan
public class DemoApplication {启动类}
这两个注解相当于配置过滤器
/*
* Project: somp.cusma
*
* File Created at 2017年11月17日
*
* Copyright 2016 CMCC Corporation Limited.
* All rights reserved.
*
* This software is the confidential and proprietary information of
* ZYHY Company. ("Confidential Information"). You shall not
* disclose such Confidential Information and shall use it only in
* accordance with the terms of the license.
*/
package com.sunreal.demo.recordcore.domain.login.filter; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils; import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Enumeration; /**
* @Type RequestLog.java
* @Desc
* @version
*/
@Component("requestLog")
//重点
@WebFilter(filterName = "RequestLog", urlPatterns = "/*")
@Slf4j
public class RequestLog implements Filter { @Override
public void init(FilterConfig filterConfig) throws ServletException { } @Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest; log.info("<=========================== Request Url ===========================>"); log.info(request.getRequestURL().toString()); log.info("<========================= Header Attribute ========================>");
Enumeration<?> e = request.getHeaderNames();
while (e.hasMoreElements()) {
String name = (String) e.nextElement();
String value = request.getHeader(name);
log.info(name + " = " + value);
}
log.info("<========================= Header Attribute ========================>"); String queryString = request.getQueryString();
if(!StringUtils.isEmpty(queryString)){
log.info("<========================= Get String ========================>");
log.info(queryString);
} log.info("<========================= Request Param ===========================>");
Enumeration<?> eq = request.getParameterNames();
while (eq.hasMoreElements()) {
String name = (String) eq.nextElement();
String value = request.getParameter(name);
log.info(name + " = " + value);
}
log.info("<========================= Request Param ===========================>"); filterChain.doFilter(servletRequest, servletResponse); } @Override
public void destroy() { } } /**
* Revision history
* -------------------------------------------------------------------------
*
* Date Author Note
* -------------------------------------------------------------------------
*/
上述是日志的配置情况,
下面介绍aop切入日志的的方法
@Target({ ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SystemControllerLog { String description() default ""; }
@RequestMapping(value = "/htgl/addNewRecruitment", method = RequestMethod.POST)
@SystemControllerLog(description="登出")
public SunrealResult addNewRecruitment(@RequestBody RecruitmentInformation recruitmentInformation) {
System.out.println("进入Sysmaintain--provider--addNewRecruitment");
try {
return recruitmentInformationService.addNewRecruitment(recruitmentInformation);
} catch (Exception e) {
e.printStackTrace();
return SunrealResultUtil.error(-1, "接口服务异常,请重新尝试!");
}
}
@Component //交予容器管理
@Aspect //代理
public class LoggerBefore {
/**
* Logger for this class
*/
private static final Logger logger = Logger.getLogger(LoggerBefore.class); /**
* OperateLogService
*/
@Autowired
private SysuserOperatehistoryMapper logService; @Pointcut("@annotation(com.sunreal.sysmaintain_provider.util.SystemControllerLog)")
public void controllerAspect() { } @SuppressWarnings("rawtypes")
public static String getControllerMethodDescription(JoinPoint joinPoint) throws Exception {
String targetName = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
Object[] arguments = joinPoint.getArgs();
Class targetClass = Class.forName(targetName);
Method[] methods = targetClass.getMethods();
String description = "";
for (Method method : methods) {
if (method.getName().equals(methodName)) {
Class[] clazzs = method.getParameterTypes();
if (clazzs.length == arguments.length) {
description = method.getAnnotation(SystemControllerLog.class).description();
break;
}
}
}
return description;
} /**
* @param
* @throws Throwable
*/
@After("controllerAspect()")
public void before(JoinPoint joinPoint) throws Throwable {
// EnterpriseOperator curUser = null;
// String userIp = null;
// String sessionId = null;
String clazzName = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
Object[] objects = joinPoint.getArgs();
Class targetClass = Class.forName(clazzName);
Method[] methods = targetClass.getMethods();
String description = "";
for (Method method : methods) {
if (method.getName().equals(methodName)) {
Class[] clazzs = method.getParameterTypes();
if (clazzs.length == objects.length) {
description = method.getAnnotation(SystemControllerLog.class).description();
break;
}
}
}
logger.info("clazzName=" + clazzName + ",method=" + methodName + ",args=" + objects);
// Subject subject = SecurityUtils.getSubject();
// userIp=subject.getSession().getHost();
// sessionId=subject.getSession().getId().toString();
// Object user = subject.getPrincipal();
// logger.info(user);
// if (user instanceof EnterpriseOperator) {
// curUser = (EnterpriseOperator) user;
// OperateLog log = new OperateLog();
// log.setUserId(String.valueOf(curUser.getId()));
// log.setUserName(curUser.getUsername());
// log.setOperateTime(new Date());
// log.setClassName(clazzName);
// log.setOperateMethod(methodName);
// log.setUserIp(userIp);
// log.setSessionId(sessionId);
// log.setOperateCnName(description);
// logService.addLog(log);
// }
Operateinfo operateinfo = new Operateinfo();
operateinfo.setOperatedate(new Date());
operateinfo.setOperateuserid(12212321);
operateinfo.setOperatedetail(methodName);
long logId = new IdWorker(1,1).nextId();
operateinfo.setOperateId(logId);
logService.insertLog(operateinfo);
}
}

@SpringBootApplication
//重点
@ServletComponentScan
public class DemoApplication {

spring boot的gradle整合日志的更多相关文章

  1. Spring Boot 2.x整合Redis

    最近在学习Spring Boot 2.x整合Redis,在这里和大家分享一下,希望对大家有帮助. Redis是什么 Redis 是开源免费高性能的key-value数据库.有以下的优势(源于Redis ...

  2. Spring Boot 2.X整合Spring-cache,让你的网站速度飞起来

    计算机领域有人说过一句名言:“计算机科学领域的任何问题都可以通过增加一个中间层来解决”,今天我们就用Spring-cache给网站添加一层缓存,让你的网站速度飞起来. 本文目录 一.Spring Ca ...

  3. Spring Boot 2.0 整合携程Apollo配置中心

    原文:https://www.jianshu.com/p/23d695af7e80 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够 ...

  4. [转] 使用Spring Boot和Gradle创建项目

    Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的 ...

  5. 使用Spring Boot和Gradle创建AngularJS项目

    Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的 ...

  6. spring boot 2.0 整合 elasticsearch6.5.3,spring boot 2.0 整合 elasticsearch NoNodeAvailableException

    原文地址:spring boot 2.0 整合 elasticsearch NoNodeAvailableException 原文说的有点问题,下面贴出我的配置: 原码云项目地址:https://gi ...

  7. Spring Boot入门 and Spring Boot与ActiveMQ整合

    1.Spring Boot入门 1.1什么是Spring Boot Spring 诞生时是 Java 企业版(Java Enterprise Edition,JEE,也称 J2EE)的轻量级代替品.无 ...

  8. Spring Boot系列一:默认日志logback配置解析

    前言 今天来介绍下Spring Boot如何配置日志logback,我刚学习的时候,是带着下面几个问题来查资料的,你呢 如何引入日志? 日志输出格式以及输出方式如何配置? 代码中如何使用? 正文 Sp ...

  9. Spring Boot和Dubbo整合

    provider端 POM依赖 <dependencies> <dependency> <groupId>org.springframework.boot</ ...

随机推荐

  1. 原生js利用data选择元素

    //js var a = document.querySelector('[data-word=a]') console.log(a) html <dl class="find-car ...

  2. Linux 查找目录下大于*M的文件

    1. 查找指定文件夹下等于1M的文件 find ./ -size 1M | wc -l 2. 查找指定文件夹下大于1M的文件 find ./target_path -size +1M | wc -l

  3. Python—变量详解

    变量赋值 a = 1 b = 2 c = 3 print a, b, c # 1 2 3 a = b = c = 1 print a, b, c # 1 1 1 a, b, c = 1, 2, 3 p ...

  4. Shell命令-系统信息及显示之df、top

    文件及内容处理 - df.top 1. df:报告文件系统磁盘空间的使用情况 df命令的功能说明 df 命令用于显示目前在Linux系统上的文件系统的磁盘使用情况统计. df命令的语法格式 df [O ...

  5. 浅谈JS递归

    简单理解就是函数内部不断调用自身 直接上代码: function dg(num){ ){ ; }else{ ) } } console.log(dg()) 最后输出值为21,记住加限制条件退出递归,不 ...

  6. 高频Python面试题分享

    一.Python语言中你用过哪些方式来实现进程间通信1.队列Queue 2.Pipe管道 只适用于两个进程之间的通信, pipe的效率高于queue 3.共享内存 4.socket套接字(UDP即可) ...

  7. 好用的代码统计小工具SourceCounter(下载)

    SourceCounter下载链接 https://pan.baidu.com/s/12Cg51L0hRn5w-m1NQJ-Xlg 提取码:i1cd 很多时候我们需要统计自己所写的代码的数量.举个栗子 ...

  8. 对CNN 的理解

    CNN 的强大之处在于它的多层结构能自动学习特征,并且可以学习到多个层次的特征:较浅的卷积层感知域较小,学习到一些局部区域的特征. 较深的卷积层具有较大的感知域,能够学习到更加抽象一些的特征.这些抽象 ...

  9. 【转】Restful架构详解

    1. 什么是REST REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Roy Fielding的 ...

  10. JavaScript 看不见的类型转换

    本章是我阅读JavaScript权威指南时着重留意的内容,同时也推荐正在学习前端的小伙伴可以留意一下这本书<JavaScript权威指南> JavaScript可以很灵活的将一种类型的值转 ...