我有以下一段 C# 代码,用于使用多个接收器(控制台和文件)编写日志,如何限制控制台仅记录(信息、警告和错误)和文件以记录所有内容。
var outputTemplate = "[{Level:u3}] {Message:lj}{NewLine}{Exception}";
// Logger
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Verbose()
.WriteTo.Console(outputTemplate: outputTemplate, theme:SystemConsoleTheme.Literate)
.WriteTo.File($"logs/log-{DateTime.Now:yyyy-MM-dd_HH:mm:ss.fff}.log")
.CreateLogger();
Run Code Online (Sandbox Code Playgroud) 我正在使用 appsettings.json 来配置 Serilog。我补充说Serilog.Exceptions,这就像一个魅力。
"Serilog": {
"Using": [ "Serilog.Sinks.Console", "Serilog.Settings.Configuration", "Serilog.Exceptions" ],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
},
"WriteTo": [
{ "Name": "Console" },
{
"Name": "File",
"Args": {
"path": "%TEMP%\\Logs\\serilog-configuration-sample.txt",
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception} {Properties:j}",
"rollingInterval": "Day"
}
}
],
"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId", "WithExceptionDetails" ]
}
Run Code Online (Sandbox Code Playgroud)
但是由于我使用的是 Sql Server 和 EF Core,文档说我还必须配置Serilog.Exceptions.SqlServer和Serilog.Exceptions.EntityFrameworkCore.
根据此文档,必须将其添加到浓缩器中。在 C# 代码中,这将是:
.Enrich.WithExceptionDetails(new DestructuringOptionsBuilder()
.WithDefaultDestructurers()
.WithDestructurers(new[] { new …Run Code Online (Sandbox Code Playgroud) 我们正在编写新的日志记录功能并将其注入到我们现有的服务中。
以下是我们的做法:
1) 使用 Program.cs 中的 UseSerilog() 调用设置 Serilog
2) 在 appsettings.json 中设置 Serilog 配置以设置写入日志文件的接收器。
3) 编写了一个 Facade 自定义 Logger 类,它使用 Serilog 全局 Log 实例在内部进行日志记录。
public class MyLogger<T> : IMyLogger<T>
public MyLogger()
{
_logger = Log.ForContext(typeof(T));
}
public void LogInformation(Exception ex)
{
_logger.Information(ex.Message);
}
Run Code Online (Sandbox Code Playgroud)
4) 通过 DI 将 IMyLogger 注入到我现有的所有服务中
5)在ConfigureServices()中注册所有服务(Logger、Project相关服务)
一切正常。但我想为应用程序中的不同命名空间设置不同的日志级别,以便在生产中我可以在配置中简单设置仅 4-5 个重要的核心命名空间,其日志记录方法调用 (MyLogger.LogInformation()) 将发送到日志文件。
像下面这样的事情可能吗?因为 MyLogger 是记录日志的类。但如果调用来自 MyProject.CartManager 命名空间,那么它应该根据示例中下面的配置自动记录。
请分享您的想法。
例如:
"Serilog": {
"Using": [ "Serilog.Sinks.File" ],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"System": "Information",
"MyProject.Inventory": …Run Code Online (Sandbox Code Playgroud) 我需要使用 Serilog.Exceptions 包来捕获异常。Serilog 是从 appsettings.json 读取的
{
"Serilog": {
"Using": [
"Serilog.Sinks.RollingFile",
"Serilog.Sinks.Seq"
],
"WriteTo": [
{
"Name": "RollingFile",
"Args": {
"restrictedToMinimumLevel": "Debug",
"pathFormat": "myPath\\log-{Date}.log"
}
},
{
"Name": "RollingFile",
"Args": {
"restrictedToMinimumLevel": "Error",
"pathFormat": "myPath\\error-{Date}.log"
}
},
{
"Name": "Seq",
"Args": {
"serverUrl": "myUrl",
"apiKey": "myApiKey"
}
}
],
"Enrich": [
"FromLogContext",
"WithMachineName",
"WithThreadId"
],
"Properties": {
"Application": "myApplicationName"
}
}
}
Run Code Online (Sandbox Code Playgroud)
在我的startup.cs中
var logger = new LoggerConfiguration()
.Enrich.WithExceptionDetails()
.ReadFrom.Configuration(Configuration)
.CreateLogger();
Log.Logger = logger;
Run Code Online (Sandbox Code Playgroud)
但这不起作用。我是否需要在 Serilog.Exceptions 包的 appsettings.json …
我正在使用滚动将所有日志写入一个文件。但我想通过Information,Warning和Exceptions滚动文件将它们分开。
我当前的配置是这样的
"Serilog": {
"WriteTo": [
{
"Name": "RollingFile",
"Args": {
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] {Message}{NewLine}{Exception}",
"pathFormat": "logs\\log-{Hour}.log",
"rollOnFileSizeLimit ": true,
"retainedFileCountLimit ": null,
"rollingInterval": "Hour",
"fileSizeLimitBytes": 5000000
}
}
]
},
Run Code Online (Sandbox Code Playgroud)
班级
public ILogger GetLogger()
{
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
_logger =
new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.CreateLogger();
return _logger ;
}
Run Code Online (Sandbox Code Playgroud) 我想了解如何在 PS 中使用 SeriLog。
这是一个有效的代码示例:
$SeriLog = Add-Type -Path "C:\Program Files\PackageManagement\Serilog.2.10.0\lib\net46\Serilog.dll" -PassThru
$SeriLog_Sink_Console = Add-Type -Path "C:\Program Files\PackageManagement\Serilog.Sinks.Console.3.1.1\lib\net45\Serilog.Sinks.Console.dll" -PassThru
$SeriLog_Config = New-Object Serilog.LoggerConfiguration
$SeriLog_Config = [Serilog.Configuration.LoggerSinkConfiguration]$SeriLog_Config_Sink = $SeriLog_Config.WriteTo
[Serilog.Log]::Logger = [Serilog.ConsoleLoggerConfigurationExtensions]::Console($SeriLog_Config_Sink).CreateLogger()
[Serilog.Log]::Information("Logging started")
Run Code Online (Sandbox Code Playgroud)
根据 dotnet SeriLogs 网站上列出的示例,我不明白的是为什么我的所有接收器都丢失了。
例子:
$SeriLog = Add-Type -Path "C:\Program Files\PackageManagement\Serilog.2.10.0\lib\net46\Serilog.dll" -PassThru
$SeriLog_Sink_Console = Add-Type -Path "C:\Program Files\PackageManagement\Serilog.Sinks.Console.3.1.1\lib\net45\Serilog.Sinks.Console.dll" -PassThru
$SeriLog_Config = New-Object Serilog.LoggerConfiguration
$SeriLog_Config.WriteTo.Console()
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
InvalidOperation:方法调用失败,因为 [Serilog.Configuration.LoggerSinkConfiguration] 不包含名为“Console”的方法。
这在某种程度上是有道理的,因为我可以看到它丢失了,但我不明白为什么?我已经导入了两个 DLL。我想对我来说,在理解如何在 PS 中使用 DLL 方面我还是个新手。我的运气要好得多,并且使用 Log4Net 拥有一个可靠工作的模块,但我正在尝试迁移到更现代的东西,并且我正在绞尽脑汁试图了解如何集成各种接收器,如果公共示例dotnet 不翻译为 PS。
JFYI,我正在使用 PS 7.1,以防万一。
我们正在使用下面的一段 serilog 代码,它将事件写入控制台和文件,文件和控制台日志记录在我的机器上工作正常,但在其他开发人员机器上控制台日志记录工作,但文件日志记录不起作用,这增加了奇怪之处不过,“logs”文件夹已创建。是否需要进行任何额外的设置?
public static void SetupLogger()
{
//var outputTemplate = "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}";
var outputTemplate = "[{Level:u3}] {Message:lj}{NewLine}{Exception}";
// Logger
//var outputTemplate = "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level:u4}] | {Message:l}{NewLine}{Exception}";
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Verbose()
.WriteTo.Console(outputTemplate: outputTemplate, theme:SystemConsoleTheme.Literate,restrictedToMinimumLevel:LogEventLevel.Information)
.WriteTo.File($"logs/log-{DateTime.Now:yyyy-MM-dd_HH:mm:ss.fff}.log")
.CreateLogger();
}
Run Code Online (Sandbox Code Playgroud)