我正在尝试在 .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 上找到了这个线程 …
我有一个 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)
没有电子邮件。它写入文件,因此记录器处于活动状态。我缺少什么吗?
我有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 类中的任何设置?
我写了一个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) 我正在将 .NET Standard 实用程序库从控制台日志记录转换为ILogger日志记录。
该库由静态实用程序类组成,我公开了一个ILogger由用户设置的静态属性,以指向他们想要使用的任何日志系统。
我希望我的 .NET Core 3.1 和 .NET 5 控制台应用程序使用 Serilog 进行日志记录,并将库分配ILogger给 Serilog,并具有 Serilog 附带的所有优点。我没有在实用程序库中使用 DI,因为它是静态方法,而不是“服务”类。
如何手动(不使用 DI)Microsoft.Extensions.Logging.ILogger从 aSerilog.ILogger或Serilog.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) 我将Serilog记录器与控制台接收器一起使用来在我的项目中进行日志记录ASP.NET Core 5.0。也可以与 EF Core 5.0 一起使用,ILoggerFactory如下所示
optionsBuilder.UseLoggerFactory(serilogFactory)
Run Code Online (Sandbox Code Playgroud)
但是,当 EF Core 记录 SQL 语句时,这些行在控制台上不会显示为换行符,而是显示为\r\n。LoggerFactory但是如果我使用像ASP.NET Core下面这样的内置函数
var loggerFactory = LoggerFactory.Create(
builder => builder.AddConsole(options =>
{
})
);
optionsBuilder.UseLoggerFactory(loggerFactory);
Run Code Online (Sandbox Code Playgroud)
那么就可以了。
有办法解决这个问题吗?
我使用 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
我在 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) 我有一个 .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) 我正在尝试使用 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)