日志框架:聊聊记日志的最佳姿势

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 相信开发过大型系统的同学们都知道,日志在系统中有着举足轻重的位置,一方面,通过日志系统可以记录具体的业务流程以便完成业务追踪,另一方面,当系统出现异常时,通过日志可以快速的定位问题。在平时的开发中,相信大家都用过记录日志到文件以及使用老牌日志框架log4net等,特别是在网站开发过程中,很多都集成log4net来进行日志记录。那么在Netcore中有哪些日志记录的方式呢?从本节开始,我们就一块来看一下吧。

NETCore 支持适用于各种内置和第三方日志记录提供程序的日志记录 API。

我们都知道,Netcore为我们提供了丰富的扩展库,涉及记录输出日志到不同的地方以及对不同的需求分别控制其日志级别。下面我们来看看如何将日志记录 API 与内置提供程序一起使用。


依赖包


Netcore提供了丰富的扩展来支持日志的不同输出需求

  • Microsoft.Extensions.Logging
  • Microsoft.Extensions.Logging.Abstractions
  • Microsoft.Extensions.Logging.Console
  • Microsoft.Extensions.Logging.Debug
  • Microsoft.Extensions.Logging.TraceSource

日志级别定义


每个日志都指定了一个 LogLevel 值。 日志级别指示严重性或重要程度。

public enum LogLevel:Enum
{
    Trace,//跟踪 = 0
    Debug,//调试 = 1
    Information,//信息 = 2
    Warning,//警告 = 3
    Error,//错误 = 4
    Critical,//严重 = 5
    None//禁止显示所有日志=6
}


一般的,使用日志级别控制写入到特定存储介质或显示窗口的日志输出量。

例如:


生产中:

  • 如果通过 Information 级别在 Trace 处记录,则会生成大量详细的日志消息。 为控制成本且不超过数据存储限制,请通过 Information 级别消息将 Trace 记录到容量大、成本低的数据存储中。
  • 如果通过 Critical 级别在 Warning 处记录,通常生成的日志消息更少且更小。 因此,成本和存储限制通常不是问题,而这使得在选择数据信息时更为灵活。

在开发过程中:

  • 通过 Critical 消息将 Warning 记录到控制台。
  • 在疑难解答时通过 Information 消息添加 Trace。


代码演示

若要创建日志,请使用 ILogger<TCategoryName> 对象。 在 Web 应用或托管服务中,由依赖关系注入 (DI) 获取 ILogger。 在非主机控制台应用中,使用 LoggerFactory 来创建 ILogger。


我们先来看一下使用LoggerFactory创建ILogger的方式。

{
    ServiceProvider serviceProvider = serviceDescriptors.BuildServiceProvider();
    //创建指定名称的logger
    ILoggerFactory loggerFactory = serviceProvider.GetService<ILoggerFactory>();
    ILogger logger = loggerFactory.CreateLogger("alogger");
    logger.LogTrace("trace");
    logger.LogDebug("debug");
    logger.LogInformation("information");
    logger.LogWarning("warning");
}


从以上代码中,我们可以看到,首先,我们需要通过服务提供者Service-Provider的GetService方法来获取一个ILoggerFactory对象,接着可通过该对象来创建指定名称的日志记录器。


我们再来看一下如何通过DI获取ILogger。

我们可以先看一下以下代码,该代码是默认的aspnetcore网站的默认控制器中的代码

private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
    _logger = logger;
}


通过以上方式,即可获取到对应控制器的日志对象并进行日志操作,其实,这里就是使用的依赖注入框架来获取ILogger的。

那么同样的,在当前的控制台程序内,我们可以通过以下语句来获取日志对象。

ServiceProvider serviceProvider = serviceDescriptors.BuildServiceProvider();
ILogger logger = serviceProvider.GetService<ILogger<Program>>();


是不是很简单呢?不过需要注意一下,这里是生成主机后从 DI 获取 ILogger实例,但并不直接支持在主机构造期间进行日志记录。 但是,可以使用单独的记录器。换句话说,就是可以在CreateHostBuilder函数中进行配置。


了解完日志记录的2种方式,那我们在平常使用时,一般推荐哪种方式呢?我们比较推荐第二种,即通过依赖注入框架获取的方式,毕竟asp.net core自身也是如此使用的,这方式的好处是在服务中直接定义ILogger,这样日志对象的命名是确定的,是命名空间+类名的方式,并且可在操作服务时直接操作日志。

比如,我们先来生成一个服务。

public class OrderService
{
    ILogger<OrderService> logger;
    public OrderService(ILogger<OrderService> logger)
    {
        this.logger = logger;
    }
    public void PrintLog()
    {
        logger.LogDebug(" Debug: Time now:{time}",DateTime.Now.ToString());
        logger.LogInformation(" info: Time now:{time}",DateTime.Now.ToString());
    }
}


接着,在startup的Configure方法内或Program的main方法里通过以下方式即可获取

serviceDescriptors.AddScoped<OrderService>();
ServiceProvider serviceProvider = serviceDescriptors.BuildServiceProvider();
OrderService orderService = serviceProvider.GetService<OrderService>();
orderService.PrintLog();


最后,我们再来看一种情况,就是通过配置来定义日志的输出级别,我们都知道,通过配置框架可以控制程序运行的一些特殊需求,那么针对不同的日志打印需求,我们同样可以通过日志框架来进行控制。

如我们的setting.json文件如下

{
  "logging": {
    "loglevel": {
      "Default": "information"
    },
    "Console": {
      "loglevel": {
        "Default": "None",
        "_11_LoggingSimpleDemo.Program": "Trace",
        "_11_LoggingSimpleDemo.OrderService": "Trace",
        "aLogger": "Trace"
      }
    }
  }
}


那么,在使用时可以通过如下方式来进行级别配置。

IConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
configurationBuilder.AddJsonFile("settings.json");
IConfigurationRoot configurationRoot = configurationBuilder.Build();
IServiceCollection serviceDescriptors = new ServiceCollection();
serviceDescriptors.AddSingleton<IConfiguration>(p => configurationRoot);
serviceDescriptors.AddLogging(configure =>
{
    configure.AddConfiguration(configurationRoot.GetSection("Logging"));
    configure.AddConsole();//这里如果要在配置文件中定义level,那么,节的名称必须是”Console“,区分大小写的,否则不生效
});


好了,到这里的话,本节就先告一段落了,我们本节主要学习了日志框架的使用方式,包括日志级别定义、日志对象获取的方式以及通过logger名称进行日志过滤的配置逻辑等。


下一节,我们将学习日志作用域以及第三方日志框架serilog的内容。


详细代码请参


https://github.com/IronMarmot/Samples/tree/master/CoreSamples


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
280 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
2月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
315 3
|
2月前
|
Java 程序员 API
Android|集成 slf4j + logback 作为日志框架
做个简单改造,统一 Android APP 和 Java 后端项目打印日志的体验。
130 1
|
3月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
52 2
|
2月前
|
SQL XML 监控
SpringBoot框架日志详解
本文详细介绍了日志系统的重要性及其在不同环境下的配置方法。日志用于记录系统运行时的问题,确保服务的可靠性。文章解释了各种日志级别(如 info、warn、error 等)的作用,并介绍了常用的日志框架如 SLF4J 和 Logback。此外,还说明了如何在 SpringBoot 中配置日志输出路径及日志级别,包括控制台输出与文件输出的具体设置方法。通过这些配置,开发者能够更好地管理和调试应用程序。
|
3月前
|
Java
日志框架log4j打印异常堆栈信息携带traceId,方便接口异常排查
日常项目运行日志,异常栈打印是不带traceId,导致排查问题查找异常栈很麻烦。
|
3月前
|
运维 NoSQL Java
SpringBoot接入轻量级分布式日志框架GrayLog技术分享
在当今的软件开发环境中,日志管理扮演着至关重要的角色,尤其是在微服务架构下,分布式日志的统一收集、分析和展示成为了开发者和运维人员必须面对的问题。GrayLog作为一个轻量级的分布式日志框架,以其简洁、高效和易部署的特性,逐渐受到广大开发者的青睐。本文将详细介绍如何在SpringBoot项目中接入GrayLog,以实现日志的集中管理和分析。
288 1
|
4月前
|
XML Java Maven
Spring5入门到实战------16、Spring5新功能 --整合日志框架(Log4j2)
这篇文章是Spring5框架的入门到实战教程,介绍了Spring5的新功能——整合日志框架Log4j2,包括Spring5对日志框架的通用封装、如何在项目中引入Log4j2、编写Log4j2的XML配置文件,并通过测试类展示了如何使用Log4j2进行日志记录。
Spring5入门到实战------16、Spring5新功能 --整合日志框架(Log4j2)
|
4月前
|
Java 数据库连接 数据库
后端框架的学习----mybatis框架(6、日志)
这篇文章介绍了如何在MyBatis框架中使用日志功能,包括配置MyBatis的日志实现、使用log4j作为日志工具,以及如何通过配置文件控制日志级别和输出格式。
|
4月前
|
存储 缓存 监控
【嵌入式SD NAND】基于FATFS/Littlefs文件系统的日志框架实现
综上所述,构建一个基于FATFS/Littlefs文件系统的日志框架需要对文件系统的操作有深入理解,并以此为基础设计一套完整的日志处理机制。这样的框架不仅能够确保日志数据的完整性和系统的鲁棒性,同时还能够满足嵌入式系统对于性能和资源使用的严格要求。
173 4
下一篇
DataWorks