作用:
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=DEBUG
:com.didispace
包下所有class以DEBUG级别输出
logging.level.root=WARN
:root日志以WARN级别输出