.NetCore 集成serilog 日志


日志成了現代程序的標配,那么serilog是一個優秀的日志框架,擴展性很強,比如結構化日志,但是本文不涉及結構化方面。

 1. 安裝Nuget 包 Serilog.AspNetCore ,會提示安裝依賴,把依賴的包都裝上

 2. 配置日志,這里用serilog.json 配置文件。

{
  "Serilog": {
    // 日志輸出級別
    "MinimumLevel": {
      "Default": "Debug",
      "Override": {
        // 日志調用類命名空間如果以 Microsoft 開頭,覆蓋日志輸出最小級別為 Information
        "Microsoft": "Information",
        "Microsoft.Hosting": "Information",
        "System": "Warning"
      }
    },
    "WriteTo:Async": {
      "Name": "Async",
      "Args": {
        "configure:File": {
          "Name": "File",
          "Args": {
            "Path": ".\\log\\ForestoryApi_%COMPUTERNAME%_.log",
            "RollingInterval": "Hour",
            "Shared": true, //共享打開
            "FileSizeLimitBytes": 209715200,
            "RollOnFileSizeLimit": true,
            "RetainedFileCountLimit": 30, //保留最后30個日志
            "FlushToDiskInterval": "00:00:10",
            "outputTemplate": "[{Timestamp:HH:mm:ss fff} {Level:u3}]{Message:lj}{NewLine}{Exception}"
          }
        },
        "configure:EventLog": {
          "Name": "EventLog",
          "Args": {
            "source": "SZ.DALIN.Forestry.Api",
            "logName": "Forestry",
            "restrictedToMinimumLevel": "Error"
          }
        }
      }
    },
    "WriteTo:Console": {
      "Name": "Console",
      "Args": {
        "outputTemplate": "發生時間:{Timestamp: HH:mm:ss.fff} 事件等級:{Level:u3} 詳細信息:{Message:lj}{NewLine}{Exception}"
      }
    }
  }
}

3. 讀取serilog 配置

public class Program
    {
        private static IConfiguration _serilogConfiguration;

        private static IConfiguration GetSerilogConfiguration(string[] args)
        {
            var config = new ConfigurationBuilder()
                .AddEnvironmentVariables("DOTNET_")
                .AddEnvironmentVariables("ASPNETCORE_")
                .AddCommandLine(args)
                .Build();
            var env = config.GetValue<string>("Environment");
            return new ConfigurationBuilder().AddConfiguration(config)
                   .AddJsonFile("config/serilog.json", false, false)
                   .AddJsonFile($"config/serilog.{env}.json", true, false)
                   .Build();
        }

        public static void Main(string[] args)
        {
            _serilogConfiguration = GetSerilogConfiguration(args);
            Log.Logger = new LoggerConfiguration()
                         .ReadFrom.Configuration(_serilogConfiguration)
                         //.WriteTo.Console()
                         .CreateLogger();
            try
            {
                CreateHostBuilder(args).Build().Run();
            }
            catch (Exception ex)
            {
                Log.Fatal(ex.Message);
            }
            finally
            {
                Log.CloseAndFlush();
            }
            
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureHostConfiguration(configurationBuilder =>
                {
                    //load env.json, EnvironmentVariables,CommandLine args and serilog.json before loading appsetting.json
                    //so we can change "Environment" and "Url" in env.json, EnvironmentVariables or CommandLine args.
                    configurationBuilder.AddConfiguration(_serilogConfiguration);
                })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.ConfigureAppConfiguration((webHostBuildContex, configurationBuilder) =>
                    {
                        var env = webHostBuildContex.HostingEnvironment.EnvironmentName;
                        configurationBuilder.AddJsonFile("config/appsettings.json", false, true);
                        configurationBuilder.AddJsonFile($"config/appsettings.{env}.json", true, true);
                    });
                    webBuilder.UseStartup<Startup>();
                })
                .UseSerilog();
    }

 

4. 運行發現還沒有寫入本地日志,發現忘記安裝一個異步包,再次安裝 Serilog.Sinks.Async 

5. 日志塑形,簡化日志 UseSerilogReuestLogging()另外還有比如提高json里面的日志級別,這樣會少很多無用的日志

     public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseStaticFiles();
            app.UseSerilogRequestLogging(options => 
            {   
                // 這些自定義信息可以重寫serilog.json里面的局部配置項,比如替換模板
                // 自定義消息模板
                options.MessageTemplate = "Handled {RequestPath} {RequestHost}";
                // 發出調試級別的事件,而不是默認事件
                options.GetLevel = (httpContext, elapsed, ex) => LogEventLevel.Debug;
                //將其他屬性附加到請求完成事件
                options.EnrichDiagnosticContext = (diagnosticContext, httpContext) =>
                {
                    diagnosticContext.Set("RequestHost", httpContext.Request.Host.Value);
                    diagnosticContext.Set("RequestScheme", httpContext.Request.Scheme);
                };
            });
            app.UseRouting();

            //app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM