C# 在其他项目引用的类库中使用serilog

C# 在其他项目引用的类库中使用serilog,c#,serilog,C#,Serilog,我有一个包含多个.NET核心API和windows服务的解决方案。如何集成Serilog,使我不必在多个不同的位置更改添加列或更改某些属性 我正在考虑在一个公共库中添加Serilog,并在所有其他项目中使用该自定义库。然而,如何调用Serilog的起点,正如我们在Program.cs的下面代码中所看到的,任何代码引用都会有所帮助 .UseSerilog((hostingContext, loggerConfiguration) => {

我有一个包含多个.NET核心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注入到多个.NETWebAPI项目中

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

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;
        }
    }
然后,您可以将该项目的项目引用添加到您的.NETWebAPI项目中,并在其中注入Serilog,类似这样

public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .InjectSerilog()
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
然后在您的其他项目中,您可以使用此实例

public static int Main(string[] args)
{
    Log.Logger = MySerilog.GetInstance();
}
CreateHostBuilder
方法中,您只需

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

Host.CreateDefaultBuilder(args)
.useserlog()
.ConfigureWebHostDefaults(webBuilder=>
{
webBuilder.UseStartup();
});
这将适用于两种类型的项目,您也可以将
GetInstance()
参数化

你可以在这里进一步查阅

您可以在类库中创建一个扩展方法来实现这一点,并在API项目中使用该扩展方法。@honey\u ramgarhia抱歉,我不知道怎么做,请给我一个例子。谢谢。。。如果应用程序是windows服务,如何实现相同的功能。我已经在“更新”部分添加了代码,请您看一下,并帮助我如何在那里添加扩展,可能是web/windows服务应用程序的常见代码。这对我没有帮助,我觉得我被误导了。我不希望配置是通用的,配置将由每个应用程序发送,我不希望在每个应用程序中安装serilog和Encriers,因此我需要一个通用解决方案(库),以便库负责推送日志。
Host.CreateDefaultBuilder(args)
                .UseSerilog()
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });