ABP理论学习之日志记录

简介:

本篇目录

服务端

ABP使用的是Castle Windsor的日志记录设备。它可以和不同的日志类库一起工作,比如Log4Net,NLog,Serilog等等。Castle为所有的日志类库提供了一个公共的接口。因此,你完全独立于特定的日志记录类库,而且,如果需要的话,你可以轻松地改变应用程序的日志类库。

Log4Net是.Net中最流行的日志类库之一。ABP模板中自带了经过合适配置的Log4Net。但是,只存在一行log4net的依赖(看下面),因此,你可以将它改为你最喜欢的类库。

获取Logger

无论你选择了什么日志类库,最终要记录的日志代码都是相同的(这得感谢Castle公共的ILogger接口)。

一开始,我们要处理一下记录日志的Logger对象。因为ABP强烈推荐使用依赖注入,所以我们可以使用属性注入模式轻松地注入一个Logger对象。如下所示:

using Castle.Core.Logging; //1: 导入 Logging 命名空间

public class TaskAppService : ITaskAppService
{    
    //2: 使用属性注入获得 logger
    public ILogger Logger { get; set; }
    
    public TaskAppService()
    {
        //3: 如果没有提供Logger,就不能记录日志
        Logger = NullLogger.Instance;
    }

    public void CreateTask(CreateTaskInput input)
    {
        //4: 记录日志
        Logger.Info("Creating a new task with description: " + input.Description);

        //TODO: 保存到数据库...
    }
}
  1. 导入Castle的ILogger接口的命名空间。
  2. 定义一个公有的叫做Logger的ILogger对象。这是记录日志的对象。创建TaskAppService对象之后,依赖注入系统会设置(注入)这个属性。这就是所谓的属性注入模式。
  3. 将Logger设置为NullLogger.Instance。即使没有这行代码,系统也会工作地很好。但是这是属性注入模式的最佳实践。如果没给Logger设置任何值,那么当我们使用它的时候会因为它是null而抛出“空指针”异常。这个保证了它不为null。因此,如果没有给Logger设置值,那么它是NullLogger。这就是所谓的null对象模式。NullLogger实际上什么都没做,也没有记录任何日志。因此,我们的类要不要一个实际的logger都能工作。
  4. 最后,我们记录了一个info等级的日志文本。存在多种不同的等级(看下面)。

如果我们调用了CreateTask方法,并检查日志文件,就会看到像下面一样的一长行字符串。

INFO  2014-07-13 13:40:23,360 [8    ] SimpleTaskSystem.Tasks.TaskAppService    - Creating a new task with description: Remember to drink milk before sleeping!

基类中的Logger

ABP为MVC控制器,Web API控制器和应用服务类提供了基类。比如,Web层对应的基类是XXXControllerBase(后缀为ControllerBase)。这些基类中都声明了Logger属性。因此你可以直接使用Logger来记录日志,无需注入。例子:

public class HomeController : SimpleTaskSystemControllerBase
{
    public ActionResult Index()
    { 
        Logger.Debug("A sample log message...");
        return View();
    }
}

注意,SimpleTaskSystemControllerBase是继承了AbpController的应用基类控制器。因此,可以在控制器中直接使用Logger。Logger也存在于Web Api控制器的AbpApiController基类,以及应用服务层的基类(后缀为AppServiceBase的类)。你也可以为其他的类编写自己的公共基类,这样,你就不需要每次注入logger了。

配置

当你从ABP模板创建应用程序时,Log4Net的所有配置已经完成了。

默认的日志格式配置如下:

  • 日志级别:DEBUG, INFO, WARN, ERROR或者FATAL。
  • 日期和时间:记录日志的时间。
  • 线程号:记录日志的线程号码。
  • Logger名称:通常是记录日志的类名。
  • 日志文本:实际记录的日志文本。

配置定义在应用的log4net.config文件中,如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<log4net>
  <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender" >
    <file value="Logs/Logs.txt" />
    <appendToFile value="true" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="10" />
    <maximumFileSize value="10000KB" />
    <staticLogFileName value="true" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%-5level %date [%-5.5thread] %-40.40logger - %message%newline" />
    </layout>
  </appender>
  <root>
    <appender-ref ref="RollingFileAppender" />
    <level value="DEBUG" />
  </root>
  <logger name="NHibernate">
    <level value="WARN" />
  </logger>
</log4net>

Log4Net是高度可配置的、健壮的日志记录类库。你可以使用不同的格式将日志记录到不同的目标上(文本文件,数据库等)。你也可以设置最小日志等级(正如此配置中为NHibernate配置的那样)。你也可以记录不同的日志到不同的文件中。当到达一个指定的大小时,它会自动备份并创建一个新的日志文件等等(本例中,滚动文件适配器的每个文件大小是10MB)。为了更好配置你的log4net,请查看官方文档

最后,我们在Global.asax文件中,声明了要使用log4net.config文件中的Log4Net。

public class MvcApplication : AbpWebApplication
{
    protected override void Application_Start(object sender, EventArgs e)
    {
        IocManager.Instance.IocContainer.AddFacility<LoggingFacility>(f => f.UseLog4Net().WithConfig("log4net.config"));
        base.Application_Start(sender, e);
    }
}

这是我们直接依赖log4net的唯一代码行。而且,只有web项目依赖log4net类库的nuget包。因此,你可以轻松地切换到其他日志类库,而且不需要改变记录日志的代码。

客户端

ABP为客户端定义了一个javascript日志记录API。默认会将日志记录到浏览器的控制台。记录日志的javascript代码样例如下:

abp.log.warn('a sample log message...');

要查看javascript记录日志的代码,请留意后面的博客。




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

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
3月前
|
存储 Go
Go 浅析主流日志库:从设计层学习如何集成日志轮转与切割功能
本文将探讨几个热门的 go 日志库如 logrus、zap 和官网的 slog,我将分析这些库的的关键设计元素,探讨它们是如何支持日志轮转与切割功能的配置。
101 0
Go 浅析主流日志库:从设计层学习如何集成日志轮转与切割功能
|
4月前
|
Kubernetes 容器
k8s学习-CKS真题-日志审计 log audit
k8s学习-CKS真题-日志审计 log audit
76 0
|
4月前
|
存储 缓存 关系型数据库
认真学习MySQL的事务日志-Redo日志
认真学习MySQL的事务日志-Redo日志
44 0
|
4月前
|
存储 监控 数据可视化
小白带你学习linux的ELK日志收集系统
小白带你学习linux的ELK日志收集系统
160 0
|
7月前
|
关系型数据库 物联网 PostgreSQL
沉浸式学习PostgreSQL|PolarDB 11: 物联网(IoT)、监控系统、应用日志、用户行为记录等场景 - 时序数据高吞吐存取分析
物联网场景, 通常有大量的传感器(例如水质监控、气象监测、新能源汽车上的大量传感器)不断探测最新数据并上报到数据库. 监控系统, 通常也会有采集程序不断的读取被监控指标(例如CPU、网络数据包转发、磁盘的IOPS和BW占用情况、内存的使用率等等), 同时将监控数据上报到数据库. 应用日志、用户行为日志, 也就有同样的特征, 不断产生并上报到数据库. 以上数据具有时序特征, 对数据库的关键能力要求如下: 数据高速写入 高速按时间区间读取和分析, 目的是发现异常, 分析规律. 尽量节省存储空间
607 1
|
4月前
|
Kubernetes 监控 容器
k8s学习-CKA真题-监控Pod日志
k8s学习-CKA真题-监控Pod日志
78 0
|
6月前
|
Java 测试技术 Docker
Spring Boot 学习研究笔记(十九)-docker部署SpringBoot 日志目录挂载
Spring Boot 学习研究笔记(十九)-docker部署SpringBoot 日志目录挂载
264 0
|
1天前
|
监控 Docker 容器
Docker从入门到精通:Docker log 命令学习
了解 Docker 日志管理对容器监控至关重要。`docker logs` 命令用于查看和管理容器日志,例如,`docker logs &lt;container_name&gt;` 显示容器日志,`-f` 或 `--follow` 实时跟踪日志,`--tail` 显示指定行数,`--timestamps` 添加时间戳,`--since` 按日期筛选。Docker 支持多种日志驱动,如 `syslog`,可通过 `--log-driver` 配置。有效管理日志能提升应用程序的稳定性和可维护性。
4 0
|
2月前
|
SQL 关系型数据库 MySQL
MySQL技能完整学习列表11、日志和备份——1、查看日志——2、数据备份和恢复(mysqldump, mysqlbinlog)
MySQL技能完整学习列表11、日志和备份——1、查看日志——2、数据备份和恢复(mysqldump, mysqlbinlog)
45 0
|
4月前
|
SQL 存储 关系型数据库
认真学习MySQL中的二进制日志(binlog)与中继日志(Relay log)
认真学习MySQL中的二进制日志(binlog)与中继日志(Relay log)
104 0

热门文章

最新文章