.NET Core 日志记录程序和常用日志记录框架

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 本文主要内容为.NET Core的日志记录程序和常使用的日志记录框架的简单使用首先,打开VS2019新建一个ASP.NET Core Web Api项目,项目创建好后会有一个集成好的天气预报的类和控制器,接下来,我们的方法就在天气控制器里完成。

本文主要内容为.NET Core的日志记录程序和常使用的日志记录框架的简单使用

首先,打开VS2019新建一个ASP.NET Core Web Api项目,项目创建好后会有一个集成好的天气预报的类和控制器,接下来,我们的方法就在天气控制器里完成。

image.gif

1、配置提供程序替换默认提供程序

在启动项中添加Log配置替换默认的日志提供程序,在控制器中编写具体输出内容

1)Program.cs

public static IHostBuilder CreateHostBuilder(string[] args) => 
    Host.CreateDefaultBuilder(args).ConfigureLogging(logging => // 添加提供程序(通用主机)
    {
        logging.ClearProviders(); // 去掉默认添加的日志提供程序
        logging.AddConsole();
        logging.AddDebug();
        logging.AddEventSourceLogger();
        logging.AddEventLog();
    }).ConfigureWebHostDefaults(webBuilder =>
    {
    webBuilder.UseStartup < Startup > ();
    });

image.gif

2)控制器

[ApiController]
[Route("[controller]/[action]")]
public class WeatherForecastController: ControllerBase
{
    private readonly ILogger <WeatherForecastController> _logger;
    public WeatherForecastController(ILogger <WeatherForecastController> logger)
    {
        _logger = logger;
    }
    /// <summary>
    /// 获取日志输出 - 通用主机
    /// </summary>
    [HttpGet]
    public void GetLogOutUniversalHost()
    {
        // 内置日志
        _logger.LogTrace(1000, "log Trace msg");
        _logger.LogDebug(1001, "log Debug msg");
        _logger.LogInformation(1002, "log Information msg");
        _logger.LogWarning(1003, "log Warning msg");
        _logger.LogError(1004, "log Error msg");
        _logger.LogCritical(1005, "log Critical msg");
    }
}

image.gif

3)运行结果

image.gif

2、创建LoggerFactory时调用提供程序的扩展方法

直接在控制器中创建LoggerFactory时调用提供程序的Add方法,使用LoggerFactory来创建 ILogger

1)控制器

[ApiController]
[Route("[controller]/[action]")]
public class WeatherForecastController: ControllerBase
{
    /// <summary>
    /// 获取日志输出 - 非主机
    /// </summary>
    [HttpGet]
    public void GetLogOutNonHost()
    {
        var loggerFactory = LoggerFactory.Create(builder =>
        {
            builder.AddFilter("Microsoft", LogLevel.Warning).AddFilter("System", LogLevel.Warning).AddFilter("LoggingConsoleApp.Program", LogLevel.Debug).AddConsole().AddEventLog();
        });
        ILogger logger = loggerFactory.CreateLogger<Program>();
        logger.LogInformation("非主机模式输出log msg");
    }
}

image.gif

2)运行结果

image.gif

3、 Log4Net

1)使用NuGet安装log4net包

image.gif编辑

2)新建log4net.config配置文件,配置日志输出格式

image.gif

3)右键新添加的log4net.config配置文件,更改文件属性->复制到输出目录选项:始终复制

image.gif

或者在项目的.csproj文件添加如下代码:

<ItemGroup>
    <Content Update="log4net.config">
        <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
</ItemGroup>

image.gif

4)log4net.config配置文件内容

<?xml version="1.0"?>
<configuration>
    <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
    </configSections>
    <appSettings>
        <add key="WebSocketPort" value="45154" />
    </appSettings>
    <log4net>
        <!--指定日记记录方式,以滚动文件的方式(文件记录)-->
        <appender name="logInfoToFile" type="log4net.Appender.RollingFileAppender,log4net">
            <!--日志路径-->
            <file value="logs/log4net/info"/>
            <!--是否是向文件中追加日志-->
            <AppendToFile value="true"/>
            <!--日志根据日期滚动-->
            <RollingStyle value="Date"/>
            <!--日志文件名格式为:info.2021-12-30.txt-->
            <DatePattern value="'.'yyyy-MM-dd'.txt'"/>
            <!--日志文件名是否是固定不变的-->
            <StaticLogFileName value="false"/>
            <!--布局-->
            <layout type="log4net.Layout.PatternLayout,log4net">
                <ConversionPattern value="%d %-5p [%c] %m%n"/>
            </layout>
        </appender>
        <appender name="logErrorToFile" type="log4net.Appender.RollingFileAppender,log4net">
            <file value="logs/log4net/error"/>
            <AppendToFile value="true"/>
            <RollingStyle value="Date"/>
            <!--日志文件名格式为:error.2021-12-30.txt-->
            <DatePattern value="'.'yyyy-MM-dd'.txt'"/>
            <StaticLogFileName value="false"/>
            <layout type="log4net.Layout.PatternLayout,log4net">
                <ConversionPattern value="%d %-5p [%c] %m%n"/>
            </layout>
        </appender>
        <!-- 根(父)logger -->
        <root>
            <!-- 支持级别:ALL -->
            <level value="ALL" additivity="false"/>
            <!-- ALL, DEBUG, INFO, WARN, ERROR, FATAL, OFF-->
            <!-- 支持的appender名称:logInfoToFile -->
            <appender-ref ref="logInfoToFile"/>
        </root>
        <!-- logger名称为ApplicationInfoLog,阻止父logger中的appender -->
        <logger name="ApplicationInfoLog" additivity="false">
            <!-- 支持级别:ALL -->
            <level value="ALL"/>
            <!-- 支持的appender名称:logInfoToFile -->
            <appender-ref ref="logInfoToFile"/>
        </logger>
        <logger name="ApplicationErrorLog" additivity="false">
            <!-- 支持级别:ALL -->
            <level value="ALL"/>
            <!-- 支持的appender名称:logErrorToFile -->
            <appender-ref ref="logErrorToFile"/>
        </logger>
    </log4net>
</configuration>

image.gif

关于log4net.config配置的详细说明,可参考log4net配置文件详解

5)控制器

5.1  Log4Net 简单配置,输出至控制台

/// <summary>
/// 获取日志输出 - 第三方框架:Log4Net(简单配置,输出至控制台)
/// </summary>
[HttpGet]
public void GetLogOutWithLog4NetSimpleConfiguration()
{
    ILoggerRepository repository = LogManager.CreateRepository(".NET Core RepositoryRepository");
    // 默认简单配置,输出至控制台
    BasicConfigurator.Configure(repository);
    ILog log = LogManager.GetLogger(repository.Name, ".NET Core Log4net");
    log.Info(".NET Core Log4net log");
    log.Info("test log");
    log.Error("error");
    log.Info("linezero");
}

image.gif

5.1  运行结果

image.gif

5.2  Log4Net 增加配置,输出至文件

/// <summary>
/// 获取日志输出 - 第三方框架:Log4Net(增加配置,输出至文件)
/// </summary>
[HttpGet]
public void GetLogOutWithLog4NetComplexConfigurations()
{
    ILoggerRepository repository = LogManager.CreateRepository(".NET Core RepositoryRepository");
    XmlConfigurator.Configure(repository, new FileInfo("log4net.config"));
    ILog log = LogManager.GetLogger(repository.Name, ".NET Core Log4net");
    log.Info(".NET Core Log4net log");
    log.Info("test log");
    log.Error("error");
    log.Info("linezero");
}

image.gif

5.2  运行结果

image.gif

4、 NLog

1)使用NuGet安装NLog和NLog.Web.AspNetCore包

image.gif

2)新建nlog.config配置文件,配置日志输出格式

image.gif3)右键新添加的log4net.config配置文件,更改文件属性->复制到输出目录选项:始终复制

image.gif

或者在项目的.csproj文件添加如下代码:

<ItemGroup>
    <Content Update="nlog.config">
        <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
</ItemGroup>

image.gif

4)nlog.config配置文件内容

<?xml version="1.0" encoding="utf-8" ?>
<nlog
    xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"
      throwConfigExceptions="true"
      internalLogLevel="info"
      internalLogFile="${basedir}/logs/nlog/internal-nlog.txt">
    <!-- enable asp.net core layout renderers -->
    <extensions>
        <add assembly="NLog.Web.AspNetCore"/>
    </extensions>
    <!-- the targets to write to -->
    <targets>
        <!-- File Target for all log messages with basic details -->
        <target xsi:type="File" name="allfile" fileName="${basedir}/logs/nlog/all/nlog-all-${shortdate}.log"
        layout="${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" />
        <!-- File Target for own log messages with extra web details using some ASP.NET core renderers -->
        <target xsi:type="File" name="ownFile-web" fileName="${basedir}/logs/nlog/my/nlog-own-${shortdate}.log"
        layout="${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}|" />
        <!--Console Target for hosting lifetime messages to improve Docker / Visual Studio startup detection -->
        <target xsi:type="Console" name="lifetimeConsole" layout="${MicrosoftConsoleLayout}" />
    </targets>
    <!-- rules to map from logger name to target -->
    <rules>
        <!--All logs, including from Microsoft-->
        <logger name="*" minlevel="Trace" writeTo="allfile" />
        <!--Output hosting lifetime messages to console target for faster startup detection -->
        <logger name="Microsoft.Hosting.Lifetime" minlevel="Info" writeTo="lifetimeConsole, ownFile-web" final="true" />
        <!--Skip non-critical Microsoft logs and so log only own logs-->
        <logger name="Microsoft.*" maxlevel="Info" final="true" />
        <!-- BlackHole -->
        <logger name="*" minlevel="Trace" writeTo="ownFile-web" />
    </rules>
</nlog>

image.gif

5)配置并启用NLog

public class Program
{
    public static void Main(string[] args)
    {
        var logger = NLog.LogManager.Setup().LoadConfigurationFromAppSettings().GetCurrentClassLogger();
        try
        {
            logger.Debug("init main");
            CreateHostBuilder(args).Build().Run();
        }
        catch(Exception exception)
        {
            // NLog: 捕获设置错误
            logger.Error(exception, "Stopped program because of exception");
            throw;
        }
        finally
        {
            // 确保在应用程序退出前刷新和停止内部定时器/线程(避免Linux上的分段故障)
            NLog.LogManager.Shutdown();
        }
    }
    public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>
    {
        webBuilder.UseStartup < Startup > ();
    }).ConfigureLogging(logging =>
    {
        logging.ClearProviders();
        logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
    }).UseNLog(); // NLog: 依赖性注入设置NLog
}

image.gif

6)配置appsettings.json

appsettings.json中指定的日志配置覆盖了对SetMinimumLevel的任何调用。因此,要么删除 "Default":要么根据你的需要正确调整。

上述logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);

所以配置文件需要更改

{
    "Logging": {
        "LogLevel": {
            "Default": "Trace", // 这里更改的地方
            "Microsoft": "Warning",
            "Microsoft.Hosting.Lifetime": "Information"
        }
    },
    "AllowedHosts": "*"
}

image.gif

记得也要测试环境的配置,appsettings.Development.json,以免出现异常

{
    "Logging": {
        "LogLevel": {
            "Default": "Trace", // 这个要更改
            "Microsoft": "Warning",
            "Microsoft.Hosting.Lifetime": "Information"
        }
    }
}

image.gif

7)控制器

/// <summary>
/// 获取日志输出 - 第三方框架:NLog
/// </summary>
[HttpGet]
public void GetLogOutWithNLog()
{
    // 内置日志
    _logger.LogTrace(1000, "log Trace msg");
    _logger.LogDebug(1001, "log Debug msg");
    _logger.LogInformation(1002, "log Information msg");
    _logger.LogWarning(1003, "log Warning msg");
    _logger.LogError(1004, "log Error msg");
    _logger.LogCritical(1005, "log Critical msg");
}

image.gif

8)运行结果

image.gif

关于配置文件的说明可查看官网:NLog Configuration-file

还有一篇翻译文章方便查看:NLog类库使用探索——详解配置

5、Serilog

1)使用NuGet安装Serilog.AspNetCore包image.gif

2)配置Serilog输出格式等信息

public class Program
{
    public static void Main(string[] args)
    {
        // 配置Serilog
        Log.Logger = new LoggerConfiguration()
            // 设定最小的记录级别
            .MinimumLevel.Debug()
            // 如果遇到Microsoft命名空间,那么最小记录级别为Information
            .MinimumLevel.Override("Microsoft", Serilog.Events.LogEventLevel.Information)
            // 记录相关上下文信息
            .Enrich.FromLogContext()
            // 日志输出到控制台
            .WriteTo.Console()
            // 输出到文件,指定输出路径和周期
            .WriteTo.File(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"logs/serilog/serilog.txt"), rollingInterval: RollingInterval.Day) // 配置日志输出文件,生成周期每天
            .CreateLogger();
        try
        {
            Log.Information("Starting up");
            CreateHostBuilder(args).Build().Run();
        }
        catch(Exception ex)
        {
            Log.Fatal(ex, "Application start-up failed");
        }
        finally
        {
            Log.CloseAndFlush();
        }
    }
    public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args).ConfigureLogging(logging =>
    {
        logging.ClearProviders(); // 去掉默认添加的日志提供程序
    }).ConfigureWebHostDefaults(webBuilder =>
    {
        webBuilder.UseStartup < Startup > ();
    }).UseSerilog(); // 配置使用Serilog
}

image.gif

这里为直接按照配置格式输出,当然也可以通过读取配置文件的形式读取配置的具体信息,本文不做具体阐述。

3)控制器

/// <summary>
/// 获取日志输出 - 第三方框架:Serilog
/// </summary>
[HttpGet]
public void GetLogOutWithSerilog()
{
    // 内置日志
    _logger.LogTrace(1000, "log Trace msg");
    _logger.LogDebug(1001, "log Debug msg");
    _logger.LogInformation(1002, "log Information msg");
    _logger.LogWarning(1003, "log Warning msg");
    _logger.LogError(1004, "log Error msg");
    _logger.LogCritical(1005, "log Critical msg");
}

image.gif

4)运行结果

image.gif

6、附录

1)Log4Net GitHub仓库地址

2)NLog GitHub仓库地址

3)Serilog GitHub仓库地址

4)NLog vs log4net vs Serilog: Compare .NET Logging Frameworks

5)LogLevel 枚举

image.gif

6)日志级别

image.gif



以上就是.NET Core 日志记录程序和常用日志记录框架的简单使用的介绍,做此记录,如有帮助,欢迎点赞关注收藏!

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
25天前
|
开发框架 .NET 开发者
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:&lt;https://github.com/khellang/Scrutor&gt;
40 5
|
7天前
|
JSON 安全 API
.net 自定义日志类
在.NET中,创建自定义日志类有助于更好地管理日志信息。示例展示了如何创建、配置和使用日志记录功能,包括写入日志文件、设置日志级别、格式化消息等。注意事项涵盖时间戳、日志级别、JSON序列化、线程安全、日志格式、文件处理及示例使用。请根据需求调整代码。
32 13
|
8天前
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
|
27天前
|
消息中间件 开发框架 监控
NET任务调度框架Hangfire使用指南
Hangfire 是一个用于 .NET 应用程序的开源任务调度框架,支持长时间运行任务、定时任务等。通过简单的安装配置,即可将任务从主线程分离,提升应用性能。支持多种数据库,提供丰富的任务类型如立即执行、延迟执行和周期性任务,并有可视化管理界面 Hangfire Dashboard。还支持安全性配置及扩展插件,如 Hangfire.HttpJob,适合各种复杂场景下的任务调度需求。
49 1
NET任务调度框架Hangfire使用指南
|
2月前
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
46 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
1月前
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
28 3
|
10天前
|
开发框架 算法 中间件
ASP.NET Core 中的速率限制中间件
在ASP.NET Core中,速率限制中间件用于控制客户端请求速率,防止服务器过载并提高安全性。通过`AddRateLimiter`注册服务,并配置不同策略如固定窗口、滑动窗口、令牌桶和并发限制。这些策略可在全局、控制器或动作级别应用,支持自定义响应处理。使用中间件`UseRateLimiter`启用限流功能,并可通过属性禁用特定控制器或动作的限流。这有助于有效保护API免受滥用和过载。 欢迎关注我的公众号:Net分享 (239字符)
25 0
|
2月前
|
开发框架 安全 .NET
在数字化时代,.NET 技术凭借跨平台兼容性、丰富的开发工具和框架、高效的性能及强大的安全稳定性,成为软件开发的重要支柱
在数字化时代,.NET 技术凭借跨平台兼容性、丰富的开发工具和框架、高效的性能及强大的安全稳定性,成为软件开发的重要支柱。它不仅加速了应用开发进程,提升了开发质量和可靠性,还促进了创新和业务发展,培养了专业人才和技术社区,为软件开发和数字化转型做出了重要贡献。
36 5
|
2月前
|
传感器 人工智能 供应链
.NET开发技术在数字化时代的创新作用,从高效的开发环境、强大的性能表现、丰富的库和框架资源等方面揭示了其关键优势。
本文深入探讨了.NET开发技术在数字化时代的创新作用,从高效的开发环境、强大的性能表现、丰富的库和框架资源等方面揭示了其关键优势。通过企业级应用、Web应用及移动应用的创新案例,展示了.NET在各领域的广泛应用和巨大潜力。展望未来,.NET将与新兴技术深度融合,拓展跨平台开发,推动云原生应用发展,持续创新。
47 4
|
2月前
|
开发框架 .NET C#
.NET 技术凭借高效开发环境、强大框架支持及跨平台特性,在软件开发中占据重要地位
.NET 技术凭借高效开发环境、强大框架支持及跨平台特性,在软件开发中占据重要地位。从企业应用到电子商务,再到移动开发,.NET 均展现出卓越性能,助力开发者提升效率与项目质量,推动行业持续发展。
37 4