.NET Core/Serilog용 로깅 스캐폴드

5526 단어 dotnetserilog

동기 부여



로깅은 우리의 모든 서비스가 일관되게 수행되기를 바라는 포괄적인 관심사입니다. 우리는 각 서비스가 로깅을 위해 휠을 다시 만드는 것을 원하지 않습니다. 우리는 동일한 형식의 데이터를 원하고 동일한 위치로 이동하기를 원합니다.

목표



목표는 로컬 롤링 파일에 작성하고 DataDog와 같은 외부 소스에 작성하여 로깅 표준을 설정하는 간단한 라이브러리입니다. 개발자가 올바른 로깅 설정에 대해 생각하지 않고 성공에 빠지기를 바랍니다.

기본값은 적절한 로그 수준을 구성해야 하지만 appsettings.json에서 재정의할 수 있어야 합니다. 새 싱크를 만들 수 있지만 기존 기본 싱크에 추가됩니다.

또한 로깅에 필요한 모든 nuget 패키지를 캡슐화해야 합니다(Serilog를 올바르게 구성하는 데 필요한 패키지가 많기 때문에).

이 로그 라이브러리를 사용하면 일관되고 표준적인 로깅을 간단하게 추가할 수 있습니다.

로깅 라이브러리



공유 로깅 설정을 포함할 새 .NET Standard 라이브러리를 만듭니다. .csproj에는 필요한 모든 Serilog 패키지가 포함되어 있어 각 앱 호스트에 수동으로 추가해야 하는 패키지 수를 줄입니다.

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
        <nullable>enable</nullable>
        <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
        <LangVersion>latest</LangVersion>
    </PropertyGroup>

    <ItemGroup>
        <PackageReference Include="Serilog.AspNetCore" Version="3.4.0" />
        <PackageReference Include="Serilog.Settings.Configuration" Version="3.1.0" />
        <PackageReference Include="Serilog.Sinks.Async" Version="1.4.0" />
        <PackageReference Include="Serilog.Sinks.Debug" Version="1.0.1" />
        <PackageReference Include="Serilog.Sinks.File" Version="4.1.0" />
    </ItemGroup>
</Project>

LogCore.cs 파일을 프로젝트에 추가하여 모든 로깅 설정을 캡슐화합니다.

public class LogCore
{
    public static void Configure(string appName)
    {
        var environment = GetEnvironment();

        var logConfig = ConfigureDefaults(environment);
        logConfig = ConfigureFile(logConfig, appName);
        // Add more logging sinks here...

        // Set the logger instance to the configured logger.
        Log.Logger = logConfig.CreateLogger();
    }

    private static string GetEnvironment()
    {
        // The environment variable is needed for some logging configuration.
        var environment = System.Environment.GetEnvironmentVariable(Environment);
        if (environment == null)
        {
            throw new NullReferenceException($"{Environment} environment variable is not set.");
        }

        return environment;
    }

    private static LoggerConfiguration ConfigureDefaults(string environment)
    {
        // Use the appsettings.json configuration to override minimum levels and add any additional sinks.
        var config = new ConfigurationBuilder()
            .AddJsonFile($"appsettings.json")
            .AddJsonFile($"appsettings.{environment}.json", optional: true)
            .Build();

        // Minimum levels will be overriden by the configuration file if they are an exact match.
        return new LoggerConfiguration()
            .MinimumLevel.Information()
            .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
            .MinimumLevel.Override("Microsoft.AspNetCore", LogEventLevel.Warning)
            .ReadFrom.Configuration(config);
    }

    private static LoggerConfiguration ConfigureFile(LoggerConfiguration logConfig, string appName)
    {
        var fileDirectory = $"c:\\logs\\{appName}\\";
        var hostName = System.Environment.MachineName.ToLower();

        // Add a default async rolling file sink.
        return logConfig
            .WriteTo.Async(a => a.File(
                formatter: new JsonFormatter(renderMessage: true),
                path: $"{fileDirectory}\\log-{hostName}-.json",  // Auto-appends the file number to the filename (log-webvm-001.json)
                rollingInterval: RollingInterval.Day,
                fileSizeLimitBytes: 50000000, // 50 MB file limit
                rollOnFileSizeLimit: true,
                retainedFileCountLimit: 10,
                buffered: false));
    }
}

LogCore는 모든 기본 로깅을 구성합니다. 이 예에서는 표준 이름, 위치 및 롤오버 제한을 ​​사용하여 롤링 파일 작성기를 설정합니다. 또한 파일 로깅이 비동기적으로 발생함을 보장합니다.

LogCore는 Microsoft 라이브러리의 기본 로그 수준도 설정합니다. 내부 라이브러리에도 기본 로그 수준을 추가합니다. 좋은 부분은 각 로그 수준이 평소와 같이 구성에서 재정의할 수 있다는 것입니다. 라이브러리는 먼저 기본 로그 수준을 설정한 다음 기본 설정에 추가하거나 재정의할 구성 설정을 추가합니다. 따라서 로그 수준을 수정하기 위해 다음 설정을 추가할 수 있습니다.

"Serilog": {
    "MinimumLevel": {
        "Override": {
            "Microsoft": "Error"
        }

구성을 통해 새 싱크를 추가할 수도 있으며 기본 싱크 목록에 추가됩니다.

완성



Program.cs 시작 시 LogCore.Configure 호출을 추가합니다.

public static class Program
{
    public const string ApplicationName = "[APP NAME HERE]";

    public static void Main(string[] args)
    {
        LogCore.Configure(ApplicationName);

또한 호스트 빌더에 .UseSerilog() 호출을 추가하십시오.

public static IHostBuilder CreateHostBuilder(string[] args)
{
return Host.CreateDefaultBuilder(args)
.UseSerilog()

결론



이제 앱에는 각 싱크 및 로그 수준을 수동으로 구성할 필요 없이 일관된 표준 로깅이 있습니다. 이는 각각 고유한 구성이 필요한 여러 로깅 출력이 있는 경우에 유용합니다. 개발자는 교차하는 문제 대신 앱의 가치에 집중할 수 있습니다.

이를 개선하기 위한 생각/제안 사항이 있으면 알려주세요!

좋은 웹페이지 즐겨찾기