2017-10-05 31 views
1

我是Serilog的新手 - 試試看它是否會有所幫助。我使用Serilog v2和Serilog.Sinks.MsSqlServer V5Serilog是日誌記錄類型而不是對象內容

我有以下的控制檯應用程序代碼:

static void Main(string[] args) 
    { 
     var logger = CreateLogger(); 

     var employee = new Person() 
     { 
      Name = "Rob", 
      Age = 45 
     }; 

     logger.Debug("Employee details {Employee}", employee); 

     Console.ReadKey(); 

    } 

private static ILogger CreateLogger() 
    { 

     string levelString = SSOSettingsFileManager.SSOSettingsFileReader.ReadString(
          "LCC.Common", "Serilog.MinimumLevel"); 

     SerilogLevel level = (SerilogLevel)Enum.Parse(typeof(SerilogLevel), levelString); 

     string conString = SSOSettingsFileManager.SSOSettingsFileReader.ReadString(
          "LCC.Common", "Serilog.ConnectionString"); 

     var levelSwitch = new LoggingLevelSwitch(); 
     levelSwitch.MinimumLevel = (Serilog.Events.LogEventLevel)level; 

     return new LoggerConfiguration() 
      .MinimumLevel.ControlledBy(levelSwitch) 
      .WriteTo.MSSqlServer(connectionString: conString, tableName: "Logs", autoCreateSqlTable: true) 
      .CreateLogger(); 
    } 

我本來期望的人的詳細信息記錄,即名稱羅布和45歲。然而,我發現下面的記錄在屬性欄上的我的SQL Server水槽:

<properties><property key='Employee'>ConsoleApplication1.Person</property></properties> 

我有什麼錯?

回答

2

這裏是Serilog documentation

對於此任務, Serilog提供了@解構運算符。

var sensorInput = new { Latitude = 25, Longitude = 134 }; 
Log.Information("Processing {@SensorInput}", sensorInput); 

你可以看到做解構你面前鍵名設置@。這在您的示例代碼中是錯過的

logger.Debug("Employee details {Employee}", employee); 
0

日誌框架將在傳遞給它的對象上調用ToString。如果您想詳細記錄下來,其中一個方案是重寫ToString方法序列化對象(假定參考Newtonsoft.JSON庫):

// in Person.cs 
public override string ToString() 
{ 
    return JsonConvert.SerializeObject(this); 
} 
+0

我認爲serilog的想法是爲了避免需要這樣的顯式序列化 - 它是一個結構化日誌記錄框架 –

相關問題