zoukankan      html  css  js  c++  java
  • .NET Core3.0 日志 logging-最好用的日志集合介绍

    多年的经验,日志记录是软件开发的重要组成部分。没有日志记录机制的系统不是完善的系统。在开发阶段可以通过debug附件进程进行交互调试,可以检测到一些问题,但是在上线之后,日志的记录起到至关重要的作用。它可使我们在系统出现问题之后,排查错误提供依据。

    .NET Core3.0内置多种日志记录程序,并且有第三方提供的日志记录程序框架如:log4net,NLog,Serilog,elmah.io等。后面会介绍前三种日志框架如何与.NETcore3.0结合起来进行使用。

    内置日志记录提供程序

    ASP.NET Core 提供以下提供程序:

    • 控制台-可以在控制台查看日志输出

    • 调试-vs工具 -》开始调试-》输出窗口进行查看日志输出

    • EventSource-可使用PerfView 实用工具收集和查看日志

    • EventLog-》仅在windows系统下可以使用事件查看器查看日志

    • TraceSource

    • AzureAppServicesFile

    • AzureAppServicesBlob

    • ApplicationInsights

    创建使用日志

    通用主机的应用程序和非主机应用程序使用的方式也是不同的。因为通用主机内部封装了 依赖注入、logging、配置、IHostedService的实现;并且默认配置了控制台,调试,EventSource以及EventLog(仅当在windows上运行时)提供程序。源码如下

    复制代码
    .ConfigureLogging((hostingContext, logging) =>
                {
                    var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
    
                    // IMPORTANT: This needs to be added *before* configuration is loaded, this lets
                    // the defaults be overridden by the configuration.
                    if (isWindows)
                    {
                        // Default the EventLogLoggerProvider to warning or above
                        logging.AddFilter<EventLogLoggerProvider>(level => level >= LogLevel.Warning);
                    }
    
                    logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
                    logging.AddConsole();
                    logging.AddDebug();
                    logging.AddEventSourceLogger();
    
                    if (isWindows)
                    {
                        // Add the EventLogLoggerProvider on windows machines
                        logging.AddEventLog();
                    }
                })
    复制代码
    • 通用主机

    添加提供程序

    可自行选择提供程序来替换默认提供程序。在CreateHostBuilder时候 调用ClearProviders(),然后添加所需的提供程序。我们创建一个api项目为例

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

    在 Web 应用或托管服务中,由依赖关系注入 (DI) 获取 ILogger。

    复制代码
    private readonly ILogger<WeatherForecastController> _logger;
            public WeatherForecastController(ILogger<WeatherForecastController> logger)
            {
                _logger = logger;
                
                //可以显示指定类别名称ILoggerFactory logger
                //logger.CreateLogger("WebApi.Controllers.WeatherForecastController");
            }
    复制代码
    复制代码
    [HttpGet]
            public IEnumerable<WeatherForecast> Get()
            {
                //内置日志
                _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"); //
    复制代码
    各个端的运行输出:

    • 非主机控制台

    添加提供程序

    在创建 LoggerFactory 时调用提供程序的 Add{provider name} 扩展方法:

    复制代码
    var loggerFactory = LoggerFactory.Create(builder =>
    {
        builder
            .AddFilter("Microsoft", LogLevel.Warning)
            .AddFilter("System", LogLevel.Warning)
            .AddFilter("LoggingConsoleApp.Program", LogLevel.Debug)
            .AddConsole()
            .AddEventLog();
    });
    复制代码
    创建日志

    在非主机控制台应用中,使用 LoggerFactory 来创建 ILogger。

    ILogger logger = loggerFactory.CreateLogger<Program>();
    logger.LogInformation("非主机模式输出log message");
    运行输出

    第三方日志框架

    log4net,NLog和Serilog这3种日志记录框架几乎在.NET空间中占主导地位,不需要太多介绍。看看最近6周的下载排名就知道了。如图

    log4net 在NET Core 3.0使用

    引用Log4net到项目中,安装NuGet包

    Install-Package log4net -Version 2.0.8
    在项目中添加log4net.config文件,右键改文件属性-》复制到输出目录选择-》始终复制
    复制代码
    <log4net>
      <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
        <file value="loglog4net.log" />
        <appendToFile value="true" />
        <maximumFileSize value="50KB" />
        <maxSizeRollBackups value="2" />
    
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%date %level %message%newline" />
        </layout>
      </appender>
    
      <root>
        <level value="ALL" />
        <appender-ref ref="RollingFile" />
      </root>
    </log4net>
    复制代码
    在Startup文件中添加log4net配置的文件
    复制代码
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
                app.UseLog4net();
       /// <summary>
            /// 使用log4net配置
            /// </summary>
            /// <param name="app"></param>
            /// <returns></returns>
            public static IApplicationBuilder UseLog4net(this IApplicationBuilder app)
            {
                var logRepository = log4net.LogManager.CreateRepository(Assembly.GetEntryAssembly(), typeof(log4net.Repository.Hierarchy.Hierarchy));
                log4net.Config.XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config"));
                return app;
            }
    上面两步的准备完成之后,在Controllers中使用
     private readonly ILog log;
            public WeatherForecastController(ILogger<WeatherForecastController> logger)
            {
                this.log = LogManager.GetLogger(typeof(WeatherForecastController));
            } [HttpGet]
            public IEnumerable<WeatherForecast> Get()
            {
                //第三方日志
                log.Error("log4net erro msg"); //log4net
    复制代码
    运行查看日志文件

    NLog 在NET Core 3.0使用

    引用NLog到项目中,安装NuGet包

    Install-Package NLog.Web.AspNetCore -Version 4.9.0
    Install-Package NLog -Version 4.6.7
    添加配置文件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"
          internalLogLevel="Info"
          internalLogFile="internal-nlog.txt">
    
      <!-- enable asp.net core layout renderers -->
      <extensions>
        <add assembly="NLog.Web.AspNetCore"/>
      </extensions>
    
      <!-- the targets to write to -->
      <targets>
        <!-- write logs to file  -->
        <target xsi:type="File" name="allfile" fileName="nlog-all-${shortdate}.log"
                layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" />
    
        <!-- another file log, only own logs. Uses some ASP.NET core renderers -->
        <target xsi:type="File" name="ownFile-web" fileName="nlog-own-${shortdate}.log"
                layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />
      </targets>
    
      <!-- rules to map from logger name to target -->
      <rules>
        <!--All logs, including from Microsoft-->
        <logger name="*" minlevel="Trace" writeTo="allfile" />
    
        <!--Skip non-critical Microsoft logs and so log only own logs-->
        <logger name="Microsoft.*" maxlevel="Info" final="true" />
        <!-- BlackHole without writeTo -->
        <logger name="*" minlevel="Trace" writeTo="ownFile-web" />
      </rules>
    </nlog>
    复制代码
    在Program.cs文件配置 Main方法添加
    NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();

    CreateHostBuilder方法添加

     .UseNLog() //NLog: Setup NLog for Dependency injection

    使用  

    复制代码
    [HttpGet]
            public IEnumerable<WeatherForecast> Get()
            {
                //内置日志
                _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"); //
    复制代码
    输出

    Serilog 在NET Core 3.0使用

    引用Serilog到项目中,安装NuGet包

    Install-Package Serilog.AspNetCore -Version 3.1.0
    在Program.cs文件进行Logger 初始化

    Main方法添加

    复制代码
    Log.Logger = new LoggerConfiguration()
                    .Enrich.FromLogContext()
                    .WriteTo.Console()// 配置日志输出到控制台
                    .WriteTo.File("logserilog.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();
                }
    复制代码
     将Serilog设置为日志提供程序,只需在CreateHostBuilder方法后添加一句
     .UseSerilog();
    注入logger到你的controllers
    复制代码
    public WeatherForecastController(ILogger<WeatherForecastController> logger)
            {
                _logger = logger;//默认
            [HttpGet]
            public IEnumerable<WeatherForecast> Get()
            {
                //内置日志
                _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"); //
    复制代码
    运行输出:

    小结:本文主要讲解NET Core3.0内置的日志提供程序和与第三方日志框架(Log4net,Nlog,Serilog)的使用。
  • 相关阅读:
    命令实现linux和客户端文件上传下载
    python--linux上如何执行shell命令
    Eureka系列(一)Eureka功能介绍
    Eureka系列(七) 服务下线Server端具体实现
    编译时多态 与 运行时多态
    静态绑定(前期绑定) 与 动态绑定(后期绑定)
    重载 与 重写
    热点检测、方法内联、动态反优化
    数据库日志
    单例模式
  • 原文地址:https://www.cnblogs.com/zxtceq/p/14149620.html
Copyright © 2011-2022 走看看