.NET Core 3.0 로그 logging 의 실현


다년간 의 경험,로그 기록 은 소프트웨어 개발 의 중요 한 구성 부분 이다.로그 기록 메커니즘 이 없 는 시스템 은 완벽 한 시스템 이 아니다.개발 단계 에 서 는 debug 첨부 프로 세 스 를 통 해 인 터 랙 션 디 버 깅 을 할 수 있 으 며,일부 문 제 를 감지 할 수 있 으 나,접속 후 로그 의 기록 은 중요 한 역할 을 합 니 다.그것 은 우리 로 하여 금 시스템 에 문제 가 생 긴 후에 오 류 를 조사 하여 근 거 를 제공 하 게 할 수 있다.
.NET Core 3.0 에는 다양한 로그 기록 프로그램 이 내장 되 어 있 으 며 제3자 가 제공 하 는 로그 기록 프로그램 프레임 워 크 가 있 습 니 다.예 를 들 어 log4net,NLog,Serilog,elmah.io 등 입 니 다.다음 세 가지 로그 프레임 워 크 가.NET core 3.0 과 어떻게 결합 하여 사용 되 는 지 소개 합 니 다.
내 장 된 로그 기록 공급 자
ASP.NETCore 는 다음 과 같은 프로그램 을 제공 합 니 다.
컨트롤 러-컨트롤 러 에서 로그 출력 을 볼 수 있 습 니 다
  • 디 버 깅-vs 도구-'디 버 깅 시작-'출력 창 에서 로그 출력 보기
  • EventSource-PerfView 유 틸 리 티 도 구 를 사용 하여 로 그 를 수집 하고 조회 할 수 있 습 니 다
  • 윈도 우즈 시스템 에서 만 이벤트 뷰 어 로 그 를 볼 수 있 습 니 다
  • TraceSource
  • AzureAppServicesFile
  • AzureAppServicesBlob
  • ApplicationInsights
  • 사용 로그 만 들 기
    유 니 버 설 호스트 의 응용 프로그램 과 비 호스트 응용 프로그램 이 사용 하 는 방식 도 다르다.유 니 버 설 호스트 내부 에 주입,logging,설정,IHosted Service 에 의존 하 는 구현 이 봉인 되 어 있 기 때 문 입 니 다.또한 기본적으로 콘 솔,디 버 깅,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>();
            })
    로그 만 들 기
    웹 응용 프로그램 이나 위탁 관리 서비스 에서 의존 관계 주입(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"); //



    비 호스트 콘 솔
    공급 자 추가
    Logger Factory 를 만 들 때 프로그램 을 제공 하 는 add{provider name}확장 방법 을 호출 합 니 다.
    
    var loggerFactory = LoggerFactory.Create(builder =>
    {
      builder
        .AddFilter("Microsoft", LogLevel.Warning)
        .AddFilter("System", LogLevel.Warning)
        .AddFilter("LoggingConsoleApp.Program", LogLevel.Debug)
        .AddConsole()
        .AddEventLog();
    });
    로그 만 들 기
    호스트 가 아 닌 콘 솔 응용 프로그램 에서 Logger Factory 를 사용 하여 ILogger 를 만 듭 니 다.
    
    ILogger logger = loggerFactory.CreateLogger<Program>();
    logger.LogInformation("       log message");

    실행 출력

    제3자 로그 프레임 워 크
    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 에서 사용 합 니 다.

    프로젝트 에 NRog 를 참조 하여 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 초기 화
    메 인 방법 추가
    
    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();
          }
    출력 실행:

    소결:본 고 는 주로 NET Core 3.0 에 내 장 된 로그 제공 프로그램 과 제3자 로그 프레임 워 크(Log4net,Nlog,Serilog)의 사용 을 설명 한다.
    .NET Core 3.0 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그 로그

    좋은 웹페이지 즐겨찾기