ABP理论学习之审计日志

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

本篇目录


介绍

维基百科说: “审计跟踪(也叫审计日志)是与安全相关的按照时间顺序的记录,记录集或者记录源,它们提供了活动序列的文档证据,这些活动序列可以在任何时间影响一个特定的操作,步骤或其他”。

ABP提供了一个基础设施,它可以自动记录所有和应用程序交互的日志。它可以记录具有调用者信息和参数的方法调用。

一般地,要保存的字段是:相关的租户Id,调用者的用户Id,调用的 服务名称(调用方法的类名),调用的方法名 , 执行方法名(序列化成Json) , 执行时间 , 执行时长(单位毫秒),客户端IP地址 ,客户端计算机名称异常(抛出异常的情况下)。

有了这些信息,我们不仅知道谁进行了该操作,而且可以测量应用的性能以及观察抛出的异常。甚至,你可以获得应用使用情况的统计数据(statistics)

审计系统使用IAbpSession来获得当前的UserId和TenantId。

关于 IAuditingStore

审计系统使用了IAuditingStore来存储信息。虽然你可以用你自己的方式来实现该接口,但是它已经完全实现在module-zero项目中。如果你没有实现该接口,那么默认会使用SimpleLogAuditingStore,并且它会将审计信息记录到日志中(log)。

配置

要配置审计,可以在模块的PreInitialize方法中使用Configuration.Auditing属性。审计是默认开启的。可以像下面那样关闭它:

public class MyModule : AbpModule
{
    public override void PreInitialize()
    {
        Configuration.Auditing.IsEnabled = false;
    }

    //...
}

这儿是审计配置属性的列表:

  • IsEnabled:用于完全开启或关闭审计系统。默认为true。
  • IsEnabledForAnonymousUsers:如果此值为true,那么没有登录到系统的用户的审计日志也会保存。默认为false。
  • MvcControllers:用于为ASP.NET MVC控制器配置审计。
    • IsEnabled:用于为MVC控制器开启或关闭审计。默认为true
    • IsEnabledForChildActions:用于为子MVC action开启或关闭审计。默认为false。
  • Selectors:用于选择其他的类保存审计日志。

可以看到,对于MVC控制器的审计是单独配置的,因为它用到了不同的技术。

Selectors是选择其他的类型来保存审计日志的谓词列表。一个选择器有一个唯一的名字和一个谓词。这个列表中唯一的默认选择器用于选择应用服务类。它是如下定义的:

Configuration.Auditing.Selectors.Add(
    new NamedTypeSelector(
        "Abp.ApplicationServices",
        type => typeof (IApplicationService).IsAssignableFrom(type)
    )
);

你可以将你的选择器添加到模块的PreInitialize方法中。而且,如果你不喜欢为应用服务保存审计日志,那么你可以通过名称移除选择器。那就是为什么要有一个唯一名称的原因(使用简单的linq找出该选择器,然后可以移除它)。

通过特性开启/关闭

虽然可以通过配置选择审计类,但是也可以为一个单独的类或方法使用Audited和 DisableAuditing特性。举个例子:

[Audited]
public class MyClass
{
    public void MyMethod1(int a)
    {
        //...
    }

    [DisableAuditing]
    public void MyMethod2(string b)
    {
        //...
    }

    public void MyMethod3(int a, int b)
    {
        //...
    }
}

除了MyMethod2方法之外,MyClass的所有方法都参与审计了,因为MyMethod2显式关闭了。审计特性可以用于想要参与审计的方法保存审计日志。

注意

  • 为了保存审计日志,方法必须是public的。私有的和受保护的方法会被忽略。
  • 如果方法是通过类的引用调用的,那么该方法必须是virtual的。因为ABP使用了动态代理和拦截,所以需要满足该条件。如果使用了接口(比如注入IPersonService接口使用PersonService类)注入,就不必满足“virtual”的条件了。对于MVC控制器的action不一定要满足,它们可以不是“virtual”的。

我项目中的例子

下面的代码是点击登录按钮提交表单数据的action方法:

[HttpPost]
[UnitOfWork]
[DisableAuditing]
public virtual async Task<JsonResult> Login(LoginViewModel loginModel, string returnUrl = "")
{
    CheckModelState();

    _unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant);
    var loginResult = await GetLoginResultAsync(
        loginModel.UsernameOrEmailAddress,
        loginModel.Password,
        loginModel.TenancyName
        );
    await SignInAsync(loginResult.User, loginResult.Identity, loginModel.RememberMe);

    if (string.IsNullOrWhiteSpace(returnUrl))
    {
        returnUrl = Request.ApplicationPath;
    }
    return Json(new MvcAjaxResponse { TargetUrl = returnUrl });
}

下面的截图是数据库中的审计日志信息,大家可以看到今天还没有数据,最晚的数据是2015-12-18的数据:

登录系统之后,依然没有记录审计日志,下面统一截图。

下面我将上面的代码的特性[DisableAuditing]去掉,再次登录系统,可以看到有了审计记录,截图如下:

分别按序号解释一下:

  1. 首次到达登录页面;
  2. 登录成功,到达系统首页Index;
  3. 去掉[DisableAuditing]特性后,到达登陆页面;
  4. 将数据post提交到Login方法,记录了审计日志,包含各种登录参数;
  5. 登录成功,返回系统首页Index。

从我的例子可以很明显地看出,默认情况下,ABP会自动记录所有的控制器,除非你给它加上[DisableAuditing]特性,否则,始终会记录审计日志。






本文转自tkbSimplest博客园博客,原文链接:http://www.cnblogs.com/farb/p/ABPAuditLog.html,如需转载请自行联系原作者

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
1月前
|
开发框架 前端开发 .NET
Abp源码分析之Serilog日志
本文介绍了如何在ASP.NET Core MVC项目和ABP框架中配置和使用Serilog日志库。通过修改`Program.cs`文件,配置日志级别、输出目标,并在控制器和页面模型中记录日志。具体步骤包括新建MVC项目、配置日志、修改控制器和首页代码。最终,日志将被记录到控制台和`Logs/logs.txt`文件中。
38 1
Abp源码分析之Serilog日志
|
2月前
|
Arthas 监控 Java
JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)、Arthas
这篇文章全面介绍了JVM的命令行参数、GC日志分析以及性能调优的各个方面,包括监控工具使用和实际案例分析。
60 3
|
2月前
|
存储 Prometheus NoSQL
大数据-44 Redis 慢查询日志 监视器 慢查询测试学习
大数据-44 Redis 慢查询日志 监视器 慢查询测试学习
28 3
|
2月前
|
数据采集 监控 Java
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......
本文是关于SpringBoot日志的详细教程,涵盖日志的定义、用途、SLF4J框架的使用、日志级别、持久化、文件分割及格式配置等内容。
188 0
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......
|
3月前
|
Kubernetes API Docker
跟着iLogtail学习容器运行时与K8s下日志采集方案
iLogtail 作为开源可观测数据采集器,对 Kubernetes 环境下日志采集有着非常好的支持,本文跟随 iLogtail 的脚步,了解容器运行时与 K8s 下日志数据采集原理。
|
2月前
|
Python
log日志学习
【10月更文挑战第9天】 python处理log打印模块log的使用和介绍
39 0
|
4月前
|
Java 数据库连接 数据库
后端框架的学习----mybatis框架(6、日志)
这篇文章介绍了如何在MyBatis框架中使用日志功能,包括配置MyBatis的日志实现、使用log4j作为日志工具,以及如何通过配置文件控制日志级别和输出格式。
|
4月前
|
监控 安全 Linux
在Linux中,如何查看和审计系统日志文件以检测异常活动?
在Linux中,如何查看和审计系统日志文件以检测异常活动?
|
1月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
226 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
2月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
281 3