• netcore3.1 使用Nlog 将本地日志写入到elk


    • 新建webapi
    • 添加Nlog nuget包引用
    • 添加Nlog配置文件
      <?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="Warn"
            internalLogFile="internal-nlog.txt">
      
        <extensions>
          <!--enable NLog.Web for ASP.NET Core-->
          <add assembly="NLog.Web.AspNetCore"/>
        </extensions>
      
        <!-- define various log targets -->
        <!--定义日志文件目录-->
        <variable name="logDirectory" value="${basedir}/logs/${shortdate}"/>
        <variable name="nodeName" value="node1"/>
      
        <targets async="true">
          <!-- 全部日志target -->
          <target xsi:type="File"
                  name="allfile"
                  fileName="${logDirectory}/nlog-all/${shortdate}.log"
                  layout="#node1#${longdate}#${logger}#${uppercase:${level}}#${callsite}#${callsite-linenumber}#${aspnet-request-url}#${aspnet-request-method}#${aspnet-mvc-controller}#${aspnet-mvc-action}#${message}#${exception:format=ToString}#"
                  keepFileOpen="false"
                  />
      
          <!-- 本地文件日志target -->
          <target xsi:type="File"
                  name="ownLog-file"
                  fileName="${logDirectory}/nlog-${level}/${shortdate}.log"
                  layout="#${longdate}#${nodeName}#${logger}#${uppercase:${level}}#${callsite}#${callsite-linenumber}#${aspnet-request-url}#${aspnet-request-method}#${aspnet-mvc-controller}#${aspnet-mvc-action}#${message}#${exception:format=ToString}#"
                  keepFileOpen="false"
                  />
      
          <!-- Tcp日志target -->
          <target xsi:type="Network"
                  name="ownLog-tcp"
                  keepConnection="false"
                  address ="tcp://192.168.3.10:5000"
                  layout="#${longdate}#${nodeName}#${logger}#${uppercase:${level}}#${callsite}#${callsite-linenumber}#${aspnet-request-url}#${aspnet-request-method}#${aspnet-mvc-controller}#${aspnet-mvc-action}#${message}#${exception:format=ToString}#"
                  />
          <!--grok 规则-->
          <!--%#{DATA:request_time}#%{DATA:node_name}#%{DATA:class_name}#%{DATA:log_level}#%{DATA:call_site}#%{DATA:line_number}#%{DATA:request_url}#%{DATA:request_method}#%{DATA:container_name}#%{DATA:action_name}#%{DATA:log_info}#%{DATA:exception_msg}#-->
          <!--空白-->
          <target xsi:type="Null" name="blackhole" />
        </targets>
      
        <!--日志级别 Trace -》Debug-》 Info -》Warn-》 Error-》 Fatal-->
        <!--日志规则-->
        <rules>
          <!--全部日志, 包括Microsoft日志-->
          <logger name="*" minlevel="Trace" writeTo="allfile" />
      
          <!--自定义日志,排除Microsoft日志-->
          <logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />
          <logger name="*" minlevel="Debug" writeTo="ownLog-file" />
          <logger name="*" minlevel="Info" writeTo="ownLog-tcp" />
        </rules>
      </nlog>
    • startup添加中间件
      using Microsoft.AspNetCore.Builder;
      using Microsoft.AspNetCore.Hosting;
      using Microsoft.Extensions.Configuration;
      using Microsoft.Extensions.DependencyInjection;
      using Microsoft.Extensions.Hosting;
      using Microsoft.Extensions.Logging;
      using NLog;
      using NLog.Extensions.Logging;
      using NLog.Web;namespace UserWebApplication
      {
          public class Startup
          {
      
              public Startup(IConfiguration configuration)
              {
                  Configuration = configuration;
              }
      
              public IConfiguration Configuration { get; }
      
              // This method gets called by the runtime. Use this method to add services to the container.
              public void ConfigureServices(IServiceCollection services)
              {
                  var currentClassLogger = NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
                  services.AddSingleton(currentClassLogger);
                  services.AddControllers();
                
              }
      
              // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
              public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory, IHostApplicationLifetime lifetime)
              {
                  //loggerFactory.AddNLog();
                  //loggerFactory.ConfigureNLog("nlog.config");
                  if (env.IsDevelopment())
                  {
                      app.UseDeveloperExceptionPage();
                  }
      
                  app.UseRouting();
      
                  app.UseAuthorization();
      
                  //停止时注销
                  lifetime.ApplicationStopped.Register(() =>
                  {
                      //Nlog 确保在应用程序退出之前刷新并停止内部计时器/线程(避免Linux上出现分段错误)
                      LogManager.Shutdown();
                  });
      
                  app.UseEndpoints(endpoints =>
                  {
                      endpoints.MapControllers();
                  });
              }
          }
      }
    • Program 添加Loggin配置
      using Microsoft.AspNetCore.Hosting;
      using Microsoft.Extensions.Hosting;
      using Microsoft.Extensions.Logging;
      using NLog.Web;
      
      namespace UserWebApplication
      {
          public class Program
          {
              public static void Main(string[] args)
              {
                  CreateHostBuilder(args).Build().Run();
              }
      
              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();
          }
      }
    • 修改appsetting.json 配置
      {
        "Logging": {
          "IncludeScopes": false,
          "LogLevel": {
            "Default": "Trace",
            "Microsoft": "Warning",
            "Microsoft.Hosting.Lifetime": "Information"
          }
        },
        "AllowedHosts": "*"
      }
    • 使用示例
        private readonly ILogger<WeatherForecastController> _logger;
      
              public WeatherForecastController(ILogger<WeatherForecastController> logger)
              {
                  _logger = logger;
              }
      
              [HttpGet]
              public IEnumerable<WeatherForecast> Get()
              {
                  var rng = new Random();
                  _logger.LogInformation("这是一条测试消息Information");
      
                  _logger.LogError("这是一条测试消息Erro");
      
                  _logger.LogDebug("这是一条测试消息Debug");
      
                  return Enumerable.Range(1, 5).Select(index => new WeatherForecast
                  {
                      Date = DateTime.Now.AddDays(index),
                      TemperatureC = rng.Next(-20, 55),
                      Summary = Summaries[rng.Next(Summaries.Length)]
                  })
                  .ToArray();
              }

       参考自https://github.com/NLog/NLog/wiki/Getting-started-with-ASP.NET-Core-2

  • 相关阅读:
    k8s创建rabbitmq集群
    k8s创建redis集群
    azure devops server自动生成容器镜像部署到k8s
    azure devops 自动编译生成项目
    部署 Kubernetes 高可用集群
    camstar 服务健康检查和故障自动恢复
    keepalived 配置
    解决k8s namespace terminating无法删除的问题
    kong网关dbless模式
    camstar MES开发分享
  • 原文地址:https://www.cnblogs.com/chongyao/p/14098197.html
Copyright © 2020-2023  润新知