当前位置: 首页 > news >正文

.NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例

在本文中,我们将详细介绍.NET Core日志内容,包括不同日志级别的区别,以及一些常用的日志记录实用工具和第三方库。同时,我们还将通过示例来展示如何使用这些工具和库。

一、.NET Core日志级别

.NET Core日志系统提供了五种日志级别,分别如下:

  1. Trace:跟踪级别用于详细诊断信息,通常只在诊断问题时启用。
  2. Debug:调试级别用于应用程序的调试信息,通常在开发过程中使用。
  3. Information:信息级别用于常规信息性消息,表示应用程序运行正常。
  4. Warning:警告级别用于表示某些意外事件的提示,但是应用程序仍然可以正常运行。
  5. Error:错误级别用于表示应用程序中的错误,导致应用程序无法正常运行。
  6. Critical:关键级别用于表示严重错误,可能导致应用程序崩溃。

在.NET Core中,可以通过配置日志级别来控制输出哪些级别的日志信息。以下是一个简单的示例,演示如何配置和使用.NET Core的日志记录系统。
首先,创建一个新的.NET Core Web API项目。在项目目录中,打开appsettings.json文件,添加以下日志配置:

{"Logging": {"LogLevel": {"Microsoft": "Warning","System": "Warning","MyApp": "Information"}}
}

在这个配置中,我们设置了三个日志级别:

  • 对于Microsoft和System命名空间,日志级别设置为Warning。
  • 对于MyApp命名空间,日志级别设置为Information。
    接下来,创建一个简单的日志记录器类,用于输出日志信息。在项目中添加一个新的类LoggingService.cs,内容如下:
using Microsoft.Extensions.Logging;
using System;
public class LoggingService : ILogger<LoggingService>
{public IDisposable BeginScope<TState>(TState state){return null;}public bool IsEnabled(LogLevel logLevel){return true;}public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter){if (logLevel >= LogLevel.Information){Console.WriteLine($"{logLevel}: {formatter(state, exception)}");}}
}

在这个类中,我们重写了ILogger接口的方法,以实现日志记录的功能。
现在,我们可以在应用程序中使用这个日志记录器。首先,需要在Startup.cs文件中注册日志记录器:

public void ConfigureServices(IServiceCollection services)
{services.AddSingleton<ILogger<LoggingService>>(sp =>new LoggingService());
}

接下来,在控制器中使用这个日志记录器输出不同级别的日志信息:

[ApiController]
[Route("[controller]")]
public class ValuesController : ControllerBase
{private readonly ILogger<ValuesController> _logger;public ValuesController(ILogger<ValuesController> logger){_logger = logger;}[HttpGet]public IEnumerable<string> Get(){_logger.LogVerbose("Verbose log message");_logger.LogDebug("Debug log message");_logger.LogInformation("Information log message");_logger.LogWarning("Warning log message");_logger.LogError("Error log message");_logger.LogCritical("Critical log message");return new string[] { "value1", "value2" };}
}

在这个示例中,我们创建了一个ValuesController控制器,其中包含了多个不同的HTTP GET方法。在每个方法中,我们使用_logger对象输出了不同级别的日志信息。根据我们之前的配置,Verbose和Debug级别的日志信息将不会输出,因为它们的级别低于配置的Warning级别。

运行应用程序,访问http://localhost:5000/values,你可以在控制台中看到输出的日志信息。其中,只有Information、Warning、Error和Critical级别的日志信息会被输出。
通过使用了几个不同的日志级别,包括LogDebug(调试级别,通常不会在生产环境中显示)、LogInformation(信息级别)、LogWarning(警告级别)、LogError(错误级别)和LogCritical(严重级别)输出不同等级日志信息。

注意,LogDebug调用实际上不会输出任何内容,因为我们没有在配置中启用调试日志。在生产环境中,通常不会启用调试日志,因为它们可能会包含敏感信息。

二、日志记录实用工具

2.1Serilog

Serilog是一个高度可配置的日志记录库,用于替代内置的日志记录系统。它提供了丰富的功能,如日志旋转、输出到不同的目的地(控制台、文件、数据库等)、结构化日志等。
安装Serilog

dotnet add package Serilog

示例:

public class Program
{public static void Main(string[] args){Log.Logger = new LoggerConfiguration().Enrich.FromLogContext().WriteTo.Console(outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}").CreateLogger();try{Log.Information("Starting application");// 业务逻辑}catch (Exception ex){Log.Error(ex, "An error occurred");}Log.CloseAndFlush();}
}

2.2 Log4Net

Log4Net是另一个常用的日志记录工具,它基于Apache Log4j2。Log4Net提供了丰富的配置选项,如日志源、日志应用ender、日志过滤器等。
安装Log4Net:

dotnet add package log4net

示例:

public class Program
{private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);public static void Main(string[] args){log.Info("Starting application");// 业务逻辑log.Error("An error occurred");}
}

三、第三方库

3.1 ELK Stack

ELK Stack是由Elasticsearch、Logstash和Kibana组成的日志聚合平台。通过使用ELK Stack,可以将日志数据索引到Elasticsearch中,并通过Kibana进行可视化展示。
安装ELK Stack:

  • Elasticsearch:dotnet add package Elasticsearch.Net
  • Logstash:使用Logstash管道处理日志数据,并将数据发送到Elasticsearch。
  • Kibana:使用Kibana进行日志数据的可视化展示。
    示例:
using Elasticsearch.Net;
public class Program
{public static void Main(string[] args){var settings = new ConnectionSettings(new Uri("http://localhost:9200")));var client = new ElasticClient(settings);var log = new LoggerConfiguration().Enrich.FromLogContext().WriteTo.Elasticsearch(client, new ElasticsearchSinkOptions(){IndexFormat = "logstash-{0:yyyy.MM.dd}"}).CreateLogger();Log.Information("Starting application");// 业务逻辑Log.Error("An error occurred");}
}

3.2 MySQL、SQL Server等数据库

除了ELK Stack,你还可以将日志存储到MySQL、SQL Server等数据库中。这通常需要使用第三方库,如MySqlConnector、Microsoft.EntityFrameworkCore等。
安装MySqlConnector:

dotnet add package MySqlConnector

示例:

using MySql.Data.MySqlClient;public class Program
{private readonly ILogger _logger;public Program(){var connectionString = "your_connection_string_here";var options = new MySqlSinkOptions{TableName = "Logs",ColumnOptions = new Dictionary<string, ColumnOptions>{{ "Level", new ColumnOptions { IsNullable = false } },{ "Message", new ColumnOptions { IsNullable = false } },{ "Exception", new ColumnOptions { IsNullable = true } },{ "Source", new ColumnOptions { IsNullable = false } },{ "Scope", new ColumnOptions { IsNullable = true } },{ "Timestamp", new ColumnOptions{DataType = "DATETIME",IsNullable = false}}}};_logger = new LoggerConfiguration().Enrich.FromLogContext().WriteTo.MySql(connectionString, options).CreateLogger();}public void Main(){try{_logger.Information("Starting application");// 业务逻辑}catch (Exception ex){_logger.Error(ex, "An error occurred");}}
}

在这个示例中,我们使用了Serilog的WriteTo.MySql扩展方法来配置日志输出到MySQL数据库。我们为日志表定义了列和数据类型,并指定了列是否可以为空。

四、总结

本文详细介绍了.NET Core日志级别,以及如何使用一些常用的日志记录实用工具和第三方库,如Serilog、Log4Net、ELK Stack和MySQL。通过这些工具和库,你可以更加灵活地记录、存储和分析应用程序的日志,从而提高应用程序的可靠性和可维护性。希望本文能对你有所帮助!

相关文章:

  • 通过vue ui创建项目
  • IntelliJ IDEA 下载安装及配置使用教程
  • C#中的线程以及[STAThread]、COM(Component Object Model)
  • 985硕的4家大厂实习与校招经历专题分享(part1)
  • ChatGPT提问技巧——控制温度和TOP-P样本
  • 2024年 Python面试热点
  • Python实现选择排序算法
  • Java方法重载
  • 基于Spring Boot + Vue的信息化在线教学平台
  • 爬虫学习笔记-requests爬取NBA得分榜
  • 2023年甘肃省职业院校技能大赛高职组“信息安全管理与评估”(赛项样卷A)
  • 计算机基础专升本笔记-汇总笔记(一)常考特征、特性、属性
  • Spring基础——方法注入(Method Injection)
  • Qt如何将视频获取单帧
  • java实现pdf转word
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • ➹使用webpack配置多页面应用(MPA)
  • DataBase in Android
  • Fabric架构演变之路
  • github从入门到放弃(1)
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • javascript从右向左截取指定位数字符的3种方法
  • JS数组方法汇总
  • js中forEach回调同异步问题
  • LeetCode算法系列_0891_子序列宽度之和
  • mockjs让前端开发独立于后端
  • 从tcpdump抓包看TCP/IP协议
  • 从零开始学习部署
  • 构造函数(constructor)与原型链(prototype)关系
  • 离散点最小(凸)包围边界查找
  • 前端工程化(Gulp、Webpack)-webpack
  • 前端性能优化--懒加载和预加载
  • 温故知新之javascript面向对象
  • 我感觉这是史上最牛的防sql注入方法类
  • 学习ES6 变量的解构赋值
  • 与 ConTeXt MkIV 官方文档的接驳
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​Python 3 新特性:类型注解
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​你们这样子,耽误我的工作进度怎么办?
  • # 数论-逆元
  • $.ajax()参数及用法
  • (LeetCode 49)Anagrams
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (三)Honghu Cloud云架构一定时调度平台
  • (五)IO流之ByteArrayInput/OutputStream
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .NET 4.0中的泛型协变和反变
  • .NET 5种线程安全集合
  • .net CHARTING图表控件下载地址