SpringAOP日志配置
SpringAOP日志配置
配置文件配置
l 配置spring-mvc.xml
<aop:config proxy-target-class="true" />
<bean id="logInterceptor" class="com.sjzxywlkj.cplife.log.LogInterceptor" />
<!-- 使用xml配置aop -->
<!-- 强制使用cglib代理,如果不设置,将默认使用jdk的代理,但是jdk的代理是基于接口的 -->
<aop:config>
<!--定义切面 -->
<aop:aspect id="logAspect" ref="logInterceptor">
<!-- 定义切入点 (配置在com.sjzxywlkj.cplife.controller下所有的类在调用之前都会被拦截) -->
<aop:pointcut expression="execution(* com.sjzxywlkj.cplife.controller.*.*(..))"
id="logPointCut" />
<!--方法执行之前被调用执行的 -->
<aop:before method="before" pointcut-ref="logPointCut" /><!--一个切入点的引用 -->
<aop:after method="after" pointcut-ref="logPointCut" /><!--一个切入点的引用 -->
</aop:aspect>
</aop:config>
l 日志处理类
package com.sjzxywlkj.cplife.log;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogInterceptor {
private final Logger logger = LoggerFactory.getLogger(LogInterceptor.class);
// private static Logger logger =LoggerFactory.getLogger(LogInterceptor.class);
public void before() {
logger.info("login start!");
logger.debug("lllllllllllllllllllllll");
// System.out.println("qqqqqqqqqqqqqqqqqqqqq");
}
public void after() {
logger.info("login end!");
logger.debug("aaaaaaaaaaaaaaaaaaaaaaaaa");
// System.out.println("wwwwwwwwwwwwwwwwwwwwwwwwwww");
}
}
l log4j.properties日志文件配置
### 设置###
### 日志相应级别debug,输出位置 d,e
log4j.rootLogger = debug,D,E
### 输出DEBUG 级别以上的日志到=E://logs/log.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = ${webapp.root}/WEB-INF/logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 输出ERROR 级别以上的日志到=E://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =${webapp.root}/WEB-INF/logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern =%-d{yyyy-MM-dd HH\:mm\:ss} [ %t\:%r ] - [ %p ] %m%n
l web.xml配置日志
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:resources/log4j.properties</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
注解文件配置
l spring-mvc.xml文件配置
方法一
//扫描aop日志处理类
<context:component-scan base-package="com.sjzxywlkj.cplife.log" />
//开启aop
<aop:aspectj-autoproxy proxy-target-class="true" />
方法二
<bean id="logInterceptor" class="com.sjzxywlkj.cplife.log.LogInterceptor"></bean>
<aop:aspectj-autoproxy proxy-target-class="true"/>
l 日志切面类
package com.sjzxywlkj.cplife.log;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class LogInterceptor {
private final Logger logger = LoggerFactory.getLogger(LogInterceptor.class);
@Before(value = "execution(* com.sjzxywlkj.cplife.controller.*.*(..))")
public void before() {
logger.info("login start!");
System.out.println("lllllllllllllllllllll");
}
@After(value = "execution(* com.sjzxywlkj.cplife.controller.*.*(..))")
public void after() {
logger.info("login end!");
System.out.println("aaaaaaaaaaaaaaaaaaaaaaaaa");
}
}
基于自定义注解
l 配置文件设置
<context:component-scan base-package="com.sjzxywlkj.cplife.log"></context:component-scan>
<context:component-scan base-package="com.sjzxywlkj.cplife.annotation"></context:component-scan>
<aop:aspectj-autoproxy proxy-target-class="true">
</aop:aspectj-autoproxy>
l 自定义注解
package com.sjzxywlkj.cplife.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log {
String oper() default "";
}
l 日志切面类
package com.sjzxywlkj.cplife.log;
import java.lang.reflect.Method;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.sjzxywlkj.cplife.annotation.Log;
@Aspect
@Component
public class LogInterceptor {
private final Logger logger = LoggerFactory.getLogger(LogInterceptor.class);
@Pointcut("@annotation(com.sjzxywlkj.cplife.annotation.Log)")
public void controllerAspect() {
}
@Before("controllerAspect()")
public void before(JoinPoint joinPoint) {
logger.info(getOper(joinPoint));
}
private String getOper(JoinPoint joinPoint) {
MethodSignature methodName = (MethodSignature) joinPoint.getSignature();
Method method = methodName.getMethod();
return method.getAnnotation(Log.class).oper();
}
}
l Controller注入
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private IUserService uService;
// 用户登录
@RequestMapping(value = "/login", method = RequestMethod.GET)
@ResponseBody
@Log(oper="user login")
public String login(){
return null;
}
SpringAOP日志配置的更多相关文章
- Spring2.5那些事之基于AOP的方法级注解式日志配置
在日常开发中经常需要在代码中加入一些记录用户操作日志的log语句,比如谁在什么时间做了什么操作,等等. 把这些对于开发人员开说无关痛痒的代码写死在业务方法中实在不是一件很舒服的事情,于是AOP应运而生 ...
- django 1.8 日志配置
django 1.8 日志配置 以下为setings配置logging代码片段 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(_ ...
- nginx日志配置
nginx日志配置 http://www.ttlsa.com/linux/the-nginx-log-configuration/ 日志对于统计排错来说非常有利的.本文总结了nginx日志相关的配置如 ...
- 日志配置logback
在选择项目日志框架时,发现log4j的作者开发了新的日志框架,据说性能提高不少,那就选它了,不过,除了配置上有点不习惯外,最重要的一点 ,打印线程号这个功能依然没有(打印线程名这个东西是在是个鸡肋). ...
- 服务器是windows时tomcat无法打印所有日志配置修改
Tomcat运行仅一天磁盘空间突然就增加了很多,发现是日志文件太大了,修改tomcat的日志配置即可. 查看目录所占空间大小: ? 1 [root@XXX webapps]du -sh 清理方法: ? ...
- [译]Stairway to Integration Services Level 12 - 高级日志配置
介绍 本文中,我们将结合之前学习的时间冒泡,日志记录,以及复制模型.建立一个自定义的SSIS包日志模型. SSIS Task事件回顾 Reviewing SSIS Task Events 在做实 ...
- [译]Stairway to Integration Services Level 11 - 日志配置
介绍 在前一个章节我们讨论了事先行为,分享了如何操作默认的行为和时间冒泡,并且介绍了父子模型. 本文中,我们会配置SSIS日志. 进行简单及高级日志配置,存储,和检索的实验.并且生成自定义日志信息. ...
- Nginx日志配置及日志切割
日志配置 日志对于统计排错来说非常有利的.本文总结了nginx日志相关的配置如access_log.log_format.open_log_file_cache.log_not_found.log_s ...
- SpringBoot之简单日志配置
我的目的指定一个文件夹输出:(不采用指定文件的原因是一个文件的大小时间长了会很大,不利于处理) logging: level: root: INFO org.sselab: controller: I ...
随机推荐
- C++类中一个构造函数调用另一个构造函数
class A { int a; int b; int c; public: A(int aa, int bb) : a(aa), b(bb),c(0) { cout << "a ...
- 我发起了一个 操作系统 GUI 和 Tcp / IP 包 的 开源项目 DeviceOS
操作系统 如果 不需要 处理 复杂多样 的 硬件 兼容性, 其实 并不算 大项目, 可以算 毕业设计 . 但是, GUI 和 Tcp / IP 这两个 部分 的 实现逻辑 很多 很复杂, 这 2 ...
- 1.2.3 Excel中姓名处理,将名加密星号
在对应的单元格中我们输入公式: =IF(LEN(A22)>2,REPLACE(A22,2,LEN(A22)-1,"**"),REPLACE(A22,2,LEN(A22)-1, ...
- xshell 显示中文
xshell 可能无法正常显示中文,即使选择了utf-8编码也不生效. 1:输入:echo $LANG 显示:en_US.UTF-8 2.输入:export LANG=zh_CN.UTF-8 3. 输 ...
- forward reference前向引用,gloal values and local values全局变量和局部变量,recursive function递归函数
1.全局变量与局部变量练习 1 # -*- coding: UTF-8 -*- 2 def bar(): 3 print('from bar') 4 def foo(): 5 print('from ...
- FluentData -Micro ORM with a fluent API that makes it simple to query a database 【MYSQL】
官方地址:http://fluentdata.codeplex.com/documentation MYSQL: MySQL through the MySQL Connector .NET driv ...
- C常量与控制语句
在C语言中定义常量的两种方式 在C语言编程中定义常量有两种方法. const关键字 #define预处理器 1. const关键字 const关键字用于定义C语言编程中的常量. const float ...
- linux服务samba与ftp篇
samba复习: 1.下载samba:yum -y install samba 2.打开配置文件/etc/samba/smb.conf输入: [共享文件名] path = 目录名 (事先创建) pub ...
- Variables多种表达
Variables:TF基础数据之一,常用于变量的训练...重要性刚学TF就知道了 1.tf.Variable() tf.Variable(initial_value=None, trainable= ...
- Struts vs spring mvc
1. 机制.spring mvc 的入口是servlet, 而struts是filter(这里要指出,filter和servlet是不同的.以前认为filter是servlet的一种特殊),这样就导致 ...