作用:

1.生成文档。这是最常见的,也是java 最早提供的注解。常用的有 @see @param @return 等 
2..跟踪代码依赖性,实现替代配置文件功能。比较常见的是spring 2.5 开始的基于注解配置。作用就是减少配置。现在的框架基本都使用了这种配置来减少配置文件的数量。
3.在编译时进行格式检查。如@override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出。

常用的元注解:

@Retention: 只能用于修饰一个Annotation定义,用于指定该Annotation作用范围,或则生命周期?

参数值赋值后的作用
RetentionPolicy.CLASS (默认值)给解析器使用的。编译器会把注解记录在class文件中,当运行java程序的时候,JVM不会保留注解。
RetentionPolicy.RUNTIME 编译器会在注解记录在class文件中,当运行java程序时,JVM会保留注解,程序可以通过反射来获取该注解。
RetentionPolicy.SOURCE 给编译器使用的。编译器不会将注解记录到class文件中。

@Target: 用于修饰类的哪个成员。它包含了一个名为value,类型为ElementType的成员变量。用于指定修饰目标对象的类型:TYPE(类、接口)、FIELD(成员变量)、    METHOD(方法)

@Documented: 用于指定被@Documented修饰的 Annotation 类将被 javadoc 工具提取成文档。使用该元注解修饰,该注解的信息可以生成到javadoc 文档中。

@Inherited: 如果一个注解使用该元注解修饰,那么某个类使用了这个注解,其子类也会自动继承这个注解。

 

package com.savingyu.util.aop;

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;

/**
 * 日志注解
 * @author yu
 *
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LoggerManage {
    public String description();
}

 

 1 package com.savingyu.util.aop;
 2 
 3 import org.apache.commons.lang3.builder.ToStringBuilder;
 4 import org.aspectj.lang.JoinPoint;
 5 import org.aspectj.lang.annotation.AfterReturning;
 6 import org.aspectj.lang.annotation.AfterThrowing;
 7 import org.aspectj.lang.annotation.Aspect;
 8 import org.aspectj.lang.annotation.Before;
 9 import org.slf4j.Logger;
10 import org.slf4j.LoggerFactory;
11 import org.springframework.stereotype.Service;
12 
13 /**
14  * 日志管理:
15  * @author Administrator
16  *
17  */
18 @Aspect
19 @Service
20 public class LoggerAdvice {
21     protected Logger logger = LoggerFactory.getLogger(this.getClass());
22     
23     @Before("within(com.savingyu..*) && @annotation(loggerManage)")
24     public void addBefoLogger(JoinPoint joinPoint,LoggerManage loggerManage){
25         logger.info("######################################################");
26         logger.info("执行"+loggerManage.description()+"开始");
27         logger.info(joinPoint.getSignature().toString());
28         logger.info(parseParames(joinPoint.getArgs()));
29         logger.info("######################################################");
30     }
31     
32     @AfterReturning("within(com.savingyu..*) && @annotation(loggerManage)")
33     public void addAfterRetruningLogger(JoinPoint joinPoint,LoggerManage loggerManage){
34         logger.info("执行"+loggerManage.description()+" 结束");
35     }
36     
37     @AfterThrowing(pointcut = "within(com.savingyu..*) && @annotation(loggerManage)",
38             throwing ="ex")
39     public void addAfterThrowingLogger(JoinPoint joinPoint,LoggerManage loggerManage,
40             Exception ex){
41         logger.error("执行"+loggerManage.description()+" 异常",ex);
42     }
43     
44     private String parseParames(Object[] parames){
45         if(null == parames || parames.length <= 0 || parames.length>1024){
46             return "";
47         }
48         StringBuffer param = new StringBuffer("传入参数[{}] ");
49         for(Object obj : parames){
50             param.append(ToStringBuilder.reflectionToString(obj)).append(" ");
51         }
52         return param.toString();
53     }
54 }

 

第二部分

 

默认的输出格式:

2018-08-21 14:34:19.788  INFO 6384 --- [  restartedMain] o.s.j.e.a.AnnotationMBeanExporter        : Unregistering JMX-exposed beans on shutdown
  • 时间日期
  • 日志级别:ERROR、WARM、INFO、DEBUGTorRACE
  • 进程ID
  • 线程名
  • logger名
  • 日志内容

属性配置:

在application.properties中

  • spring.output.ansi.enabled:NVER、DETECT、ALWAYS——多彩输出:禁用、默认、总是
  • logging.file:文件输出。设置文件。可以绝对路径、相对路径。
  • logging.path:同上。设置目录。
  • logging.level.*=level:级别控制。*为包名,leve为级别选项:Trace、debug、info、warn、error、fatal、off

  说明:

  1日志文件在10Mb大小时,产生新的日志文件。

  2级别

  logging.level.com.didispace=DEBUGcom.didispace包下所有class以DEBUG级别输出

  logging.level.root=WARN:root日志以WARN级别输出