1、创建一个自定义注解
@Retention(RetentionPolicy.RUNTIME)//运行时生效
@Target({ElementType.METHOD})//定义注解只能放在方法上
@Documented
public @interface SysLog {
//value默认值
String value() default "System Logger";
}
2、定义切面
@Slf4j
@Aspect
@Component
public class SysLogAspect {
@Around("@annotation(sysLog)")
public Object SysLog(ProceedingJoinPoint point, SysLog sysLog) throws Throwable {
log.debug(sysLog.value());
MethodSignature methodSignature = (MethodSignature) point.getSignature();
//获取参数名
String[] parameterNames = methodSignature.getParameterNames();
//获取参数值
Object[] args = point.getArgs();
log.debug("参数名:"+Arrays.toString(parameterNames));
log.debug("参数值:"+Arrays.toString(args));
long start = System.currentTimeMillis();
//执行后的结果,一定要记得返回,否则后面的方法流程就无法获取对应的值
Object o = point.proceed();
long end = System.currentTimeMillis();
//计算程序执行所消耗的时长
log.debug("耗时"+ (end - start) + "ms");
return o;
}
}
3、测试
日志一般都再业务层实现,这里选用一个SpringBoot项目的业务层加上我们的自定义注解,来实现日志的功能。
mapper接口
@Repository
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
service接口
public interface UserService {
//验证登录
User login(String username, String password);
}
service实现类
@Service
public class UserServiceImpl implements UserService{
@Autowired
UserMapper userMapper;
@SysLog("业务层:登录验证")
@Override
public User login(String username, String password) {
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(User::getUsername,username).eq(User::getPassword,password);
return userMapper.selectOne(queryWrapper);
}
}
测试
@SpringBootTest
@EnableAspectJAutoProxy
public class UserTest {
@Test
void testLogin(){
Object o2 = userService.login("admin", "123456");
System.out.println(o2);
}
}
控制台打印
当然,还可以在application.yaml配置文件中进行相应配置,把日志输出到指定位置
logging:
file:
path: ./logs
name: log.log
level:
root:
java: info
com:
wae: debug