spring boot的gradle整合日志
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整合日志的更多相关文章
- Spring Boot 2.x整合Redis
最近在学习Spring Boot 2.x整合Redis,在这里和大家分享一下,希望对大家有帮助. Redis是什么 Redis 是开源免费高性能的key-value数据库.有以下的优势(源于Redis ...
- Spring Boot 2.X整合Spring-cache,让你的网站速度飞起来
计算机领域有人说过一句名言:“计算机科学领域的任何问题都可以通过增加一个中间层来解决”,今天我们就用Spring-cache给网站添加一层缓存,让你的网站速度飞起来. 本文目录 一.Spring Ca ...
- Spring Boot 2.0 整合携程Apollo配置中心
原文:https://www.jianshu.com/p/23d695af7e80 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够 ...
- [转] 使用Spring Boot和Gradle创建项目
Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的 ...
- 使用Spring Boot和Gradle创建AngularJS项目
Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的 ...
- spring boot 2.0 整合 elasticsearch6.5.3,spring boot 2.0 整合 elasticsearch NoNodeAvailableException
原文地址:spring boot 2.0 整合 elasticsearch NoNodeAvailableException 原文说的有点问题,下面贴出我的配置: 原码云项目地址:https://gi ...
- Spring Boot入门 and Spring Boot与ActiveMQ整合
1.Spring Boot入门 1.1什么是Spring Boot Spring 诞生时是 Java 企业版(Java Enterprise Edition,JEE,也称 J2EE)的轻量级代替品.无 ...
- Spring Boot系列一:默认日志logback配置解析
前言 今天来介绍下Spring Boot如何配置日志logback,我刚学习的时候,是带着下面几个问题来查资料的,你呢 如何引入日志? 日志输出格式以及输出方式如何配置? 代码中如何使用? 正文 Sp ...
- Spring Boot和Dubbo整合
provider端 POM依赖 <dependencies> <dependency> <groupId>org.springframework.boot</ ...
随机推荐
- 原生js利用data选择元素
//js var a = document.querySelector('[data-word=a]') console.log(a) html <dl class="find-car ...
- Linux 查找目录下大于*M的文件
1. 查找指定文件夹下等于1M的文件 find ./ -size 1M | wc -l 2. 查找指定文件夹下大于1M的文件 find ./target_path -size +1M | wc -l
- 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 ...
- Shell命令-系统信息及显示之df、top
文件及内容处理 - df.top 1. df:报告文件系统磁盘空间的使用情况 df命令的功能说明 df 命令用于显示目前在Linux系统上的文件系统的磁盘使用情况统计. df命令的语法格式 df [O ...
- 浅谈JS递归
简单理解就是函数内部不断调用自身 直接上代码: function dg(num){ ){ ; }else{ ) } } console.log(dg()) 最后输出值为21,记住加限制条件退出递归,不 ...
- 高频Python面试题分享
一.Python语言中你用过哪些方式来实现进程间通信1.队列Queue 2.Pipe管道 只适用于两个进程之间的通信, pipe的效率高于queue 3.共享内存 4.socket套接字(UDP即可) ...
- 好用的代码统计小工具SourceCounter(下载)
SourceCounter下载链接 https://pan.baidu.com/s/12Cg51L0hRn5w-m1NQJ-Xlg 提取码:i1cd 很多时候我们需要统计自己所写的代码的数量.举个栗子 ...
- 对CNN 的理解
CNN 的强大之处在于它的多层结构能自动学习特征,并且可以学习到多个层次的特征:较浅的卷积层感知域较小,学习到一些局部区域的特征. 较深的卷积层具有较大的感知域,能够学习到更加抽象一些的特征.这些抽象 ...
- 【转】Restful架构详解
1. 什么是REST REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Roy Fielding的 ...
- JavaScript 看不见的类型转换
本章是我阅读JavaScript权威指南时着重留意的内容,同时也推荐正在学习前端的小伙伴可以留意一下这本书<JavaScript权威指南> JavaScript可以很灵活的将一种类型的值转 ...