我发现了serilog(.net的结构化日志),并发现了很多优点.但是我遇到了一些问题.我有4个项目,一个是web,一个是基础设施,另外两个是windows服务,我想声明一次serilog配置并多次使用它.而且我也希望将它与依赖注入一起使用.我已经在网上搜索了三天了,但我没有找到任何有用的东西,请一些人帮助我.
例如,我希望这个类成为我的日志类.
public interface IMyLogger
{
void Information(string message, object[] parameters);
}
public class MyLogger : IMyLogger
{
public MyLogger()
{
}
public void Information(string message, object[] parameters)
{
Log.Information("LogType : {LogType} - Operation : {Operation}", parameters);
}
}
public class UserClass
{
private readonly IMyLogger _myLogger;
public UserClass(IMyLogger myLogger)
{
_myLogger = myLogger;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我不知道应该把这行代码放在哪里:
Log.Logger = new LoggerConfiguration()
.WriteTo.Console()
.CreateLogger();
Run Code Online (Sandbox Code Playgroud)
Tnx提前.
有没有办法从日志类中获取完整的文件名?记录器创建一个格式如下的文件C:\MyPath\log-20160631.txt
我无法访问用于记录器初始化的源文件名。
编辑:这是记录器的初始化:
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.LiterateConsole()
.WriteTo.RollingFile(@"C:\MyPath\log.txt")
.CreateLogger();
Run Code Online (Sandbox Code Playgroud)
在代码中的每个位置我都可以使用例如Log.Information(),但是我如何获取接收器信息?我想获取传递给滚动文件接收器的文件名。
我当前的解决方法是手动生成真实文件(疯狂丑陋的代码):
public string LogFilename
{
get
{
string path = Path.GetDirectoryName(LogFilenameTemplate);
string filenameWithoutExtension = Path.GetFileNameWithoutExtension(LogFilenameTemplate);
string extension = Path.GetExtension(LogFilenameTemplate);
string date = DateTime.Now.ToString("yyyyMMdd");
string fullFilename = Path.Combine(path, filenameWithoutExtension + "-" + date + extension);
return fullFilename;
}
}
Run Code Online (Sandbox Code Playgroud)
我从GitHub Repo获得的格式。
最近我配置了Serilog以与ASP.NET Core 2 MVC应用程序配合使用,接下来的任务是在系统的每一层上跟踪传入的Web应用程序请求.所以基本上,我们想要传播一些令牌(比如RequestId由Serilog生成到较低层的应用程序).
"Serilog": {
"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.RollingFile" ],
"MinimumLevel": {
"Default": "Debug",
"Override": {
"Microsoft": "Warning"
}
},
"WriteTo": [
{
"Name": "RollingFile",
"Args": {
"pathFormat": "log-{Hour}.txt",
"fileSizeLimitBytes": "",
"retainedFileCountLimit": "",
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Application}] [{Level}] [{RequestId}] - {Message}{NewLine}{Exception}"
}
}
],
"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
"Properties": {
"Application": "MultilayerApp"
}
},
Run Code Online (Sandbox Code Playgroud)
在日志中,我们有很好的输入
2018-01-19 14:06:01.165 +00:00 [App] [Warning] [0HLAV6PIMA9M0:00000001] - Accessing expired session, Key:"6e7f3ab5-db62-335d-1bc7-6824e5b918f5"
Run Code Online (Sandbox Code Playgroud)
但我的问题是Serilog在哪里实现更丰富RequestId?老实说,我找不到它.
我在我的 C# 项目中使用Serilog和serilog-sinks-console,我想知道如何修改控制台输出的格式而不创建全新的格式化程序。我只需要调整一件事信息 java (slf4j/logback) 之类的格式。
由此:
00:19:49 [DBG] Microsoft.AspNetCore.Hosting.Internal.WebHost - App starting
00:19:49 [DBG] Microsoft.AspNetCore.Hosting.Internal.WebHost - App started
Run Code Online (Sandbox Code Playgroud)
进入这个:
00:19:49 [DBG] m.a.h.i.WebHost - App starting
00:19:49 [DBG] m.a.h.i.WebHost - App started
Run Code Online (Sandbox Code Playgroud)
或者只是这个简单的格式:
00:19:49 [DBG] WebHost - App starting
00:19:49 [DBG] WebHost - App started
Run Code Online (Sandbox Code Playgroud) 我正在评估有关分布式日志服务器的不同选项。
在Java世界,我看到的最流行的方案是filebeat + kafka + logstash + elasticsearch + kibana。
但是,在 .NET 世界中,有一个 serilog 可以将结构日志直接发送到 elasticsearch。所以唯一需要的组件是elasticsearch + kibana。
我搜索了很多,但是关于这个解决方案在生产中的信息并不多。我不知道它是否足以处理大量日志。
谁能给我一些建议?谢谢。
我在program.cs中有这个Serilog配置
public class Program
{
public static IConfiguration Configuration { get; } = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true)
.Build();
public static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
.MinimumLevel.Override("System", LogEventLevel.Warning)
.WriteTo.MSSqlServer(Configuration.GetConnectionString("DefaultConnection"), "dbo.Log")
.Enrich.WithThreadId()
.Enrich.WithProperty("Version", "1.0.0")
.CreateLogger();
try
{
BuildWebHost(args).Run();
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly");
}
finally
{
Log.CloseAndFlush();
}
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseSerilog()
.Build();
}
Run Code Online (Sandbox Code Playgroud)
现在我想添加HttpContext.Current.User.Identity.Name …
Configuring Serilog using a JSON config, it is possible to configure log level switches as such:
"LevelSwitches": {
"$appLogLevel": "Debug",
"$netLogLevel": "Information",
"$sysLogLevel": "Error"
},
"MinimumLevel": {
"ControlledBy": "$appLogLevel",
"Override": {
"Microsoft": "$netLogLevel",
"System": "$sysLogLevel"
}
}
Run Code Online (Sandbox Code Playgroud)
the purpose of the switches (when instantiated in code) is to be accessed at a later time in order to change the minimum log levels during run-time. However when configured via the JSON config, I can't find a way to access those switch …
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseSerilog((ctx, config) => { config.ReadFrom.Configuration(ctx.Configuration); })
.UseStartup<Startup>();
}
public class Startup
{
public IContainer Container { get; private set; }
public Startup(IConfiguration configuration)
{
Log.Warning("test");
Configuration = configuration;
}
}
Run Code Online (Sandbox Code Playgroud)
appsettings.json
{
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"Default": "Information",
"Microsoft": "Information",
"System": "Information"
}
},
"WriteTo": [
{
"Name": "RollingFile",
"Args": {
"pathFormat": "C:\\test.txt",
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.ffff}|{TenantName}|{RequestId}|{SourceContext}|{Level:u3}|{Message:lj}{NewLine}{Exception}",
"restrictedToMinimumLevel": …Run Code Online (Sandbox Code Playgroud) Serilog mssqlserver 接收器是否有内置配置设置来自动删除早于特定天数(或周或月)的日志条目?基本上,我正在寻找相当于rollinginterval设置的数据库,但它只是删除旧记录而不是滚动到新的日志文件。
如果没有的话,就不用解释如何用SQL删除记录了;我只是在 Serilog 中寻找捷径。
我有以下appsettings.json配置:
{
"Serilog": {
"Using": [],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
},
"Enrich": [ "FromLogContext", "WithMachineName" ],
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "C:\\Logs\\log.json",
"formatter": "Serilog.Formatting.Elasticsearch.ElasticsearchJsonFormatter, Serilog.Formatting.Elasticsearch"
}
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试在上面的 appsettings.json 文件中配置的内容将在 C# 中表示为如下所示:
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.WriteTo.File(new ElasticsearchJsonFormatter(inlineFields:true, renderMessageTemplate: false), @"C:\logs\log.json")
.CreateLogger();
Run Code Online (Sandbox Code Playgroud)
我需要将“inlineFields”设置为 true,将“renderMessageTemplate”设置为 false,作为 ElasticsearchJsonFormatter 实例上的 appsettings.json 文件中的覆盖。有没有办法在 appsettings.json 文件中执行此操作,以便我可以将配置排除在 C# 之外?
serilog ×10
c# ×4
asp.net-core ×3
logging ×2
.net-core ×1
appsettings ×1
asp.net-mvc ×1
sql-server ×1