我在我的项目(MVC / Web API等)中将serilog和SEQ与Autofac(DI)一起使用。虽然工作正常 但不确定是否正确。
我有几个问题。请帮助
Q1)如何使LoggerConfiguration通过Web.config(应用程序设置)(如Verbose / Debug等)进行管理。
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Verbose()
.Enrich.FromLogContext()
.WriteTo.Seq(serilogUrl)
.CreateLogger();
Q2)我想使用Everymessage编写用户ID。我已经使用了推送属性,而没有“ using”语句。 参见下面的代码
public partial class Repo : BaseRepo<db>
{
public Repo(ILogger logger) : base(logger)
{
var currentuser = GetUserName();
LogContext.PushProperty("User Name", currentuser);
Logger.ForContext<Repo>();
}
public void somefunction()
{
try{}
catch(exception e){
Logger.Error(e, "Message");
}
}
}
Q3)在构造函数中,我使用了 Logger.ForContext(),假设这会将类名写入每条消息中。但它不起作用。
Logger.ForContext<Repo>()
注意:我没有使用asp.net core / .Net core
答案 0 :(得分:2)
ForContext
返回一个新的ILogger
引用,该引用已将上下文信息添加到记录器中,因此您必须捕获该引用并将其用于日志记录。
例如
public class YourClass
{
private readonly ILogger _log;
public YourClass(ILogger log)
{
_log = log
.ForContext<YourClass>()
.ForContext("CurrentUserName", GetUserName());
// ...
}
public void Somefunction()
{
try
{
// ...
}
catch(exception ex)
{
_log.Error(ex, "Message...");
}
}
}
ps:鉴于您使用的是Autofac,您可能会对将Autofac-Serilog integration用于contextual logger injection感兴趣,而不是手动进行。