首页 > 解决方案 > 在其他项目引用的类库中使用 serilog

问题描述

我有一个包含多个 .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");
        }

标签: c#serilog

解决方案


在您的公共库中,您可以创建一个扩展方法,将 Serilog 注入您的多个 .NET Web API 项目

所以你可以在你的公共类库中有这样的东西

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()参数化以在每个项目的基础上进一步配置它。

更新 好的,根据您的更新,我认为您只想配置通用。所以你可以做的是在你的公共库中创建一个静态方法,它返回一个配置的记录器。

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


推荐阅读