.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();
            });
        }
复制代码

 

 

  

posted @   LearningAlbum  阅读(907)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
点击右上角即可分享
微信分享提示