Serilog ForContext无法按预期工作

时间:2018-10-09 02:29:49

标签: serilog

我在我的项目(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

1 个答案:

答案 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感兴趣,而不是手动进行。