我正在开始使用Serilog,但我不知道如何将 ILogger 依赖项注入到我的类中。如果我使用 ASP.NET Core 5,这很容易,但我使用的是 .NET Core 控制台应用程序。我怎样才能做类似的事情?
public class TestStrategy
{
private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType.Name);
...
}
Run Code Online (Sandbox Code Playgroud)
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
var logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.CreateLogger();
Run Code Online (Sandbox Code Playgroud)
我必须 DIlogger进入所有课程吗?
使用 Serilog 的 ASP.NET Core 5 Razor 页面
UseStatusCodePagesWithReExecute 按预期工作,并在进入我的 /CustomError 页面后重新执行页面。
如何抑制对重新执行页面的第二次调用的 Serilog 日志记录?
密码-postgres完整示例
// program.cs
public static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
// if only do warning, then will get duplicate error messages when an exception is thrown, then again when re-executed
// we do get 2 error message per single error, but only 1 stack trace
.MinimumLevel.Override("Microsoft.AspNetCore", LogEventLevel.Fatal)
.Enrich.FromLogContext()
.WriteTo.Console()
.CreateLogger();
try
{
Log.Information("Starting up");
CreateHostBuilder(args).Build().Run();
}
catch (Exception ex)
{
Log.Fatal(ex, …Run Code Online (Sandbox Code Playgroud) 我正在尝试开始登录 ElasticSearch,但在服务器中找不到日志,如果我启用诊断模式,则会引发异常:
这就是我的 Startup.cs 的样子:
//ElasticSearch Logs
Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("https://myserver.com:9243/"))
{
ModifyConnectionSettings = x => x.BasicAuthentication("elastic", "mypassword"),
AutoRegisterTemplate = true,
})
.Enrich.FromLogContext()
.WriteTo.Console()
.CreateLogger();
Run Code Online (Sandbox Code Playgroud)
以下是我的Program.cs
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>()
.UseSerilog();
});
Run Code Online (Sandbox Code Playgroud)
这就是我在控制器中的内容:
_logger.LogError(new Exception("test"), "An error has occurred.");
_logger.LogInformation("The {User} has just executed {Action}.", "username", "actionName");
Log.Error("this is my first log");
Run Code Online (Sandbox Code Playgroud)
我得到的异常:
2021-08-19T21:09:15.2793348Z 无法创建模板。Elasticsearch.Net.ElasticsearchClientException:请求执行失败。调用:状态代码 400 来自:PUT /_template/serilog-events-template。ServerError:类型:mapper_parsing_Exception原因:“无法解析映射[_doc]:根映射定义具有不受支持的参数:[默认值:{dynamic_templates = [{numerics_in_fields = {match_pattern = regex,path_match = fields。[\ d …
我有一个带有 Serilog 块的 .NET 5.0 控制台应用程序。appsettings.json 的 serilog 部分如下所示:
"Enrich": [ "FromLogContext", "WithMachineName", "WithProcessId", "WithThreadId" ],
"WriteTo": [
{
"Name": "Console",
"Args": {
"outputTemplate": "[{Timestamp:HH:mm:ss.fff} [{Level}] {SourceContext} {Message}{NewLine}{Exception}",
"theme": "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Code, Serilog.Sinks.Console"
}
},
{
"Name": "File",
"Args": {
"path": "/Logs/SharedTreatment_logs.txt",
"outputTemplate": "{Timestamp:G} {SourceContext} [{Level}] {Message}{NewLine:1}{Exception:1}",
"formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog",
"fileSizeLimitBytes": 1000000,
"rollOnFileSizeLimit": "true",
"shared": "true",
"flushToDiskInterval": 3
}
}
]
Run Code Online (Sandbox Code Playgroud)
它加载了以下代码:
Serilog.Debugging.SelfLog.Enable(Console.Error);
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
var logger = loggerConfiguration.ReadFrom.Configuration(configuration).CreateLogger();
Log.Logger = logger?.ForContext<T>() ?? throw new ArgumentNullException(nameof(logger));
Host.CreateDefaultBuilder(args).UseSerilog((hostingContext, …Run Code Online (Sandbox Code Playgroud) 使用(.Net 6.0)我试图输出一些额外的默认信息与所有日志当我输出到控制台时我看不到属性,但是如果我启用 Json 并输出到文件它一切正常,想知道你是否有任何线索?
public class Program
{
public static int Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
Log.Logger = new LoggerConfiguration()
//.WriteTo.File(new Serilog.Formatting.Json.JsonFormatter(), "Logs/log-.txt", fileSizeLimitBytes: 5242880, rollOnFileSizeLimit: true, rollingInterval: RollingInterval.Day, shared: true)
.Enrich.FromLogContext()
.Enrich.WithProcessId()
.Enrich.WithProcessName()
.Enrich.WithProperty("Prop1", "ABC123")
.Enrich.WithProperty("Prop2", "1.00")
.Enrich.WithProperty("PID", Process.GetCurrentProcess().Id)
.WriteTo.Console()
.CreateLogger();
builder.Host.UseSerilog();
// Add services to the container.
var app = builder.Build();
// Configure the HTTP request pipeline.
app.MapGet("/weatherforecast", () =>
{
Log.Information("Hello....");
return forecast;
});
try
{
app.Run();
}
catch (Exception ex)
{
ex.ToString();
}
finally …Run Code Online (Sandbox Code Playgroud) 在我的 ASP.NET Core-6 Web API 中,我安装了 Serilog。我从未安装过 Microsoft.Extensions.Logging
但令我惊讶的是,当我想使用以下方式引用 Serilog 时:
using ILogger = Serilog.ILogger;
public class AuthController : BaseApiController
{
private readonly ILogger<AuthController> _logger;
private IAuthService _authService;
public AuthController(ILogger<AuthController> logger, IAuthService authService)
{
_logger = logger;
_authService = authService;
}
}
Run Code Online (Sandbox Code Playgroud)
ILogger自动检测Microsoft.Extensions.Logging,我无法更改为Serilog。
我该如何解决这个问题?
谢谢
我有一个 Web api (.NET Core 3.1),它使用 Serilog 进行日志记录。Serilog很早就被添加到了IWebHostBuilder:
public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
return WebHost
.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseSerilog((context, configuration) =>
{
if (context.HostingEnvironment.IsDevelopment())
{
configuration.WriteTo.Console(LogEventLevel.Debug);
return;
}
configuration.WriteTo.ApplicationInsights(TelemetryConverter.Traces, LogEventLevel.Error);
});
}
Run Code Online (Sandbox Code Playgroud)
这意味着(据我所知)我此时需要已经配置了记录器。所以这是我主要做的第一件事:
public static int Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(Configuration)
.CreateLogger();
var host = CreateWebHostBuilder(args).Build();
host.Run();
}
Run Code Online (Sandbox Code Playgroud)
但该线路.ReadFrom.Configuration(Configuration)需要进行配置。StartUp这通常是在此时尚未运行的(同样,afaik)中完成的。显然我可以LoggerConfiguration稍后移动,但.UseSerilog会在配置之前调用。
IConfugration那么,当我还没有设置Serilog 时,如何配置它呢?
我使用ELK堆栈来记录应用程序错误,但Serilog不会记录到elasticsearch。
\n使用的elasticsearch版本是8.3.2。
\n日志配置program.cs:
builder.UseSerilog((hostBuilder, serviceProvider, loggerConfiguration) =>\n{\n var appSettings = hostBuilder.Configuration.GetSection(nameof(AppSettings)).Get<AppSettings>();\n\n CreateBasicLoggerConfiguration(loggerConfiguration)\n .WriteTo.File(logPath, rollingInterval: RollingInterval.Hour)\n .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri(appSettings.ElasticsearchSettings.Uri))\n {\n IndexFormat = $"\xd9\x8eapp-logs-{environment.EnvironmentName.Replace(".","-")}-{DateTimeOffset.Now.LocalDateTime:yyyy-MM}",\n AutoRegisterTemplate = true\n });\n});\nRun Code Online (Sandbox Code Playgroud)\n并且,elasticsearch设置为appsettings.json:
"ElasticsearchSettings": {\n "Uri" : "http://localhost:9200"\n}\nRun Code Online (Sandbox Code Playgroud)\n添加并使用了以下软件包:
\n<PackageReference Include="Serilog.AspNetCore" Version="5.0.0" />\n<PackageReference Include="Serilog.Enrichers.ClientInfo" Version="1.1.4" />\n<PackageReference Include="Serilog.Enrichers.Environment" Version="2.2.0" />\n<PackageReference Include="Serilog.Sinks.Elasticsearch" Version="8.4.1" />\nRun Code Online (Sandbox Code Playgroud)\n一切看起来都正常,但是没有登录到elastichsearch。
\n在 Visual Studio 中运行应用程序时,我喜欢在控制台窗口中显示彩色消息。但是输出窗口中是否也可以显示颜色?现在都是单色的。