标签: serilog

Serilog 命名连接字符串

我正在尝试在 .Net core 上配置 Serilog 以使用命名连接字符串写入 SQL 表。如果我将连接字符串直接放在 appsettings 文件的“Serilog”部分中,我就可以让一切正常工作。但我希望它使用与实体框架相同的连接字符串,所以我不想定义它两次。另外,出于安全原因,建议似乎不要将此信息直接存储在 appsettings 文件中。

这是设置文件的相关部分:

{
    "Name": "MSSqlServer",
    "Args": {
        "connectionString": "Development",
        "schemaName": "app",
        "tableName": "Logs",
        "restrictedToMinimumLevel": "Information"
    }
}
Run Code Online (Sandbox Code Playgroud)

开发连接字符串是在 Visual Studio 中的“用户机密”中定义的。

{
    "ConnectionStrings": {
        "Development": "Server=...",
        "Staging": "Server=...",
        "Production": "Server=..."
    }
}
Run Code Online (Sandbox Code Playgroud)

正如我所提到的,如果我用实际的字符串替换“Development”,它就可以工作。我还应该补充一点,实体框架正在使用开发连接字符串,因此我非常确定该字符串本身是好的。

我以这种方式在 Startup.Configure 方法中加载配置

Log.Logger = new LoggerConfiguration()
    .ReadFrom.Configuration(_configuration)
    .CreateLogger();
Run Code Online (Sandbox Code Playgroud)

奇怪的是,如果我在同一方法中手动添加 MSSqlServer 对象,它将起作用(在删除 appsetting 文件的 MSSqlServer 部分之后)。显然这并不理想,因为更改任何属性都需要重新编译应用程序

Log.Logger = new LoggerConfiguration()
    .ReadFrom.Configuration(_configuration)
    .WriteTo.MSSqlServer(
        connectionString: _configuration.GetConnectionString(env.EnvironmentName),
        schemaName: "app",
        tableName: "Logs",
        restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Information
    )
   .CreateLogger();
Run Code Online (Sandbox Code Playgroud)

我在 GitHub 上找到了这个线程 …

serilog .net-core

6
推荐指数
1
解决办法
5533
查看次数

使用 Serilog 记录到电子邮件接收器

我有一个 aspnet core 应用程序,我正在尝试配置 serilog 来向我发送电子邮件,但没有成功。

我有这样的配置:

  Log.Logger = new LoggerConfiguration()
                 .MinimumLevel.Information()
                .MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
                .Enrich.FromLogContext()
                .WriteTo.File("1.log", LogEventLevel.Information, fileSizeLimitBytes: 10_000_000, rollOnFileSizeLimit: true, shared: true)
                .WriteTo.Email(new EmailConnectionInfo
                {
                    FromEmail = "xxx@gmail.com",
                    ToEmail = "yyy@gmail.com",
                    MailServer = "smtp.gmail.com",
                    NetworkCredentials = new NetworkCredential
                    {
                        UserName = "user",
                        Password = "pass"
                    },
                    EnableSsl = true,
                    Port = 587,
                    EmailSubject = "Error in app"
                }, restrictedToMinimumLevel: LogEventLevel.Error, batchPostingLimit: 1)
                .CreateLogger();
Run Code Online (Sandbox Code Playgroud)

没有电子邮件。它写入文件,因此记录器处于活动状态。我缺少什么吗?

c# serilog asp.net-core

6
推荐指数
1
解决办法
8611
查看次数

读取 serilog 的 appconfig 文件

我有Logger.cs一个类,我正在初始化 serilog 设置,如下所示:

_logger = new LoggerConfiguration()
                .ReadFrom.AppSettings()
                .MinimumLevel.Debug()
                .WriteTo.File(_filepath, restrictedToMinimumLevel: LogEventLevel.Debug, shared: true, rollOnFileSizeLimit: true)
                .CreateLogger();
Run Code Online (Sandbox Code Playgroud)

我想从 app.config 文件中读取文件的大小。我有如下的 app.config 文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="serilog:using:File" value="Serilog.Sinks.File" />
    <add key="serilog:write-to:File.fileSizeLimitBytes" value="2000" />
  </appSettings>
</configuration>
Run Code Online (Sandbox Code Playgroud)

但看起来appsettings根本就没有读过。因为我可以看到生成了超过 2kb 的文件。我在这里错过了什么?

我的记录器类将如何从文件中读取app.config,我是否错过了 assemblyinfo 类中的任何设置?

c# serilog

6
推荐指数
1
解决办法
1万
查看次数

Serilog 在其输出中写入重复的条目

我写了一个Windows Service记录它的操作使用Serilog

该应用程序还使用Autofac依赖注入支持和Seq进行结构化日志记录。

 using Autofac;
 public class ContainerInitiator
 {
       public static IContainer BuildContainer()
       {
          var _builder = new ContainerBuilder();
          var logger = LoggerUtility.CreateLogger();
          _builder.RegisterInstance(logger).As<ILogger>().SingleInstance();
          var container = _builder.Build();
          ContainerFactory.SetContainer(container);
          return container;
        }
  }
Run Code Online (Sandbox Code Playgroud)

这是日志实用程序类

public class LoggerUtility
{
    private static string connectionString = ConfigurationManager.AppSettings["applicationName"];
    public static ILogger CreateLogger()
    {
        return GetLoggerConfiguration().CreateLogger();
    }
    private static LoggerConfiguration GetLoggerConfiguration()
    {
        var config = new LoggerConfiguration()
            .ReadFrom.AppSettings();
        config = config.
           Enrich.WithProperty("ApplicationName", connectionString).
           Enrich.WithExceptionDetails().
           Enrich.WithMachineName().
           Enrich.WithProcessId().
           Enrich.WithThreadId().
           ReadFrom.AppSettings(); …
Run Code Online (Sandbox Code Playgroud)

c# windows-services serilog

6
推荐指数
1
解决办法
5254
查看次数

如何从 Serilog.ILogger 创建 MELA.ILogger 以在 .NET 标准库中使用

我正在将 .NET Standard 实用程序库从控制台日志记录转换为ILogger日志记录。

该库由静态实用程序类组成,我公开了一个ILogger由用户设置的静态属性,以指向他们想要使用的任何日志系统。

我希望我的 .NET Core 3.1 和 .NET 5 控制台应用程序使用 Serilog 进行日志记录,并将库分配ILogger给 Serilog,并具有 Serilog 附带的所有优点。我没有在实用程序库中使用 DI,因为它是静态方法,而不是“服务”类。

如何手动(不使用 DI)Microsoft.Extensions.Logging.ILogger从 aSerilog.ILoggerSerilog.Extensions.Logging.SerilogLoggerFactory.

与示例代码相比,有什么更简单的方法的建议吗?

// How to create a "Microsoft.Extensions.Logging.ILogger" from a "Serilog.ILogger"?
Microsoft.Extensions.Logging.ILogger logger = Microsoft.Extensions.Logging.Abstractions.NullLogger.Instance;

// https://github.com/serilog/serilog-extensions-logging/blob/dev/samples/Sample/Program.cs
LoggerProviderCollection providerCollection = new LoggerProviderCollection();

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Debug()
    .Enrich.FromLogContext()
    .WriteTo.Console()
    .WriteTo.Providers(providerCollection)
    .CreateLogger();

ServiceCollection serviceCollection = new ServiceCollection();
serviceCollection.AddSingleton(providerCollection);
serviceCollection.AddSingleton<ILoggerFactory>(sc =>
{
    LoggerProviderCollection loggerProviderCollection = sc.GetService<LoggerProviderCollection>();
    SerilogLoggerFactory serilogLoggerFactory = …
Run Code Online (Sandbox Code Playgroud)

c# serilog

6
推荐指数
1
解决办法
1488
查看次数

Serilog 控制台接收器输出换行符为 \r\n

我将Serilog记录器与控制台接收器一起使用来在我的项目中进行日志记录ASP.NET Core 5.0。也可以与 EF Core 5.0 一起使用,ILoggerFactory如下所示

optionsBuilder.UseLoggerFactory(serilogFactory) 
Run Code Online (Sandbox Code Playgroud)

但是,当 EF Core 记录 SQL 语句时,这些行在控制台上不会显示为换行符,而是显示为\r\nLoggerFactory但是如果我使用像ASP.NET Core下面这样的内置函数

var loggerFactory = LoggerFactory.Create(
    builder => builder.AddConsole(options =>
    {
    })
);
optionsBuilder.UseLoggerFactory(loggerFactory);
Run Code Online (Sandbox Code Playgroud)

那么就可以了。

有办法解决这个问题吗?

serilog asp.net-core asp.net-core-5.0

6
推荐指数
1
解决办法
4557
查看次数

Serilog不将日志输出到txt文件中

我使用 dotnet worker 服务(.net 5),我集成了 serilog 以及丰富器和接收器。但由于某种原因,我在文件日志中看不到任何输出。

这是我的 appsettings.json

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=.;Database=eeee;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
  "WorkerOptions": {
    "Batch": 5
  },
  "Serilog": {
    "Using": [],
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft": "Warning",
        "System": "Warning"
      }
    },
    "Enrich": [ "FromLogContext", "WithMachineName", "WithProcessId", "WithThreadId" ],
    "WriteTo": [
      { "Name": "Console" },
      {
        "Name": "File",
        "Args": {
          "path": "E:\\Logs\\log_.txt",
          "outputTemplate": "{Timestamp:o} {Message}{NewLine:1}{Exception:1}",
          "rollingInterval": "Day",
          "retainedFileCountLimit": 7
        }
      },
      {
        "Name": "File",
        "Args": {
          "path": "E:\\Logs\\log_.json",
          "formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog",
          "outputTemplate": "{Timestamp:o} {Message}{NewLine:1}{Exception:1}",
          "rollingInterval": "Day", …
Run Code Online (Sandbox Code Playgroud)

c# backgroundworker serilog asp.net-core asp.net-core-webapi

6
推荐指数
1
解决办法
1万
查看次数

在 Net 6 中使用 WebApplicationBuilder 配置 Serilog

我在 Net Core 5 中使用推荐的方法配置 Serilog:

public static void Main(string[] args) {

  Log.Logger = new LoggerConfiguration().WriteTo.Console().CreateLogger();
    
  try {
    Log.Information("Starting up");
    CreateHostBuilder(args).Build().Run();
  }
  catch (Exception ex) {
    Log.Fatal(ex, "Application start-up failed");
  }
  finally {
    Log.CloseAndFlush();
  }

}

public static IHostBuilder CreateHostBuilder(string[] args) =>
  Host.CreateDefaultBuilder(args)
    .UseSerilog() 
    .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
Run Code Online (Sandbox Code Playgroud)

如何使用以下命令在 Net 6 中配置 Serilog WebApplicationBuilder

var builder = WebApplication.CreateBuilder(args);

// Configure Serilog

var app = builder.Build();
Run Code Online (Sandbox Code Playgroud)

serilog asp.net-core asp.net-core-6.0 .net-6.0

6
推荐指数
2
解决办法
6356
查看次数

如何使用 .NET 6 的新的最小托管模型在集成测试中使 Serilog 保持沉默

我有一个 .NET 6 Web API 项目,其中包含一些 API 端点的现有集成测试。该项目使用 Serilog 进行日志记录,到目前为止一切都很好。

我将代码迁移到新的最小托管模型,删除了进程中的 Startup 类。我修复了集成测试以使用新模型,到目前为止一切都在运行。我遇到的唯一问题是,集成测试现在垃圾邮件日志语句。

对于 Serilog,我有两个阶段的设置,这就是 Program.cs 的样子:

public partial class Program
{
  public static string ApplicationVersion => typeof(Program).Assembly
                                              .GetCustomAttribute<AssemblyInformationalVersionAttribute>()
                                              .InformationalVersion;

  /// <summary>
  /// Hack to prevent duplicate logger initialization when integration tests run in parallel.
  /// </summary>
  public static bool IsIntegrationTestRun = false;

  public static int Main(string[] args)
  {
    var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production";

    if (!IsIntegrationTestRun)
    {
      // extra logger only for app startup
      Log.Logger = new LoggerConfiguration()
        .Enrich.FromLogContext() …
Run Code Online (Sandbox Code Playgroud)

c# integration-testing serilog asp.net-core .net-6.0

6
推荐指数
1
解决办法
2095
查看次数

Serilog 不使用 Serilog.Sinks.MssqlServer 将日志写入 SQL Server

我正在尝试使用 Serilog 建立日志记录机制。我想将日志写入文件和 SQL Server 数据库。

目前我可以将日志写入文件系统,但无法写入数据库。我还做了与 Serilog 文档中相同的简单设置

谢谢。

public class Program
{
        public static void Main(string[] args)
        {
            var logDB = @"Server=localhost;Initial Catalog=SHARED_NOTE;User ID=sa;Password=sql123;";
            var sinkOpts = new MSSqlServerSinkOptions();
            sinkOpts.TableName = "Logs";
            var columnOpts = new ColumnOptions();
            columnOpts.Store.Remove(StandardColumn.Properties);
            columnOpts.Store.Add(StandardColumn.LogEvent);
            columnOpts.LogEvent.DataLength = 2048;
            columnOpts.TimeStamp.NonClusteredIndex = true;

            Log.Logger = new LoggerConfiguration()
                .WriteTo.File(new CompactJsonFormatter(), "Log.json", rollingInterval: RollingInterval.Day)
                .WriteTo.Console(restrictedToMinimumLevel:Serilog.Events.LogEventLevel.Information)
                .WriteTo.MSSqlServer(
                        connectionString: logDB,
                        sinkOptions: sinkOpts,
                        columnOptions: columnOpts
                 )
                .CreateLogger();

            try
            {
                Log.Information("Application starting up.");

                CreateHostBuilder(args).Build().Run();
            }
            catch (Exception ex)
            {
                Log.Fatal(ex, "The application …
Run Code Online (Sandbox Code Playgroud)

.net c# serilog asp.net-core-webapi asp.net-core-5.0

6
推荐指数
1
解决办法
1万
查看次数