鉴于此代码:
var d1 = new { x = 5, y = 88 };
Log.Logger.Information("{d1}", d1);
Log.Logger.Information("{@d1}", d1);
Run Code Online (Sandbox Code Playgroud)
如何在两个Log.Logger.Information(...)行中以不同方式记录d1中的对象?换句话说,在{}之间添加@的影响是什么?
我在"保留对象结构"标题下阅读了https://github.com/serilog/serilog/wiki/Structuredvals,但这对我来说没有意义.
引用Serilog Wiki:
ApplicationLifecycleModule将自动启用...
好,太棒了.这是怎么回事?它没有列在<modules/>web.config 的元素中,并且在我的代码中没有任何引用.那么将它们连接起来的神奇之处在哪里?
Serilog @语法的目的是什么?
如果我运行以下内容:
var dummy = new { Foo = "Bar", Date = DateTime.Now };
Log.Information("Dummy object: {Dummy}", dummy);
Run Code Online (Sandbox Code Playgroud)
然后我得到一个输出到控制台,如下所示:
Time: 16:20 [Level: Information] (ManagedThreadID: 8) Message: Dummy object: "Foo = Bar, Date = 25/06/2016 16:20:30 }"
Run Code Online (Sandbox Code Playgroud)
如果我更改{Dummy}为{@Dummy}然后我得到相同的输出
Time: 16:22 [Level: Information] (ManagedThreadID: 8) Message: Dummy object: Foo: "Bar", Date: 06/25/2016 16:22:28 }
Run Code Online (Sandbox Code Playgroud)
那么,@应该做什么?
我有一个具有多个属性的对象,这些属性与我网站上刚刚发生的事件相关。
我想记录此事件,并将其每个属性显示在 Seq 中 - 作为属性。但是想要从实际的日志消息文本中省略大部分属性 - 所以我不希望它们出现在消息模板中。v
如果我这样做:
var logInfo= new LogInfo() {Foo = 1, Bar= "Pending"};
logger.Information("{@event}", logInfo);
Run Code Online (Sandbox Code Playgroud)
在 Seq 中直接针对日志亮起的唯一属性是 @event 属性。它实际上看起来像这样:
所以我试过这个:
var enricher = new DnnLogInfoEnricher(logInfo);
using (LogContext.PushProperties(enricher))
{
Log.Logger.Information("Event: {logInfo}", logInfo.LogTypeKey, logInfo.Exception);
}
Run Code Online (Sandbox Code Playgroud)
但我对这种方法的担忧是,由于此方法将触发大量次数,因此我不想每次都创建一个新的丰富对象实例 - 因为我喜欢保持正在创建的对象数量通常尽可能低。只是因为我担心 GC 影响(也许我的担忧是没有根据的?)。
这是实现我想要的(即使用浓缩器)的正确/正确方法还是我错过了什么?
干杯!
有一个Asp.Net核心项目要求我们需要将错误,警告,信息,异常等记录到以下流中:
1)SQL Server表.
2)在日志记录期间,如果SQL Server数据库突然变得不可用,我们希望通过将日志条目写入共享网络文件夹来继续日志记录.
3)同样,如果在记录期间,共享网络文件夹变得不可用,那么我们希望继续记录到本地文件夹.
这种情况是Serilog(https://serilog.net/)可以帮助我们实现的吗?
我正在使用 Serilog 登录到两个“接收器”。
我想记录一个复杂类型 - FileInfo 对象。
在 Seq 中,我想要完整的对象,以及它的所有属性可供我使用。
但是,在 RollingTextFile 中,我只希望在文本文件中打印“ fileInfo.FullName ”,否则文本文件会很乱且难以阅读。
我的日志记录如下;
logger.Information("Processing File: {@fileInfo} - Attempt ({intAttemptCounter}/3).",fileInfo, intAttemptCounter)
Run Code Online (Sandbox Code Playgroud)
这在文件信息对象解构的情况下按预期工作,但如上所述,会产生混乱且不可读的文本文件。
我想我需要使用这里概述的自定义“格式提供程序”;https://github.com/serilog/serilog/wiki/Formatting-Output#format-providers
但我无法弄清楚如何为 fileInfo 类对象实现这一点并将其仅应用于 RollingTextFile 接收器。我也找不到任何其他示例实现。
在记录消息时,如何设置Serilog在SQL Server中调用存储过程?我看到如何使用MS SQL Server接收器将消息直接存储在数据库表中,但我想调用存储过程.
作为从NLog切换到Serilog的一个步骤,我想将NLog标准调用的标准接线重定向LogManager.GetLogger(name)到桥接任何记录到NLog的代码,立即转发到环境Serilog Log.Logger- 即我只想转发一个简单转发的配置消息,没有像Log4net.Appender.SerilogLog4net 那样缓冲.
任何人都可以编造或指向一个规范的片段,正确有效地做到这一点吗?我能想到的要求:
nlog.Warn应该相当于serilog.WarningLogEvent在Serilog术语中)我正在使用.net Core 2.0和Serilog电子邮件接收器。我在配置电子邮件接收器时遇到问题appsettings.json。from的相同配置program.cs有效,而from 的相同appsetting.json无效。


我正在寻找将serilog与aspnet webapi2结合使用的正确方法。现在,我像这样初始化全局Log.Logger属性:
public static void Register(HttpConfiguration config)
{
Log.Logger = new LoggerConfiguration()
.WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("http://localhost:9200"))
{
IndexFormat = IndexFormat,
BufferBaseFilename = outputLogPath,
AutoRegisterTemplate = true,
AutoRegisterTemplateVersion = AutoRegisterTemplateVersion.ESv6,
CustomFormatter = new ElasticsearchJsonFormatter(renderMessageTemplate: false),
BufferFileCountLimit = NbDaysRetention
})
.MinimumLevel.ControlledBy(new LoggingLevelSwitch() { MinimumLevel = LogEventLevel.Information})
.Enrich.FromLogContext()
.Enrich.WithWebApiRouteTemplate()
.Enrich.WithWebApiActionName()
.CreateLogger();
//Trace all requests
SerilogWebClassic.Configure(cfg => cfg.LogAtLevel(LogEventLevel.Information));
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
Run Code Online (Sandbox Code Playgroud)
有更清洁的方法吗?我想知道,如果我必须对控制器进行一些测试,是否可能会导致问题。