如何用Spring进行日志管理

2023-01-08

本文主要是 如何用Spring进行日志管理 相关的知识问答,如果你也了解,请帮忙补充。

可以用spring aop 进行日志管理,下面是我博客中的内容,项目中也是这么用,只是复杂度更高:


第一步:导包,可以参考:spring4 项目搭建 

还需要添加AspectJ(java中最流行的aop框架):

<dependency>  
    <groupId>org.springframework</groupId>  
    <artifactId>spring-aspects</artifactId>  
    <version>4.2.2.RELEASE</version>  
</dependency>

第二步:配置bean文件

配置aop可以通过注解,也可以通过配置文件,项目中建议有配置文件,这样便于修改。我先讲解注解方法

配置自动扫描和AspectJ框架

    <!-- 配置自动扫描的aop包 -->  
    <context:component-scan base-package="com.spring.aop"/>  
    <!-- 配置 AspectJ -->  
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

如果aop显示不出来就先xml头文件中导入(我相信大家会导入的,就不多说了)

xmlns:aop="http://www.springframework.org/schema/aop"  
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd


第三步:业务代码,模拟用户的操作


业务代码AopService

package com.spring.aop;  
import org.springframework.stereotype.Service;  
@Service  
public class AopService      
    // 用户登入  
    public void login()  
        System.out.println("登入成功");  
      
    // 用户退出  
    public void loginOut()  
        System.out.println("用户退出系统");  
      
      
    // 用户操作  
    public void writeABlog()  
        System.out.println("用户编写博客");  
      
    // 用户操作  
    public void deleteABlog()  
        System.out.println("用户删除博客");  
      


切面代码:

package com.spring.aop;  
import org.aspectj.lang.JoinPoint;  
import org.aspectj.lang.annotation.After;  
import org.aspectj.lang.annotation.Aspect;  
import org.springframework.stereotype.Component;  
@Component  
@Aspect  
public class LogAspect   
    @After("execution(public void com.spring.aop.AopService.*(..))")  
    public void afterMethod(JoinPoint joinPoint)   
        String opreate = joinPoint.getSignature().getName();  
        System.out.println("ITDragon opreate " + opreate);  
      
  

测试类:

package com.spring.aop;  
import org.junit.Test;  
import org.springframework.context.ApplicationContext;  
import org.springframework.context.support.ClassPathXmlApplicationContext;  
public class AopTest   
      
    private ApplicationContext ctx = null;  
      
      
        ctx = new ClassPathXmlApplicationContext("beans.xml");  
      
    @Test  
    public void aopTest()  
        AopService aopService = (AopService) ctx.getBean("aopService");  
        aopService.login();  
        aopService.writeABlog();  
        aopService.deleteABlog();  
        aopService.loginOut();  
      


测试结果:

登入成功  
ITDragon opreate login  
用户编写博客  
ITDragon opreate writeABlog  
用户删除博客  
ITDragon opreate deleteABlog  
用户退出系统  
ITDragon opreate loginOut


@Before: 前置通知, 在方法执行之前执行
@After: 后置通知, 在方法执行之后执行 
@AfterRunning: 返回通知, 在方法返回结果之后执行,方法必须有返回值。需要添加returning = "result",其中result就是返回结构,

@AfterReturning(pointcut="execution(public void com.spring.aop.AopService.*(..))",returning="result")

@AfterThrowing: 异常通知, 在方法抛出异常之后,有异常的时候才执行

@AfterThrowing(pointcut="execution(public void com.spring.aop.AopService.*(..))",throwing="e")

 

@Around: 环绕通知, 围绕着方法执行

@Component:标识该类受spring管理
@Aspect: 标识该类是一个切面

execution(public void com.spring.aop.AopService.*(..)) : 切入点签名表达式,用*号表示所有,也可以指定,括号内两点表示多个变量,也可以指定,还可以用 && , || , !;以每个execution为一个单位

JoinPoint:连接点,该参数可以访问到更多的数据,还有很多方法可以自己试试。

@Order(n): 切面执行的优先级,n值越小,越优先执行

还有重用切面,等知识我就不过多描述了,毕竟是入门,讲一些常用的就可以了。


使用xml配置文件


package com.spring.aop;  
import org.aspectj.lang.JoinPoint;  
public class LogAspect    
    public String afterMethod(JoinPoint joinPoint)   
        String opreate = joinPoint.getSignature().getName();  
        System.out.println("ITDragon opreate " + opreate);  
        return "";  
      


配置文件:

<!-- 扫描切面类 -->  
    <bean class="com.spring.aop.LogAspect" id="logAspect"></bean>  
      
    <!-- aop配置 -->  
    <aop:config>  
        <!-- 切点 -->  
        <aop:pointcut expression="execution(public void com.spring.aop.AopService.*(..))" id="aop"/>  
        <!-- 切面 : ref 的值是 切面类的id-->  
        <aop:aspect id="aspect" ref="logAspect">  
            <!-- 前置方法 : pointcut-ref 的值是 切点的id -->  
            <aop:before method="afterMethod" pointcut-ref="aop"/>  
        </aop:aspect>  
    </aop:config>

还是一样的测试方法,其结果为:

ITDragon opreate login  
登入成功  
ITDragon opreate writeABlog  
用户编写博客  
ITDragon opreate deleteABlog  
用户删除博客  
ITDragon opreate loginOut  
用户退出系统

在需要打印日志的地方添加切入点即可。切入点函数名尽量见名知意。这样切面函数才能通用。

参考知识1 楼上写的不错 好详细
相似知识
kafka操作日志管理 参考知识1首先附上kafka操作日志配置文件:log4j.properties根据相应的需要设置日志。其次kafka默认打印GC日志,如下,生产是不需要的需要关掉,kafkahomebin目录下面有个
『学了就忘』Linux日志管理 — 3.日志轮替 参考知识1日志轮替最主要的作用就是把旧的日志文件移动并改名,同时建立新的空日志文件,当旧日志文件超出保存的范围之后,就会进行删除。那么旧的日志文件改名之后,如何命名呢?主要依靠/etc/logrota
系统管理提供啥,日志管理和备份恢复功能。 参考知识15G网管具备以下优点:(1)Web方式的用户界面。(2)统一的网络管理(如4G/5G融合)。(3)网络智能分析。(4)开放的API接口。(5)虚拟化部署SaaS:SoftwareasaSer
日志多了怎么管理。 参考知识1朋友,您好。空间里的日志是没有上限的,但超过300篇后,最早发表的100篇日志会被系统自动纳入日志分类下的往期日志里,您打开空间,点日志,就可以在页面右边的日志分类下的往期日志里找到它们了。
管理人员日志 参考知识1日志主要发表在网络,详细介绍一个过程和经历的记录。我整理的管理人员日志,供参考!安全日志理解施工安全日志是从工程开始到竣工,由专职安全员对整个施工过程中的重要生产和技术活动的连续不断的详实记
Sql 2000日志管理 这个问题是由于你在备份的时候,数据库日志文件处于未截断,未收缩状态,即使备份完后达到90M,但还原后仍然为10G.所以你在做备份前,应该首先做下日志备份,截断其中的日志,然后手动收缩数据库,将其日志文
Graylog日志管理介绍——系列(一) 参考知识1Graylog是一个开源的完整的日志管理工具,功能和ELK类似,但又比ELK要简单,相对ELK也有自己的优势,不足之处大概就是扩展性没有ELK架构好。这篇文章里对两者做了一些比较,大家可以参
班级管理日志 参考知识1无论是在学校还是在社会中,大家都接触过日志吧,不知不觉中一天又要结束了,想必有很多难忘的瞬间吧,需要认真地为此写一篇日志了。如何写好日志呢?以下是我收集整理的班级管理日志范文,欢迎大家分享。