簡體   English   中英

在其他項目引用的 class 庫中使用 serilog

[英]Using serilog in a class library referenced by other projects

我有一個包含多個 .NET Core API 和 windows 服務的解決方案。 我怎樣才能集成 Serilog,這樣我就不需要在幾個不同的地方進行更改以添加列或更改某些屬性?

我正在考慮在公共庫中添加 Serilog 並在所有其他項目中使用該自定義庫,但是如何調用 serilog 的起點,正如我們在 Program.cs 中的以下代碼中看到的那樣,任何代碼參考都會有所幫助。

 .UseSerilog((hostingContext, loggerConfiguration) =>
                {
                    loggerConfiguration.MinimumLevel.Debug()
                            .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
                            .Enrich.FromLogContext()
                            .WriteTo.File(path: Path.Combine(Environment.CurrentDirectory, "Logs", "log.txt"),
                                rollOnFileSizeLimit: true,
                                retainedFileCountLimit: 20,
                                rollingInterval: RollingInterval.Day,
                                fileSizeLimitBytes: 10000
                                )
                            .WriteTo.Console();
                })

================更新===================

For windows service, I have the code in common library.
public class LogManager : ILogManager
    {
       public LogManager()
            {
                Log.Logger = new LoggerConfiguration()
                             .MinimumLevel.Verbose()
                             .Enrich.FromLogContext()
                             //  .WriteTo.Console(LogEventLevel.Debug, OutputTemplate, theme: AnsiConsoleTheme.Code)
                             .WriteTo.RollingFile(@"C:\Users\hnq6ww\Documents\Important\logs.txt",
                                                        LogEventLevel.Verbose,
                                                        // OutputTemplate,
                                                        retainedFileCountLimit: (int?)RollingInterval.Day,
                                                        buffered: true, fileSizeLimitBytes: 10000)
                             .CreateLogger();
            }
}

在 Program.cs 中

  static void Main(string[] args)
        {
            ILogManager log = new LogManager();
            log.WriteLog(Serilog.Events.LogEventLevel.Information, "Testing");
        }

在您的公共庫中,您可以創建一個擴展方法,將 Serilog 注入您的多個 .NET Web API 項目

因此,您可以在常見的 class 庫中擁有類似的東西

public static class SerilogDi
    {
        public static IHostBuilder InjectSerilog(this IHostBuilder hostBuilder)
        {
            hostBuilder.UseSerilog((hostingContext, loggerConfiguration) =>
            {
                loggerConfiguration.MinimumLevel.Debug()
                        .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
                        .Enrich.FromLogContext()
                        .WriteTo.File(path: Path.Combine(Environment.CurrentDirectory, "Logs", "log.txt"),
                            rollOnFileSizeLimit: true,
                            retainedFileCountLimit: 20,
                            rollingInterval: RollingInterval.Day,
                            fileSizeLimitBytes: 10000
                            )
                        .WriteTo.Console();
            });

            return hostBuilder;
        }
    }

然后您可以將此項目的項目參考添加到您的 .NET Web API 項目中並在其中注入 Serilog,如下所示

public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .InjectSerilog()
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });

此外,您可以將InjectSerilog()參數化,以便在每個項目的基礎上進一步配置它。

更新好的,根據您的更新,我認為您只想配置通用。 所以你可以做的是在你的公共庫中創建一個 static 方法,它返回一個配置的記錄器。

public static class MySerilog
    {
        public static Logger GetInstance()
        {
            return new LoggerConfiguration()
                             .MinimumLevel.Verbose()
                             .Enrich.FromLogContext()
                             //  All my settings here
                             .CreateLogger();
        }
    }

然后在你的其他項目中你可以使用這個實例

public static int Main(string[] args)
{
    Log.Logger = MySerilog.GetInstance();
}

在您的CreateHostBuilder方法中,您可以簡單地做

Host.CreateDefaultBuilder(args)
                .UseSerilog()
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });

這適用於您的兩種類型的項目,您也可以將GetInstance()參數化!

您可以進一步參考這里https://github.com/serilog/serilog-aspnetcore

如果要將日志記錄邏輯移動到單獨的庫中,則需要執行以下步驟。

第一步是在 class 庫中創建日志記錄邏輯:

public interface ILoggerService
{
    void Info(Serilog.Events.LogEventLevel.Information info, Message message );
}

public class LoggerService : ILoggerService
{   
    public void Write(LogEventLevel level, Message message) =>
        Serilog.Log.Write(serilogEvents[level], JsonConvert.SerializeObject(message));
        
}

然后你需要在你的 class 庫中創建一個擴展方法來在其他項目中注冊你的服務:

public static class LoggingServiceExtensions
{
    public static IServiceCollection RegisterMyLogger(this IServiceCollection services, 
        IConfiguration configuration)
    {
        Log.Logger = new LoggerConfiguration().ReadFrom
            .Configuration(configuration).CreateLogger();

        services.AddSingleton<ILoggerService, LoggerService>();

        return services;
    }
}

如果你打算在 ASP.NET Core MVC 或 Web API 中使用這個庫,那么只需注冊你的庫:

public void ConfigureServices(IServiceCollection services)
{
    services.ConfigBaseServiceSettings<AppSettings>(Configuration);
    services.RegisterMyLogger(Configuration);
}

不要忘記在 class 庫中通過 NuGet 安裝以下依賴項:

Serilog 
Serilog.Settings.Configuration

如果需要,還可以使用其他庫:

Serilog.Sinks.Console
Serilog.Sinks.Http
Serilog.Sinks.MSSqlServer

我只是根據 honey_ramgarhia 的回答提出了可用性建議

我將 serilog 的用法包裝在一個通用的幫助庫中。 這樣只有主程序(Service、Webapp等)和公共庫需要引用serilog nuget package。

public static class LogHelper
{
    public static Logger GetInstance()
    {
        return new LoggerConfiguration()
                .MinimumLevel.Debug()
                .MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
                .Enrich.FromLogContext()
                .WriteTo.File(GetLogFilePath())
                .CreateLogger();
    }

    public static void LogText(string text)
    {
        Log.Information(text);
    }

    public static void LogException(Exception ex)
    {
        Log.Fatal(ex.Message + ";" + ex.InnerException + "Stacktrace:" + ex.StackTrace, Encoding.Default);
    }

    public static void End()
    {
        Log.CloseAndFlush();
    }    

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM