[C#] .NET6 WorkerService Serilog 사용하기

개요

  • .NET6 WorkerService 프로젝트를 생성 후, Serilog 사용하여 로그 파일을 저장하는 방법에 대해서 정리 진행합니다.

개발환경

  • 테스트 개발 환경은 다음과 같습니다.
    • .NET6
    • Visual Studio 2022

1. WorkerService 프로젝트 생성


2. Serilog 패키지 추가

  • 다음으로, Serilog 패키지를 추가해 주어야 합니다.
  • Serilog 를 사용하기 위해서는 아래의 패키지들이 필요합니다.
    • Serilog.AspNetCore
    • Serilog.Exception
    • Serilog.Sinks.Console
    • Serilog.Sinks.Debug
    • Serilog.Sinks.File
  • 위 패키지들이 모두 설치가 되어 있어야 합니다.


3. Worker.cs 코드 추가

  • 다음으로, WorkerService 를 실행시켜서 로그를 기록해 주어야 합니다.
  • 테스트를 하기 위해서, 네이버 사이트의 접속 상태를 5초마다 체크하여 상태의 정보를 로그로 기록하는 코드를 추가해 주었습니다.
namespace WorkerServiceHosting
{
    public class Worker : BackgroundService
    {
        private readonly ILogger<Worker> _logger;
        private HttpClient client;

        public Worker(ILogger<Worker> logger)
        {
            _logger = logger;
        }

        public override Task StartAsync(CancellationToken cancellationToken)
        {
            client = new HttpClient();
            return base.StartAsync(cancellationToken);
        }

        public override Task StopAsync(CancellationToken cancellationToken)
        {
            client.Dispose();
            return base.StopAsync(cancellationToken);
        }

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            while (!stoppingToken.IsCancellationRequested)
            {
                var result = await client.GetAsync("https://www.naver.com");

                if(result.IsSuccessStatusCode)
                {
                    _logger.LogInformation("The website is up. Status code {StatusCode}", result.StatusCode);
                }
                else
                {
                    _logger.LogError("The website is down. Status code {StatusCode}", result.StatusCode);
                }

                await Task.Delay(5000, stoppingToken);
            }
        }
    }
}

4. appsettings.json Serilog 설정하기

  • appsettings.json 에 Serilog 관련 옵션들을 설정해 줍니다.
  • 보다 자세한 옵션을 확인하려면, Serilog Git 사이트 참고하면 됩니다.
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "Serilog": {
    "MinimumLevel": "Information",
    "Using": [ "Serilog.Exceptions", "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
    "Enrich": [ "WithExceptionDetails" ],
    "WriteTo": [
      {
        "Name": "Console",
        "Args": {
          "theme": "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Code, Serilog.Sinks.Console",
          "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} <s:{SourceContext}>{NewLine}{Exception}"
        }
      },
      {
        "Name": "File",
        "Args": {
          "path": "C:\\Temp\\workerservice\\log-.json",
          "rollingInterval": "Day",
          "rollOnFileSizeLimit": true,
          "fileSizeLimitBytes": 50000000,
          "retainedFileCountLimit": 10000,
          "formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog"
        }
      }
    ]
  }
}

5. Program.cs

  • 다음은, Program.cs 코드 입니다.
  • 해당 코드에서 Serilog 관련 코드를 추가해 주었습니다.
using Serilog;
using WorkerServiceHosting;

try
{
    IHost host = Host.CreateDefaultBuilder(args)
    .UseSerilog()
    .ConfigureServices(services =>
    {
        var configuration = new ConfigurationBuilder()
                                .AddJsonFile("appsettings.json", false, true)
                                .AddEnvironmentVariables()
                                .Build();

        Log.Logger = new LoggerConfiguration()
            .ReadFrom
            .Configuration(configuration)
            .CreateLogger();

        Log.Information("Starting up the service");
        services.AddHostedService<Worker>();
    })
    .Build();

    await host.RunAsync();
}
catch (Exception e)
{
    Log.Error(e.Message);
    Log.Error(e.StackTrace);
    Log.Error(e.Message);
}
finally
{
    Log.CloseAndFlush();
}

실행 결과

  • F5 키를 눌러서, WorkerService 실행하여 우선 콘솔 화면에서 로그가 잘 찍히는지 확인합니다.
  • 확인 결과, 5초마다 로그가 기록 되는 것을 확인할 수 있습니다.


Serilog 파일 확인

  • 다음으로, 실제로 로그 파일이 생성되어 내용이 기록 되었는지 확인합니다.
  • 저 같은 경우는, 확장자를 .json 으로 하였습니다.
  • 확인 결과, 파일 정상적으로 생성 되었고 내용도 정상적으로 기록된 것을 확인할 수 있습니다.

728x90

이 글을 공유하기

댓글

Designed by JB FACTORY