2015-12-09 42 views
1

我在Azure實例(Windows Server 2012 R2 Datacenter)上運行Seq,並從運行在本地工作站上的控制檯應用程序中記錄Serilog。我有3個接收器配置 - 文件,控制檯和Seq。我也在dnxcore50上運行(以防萬一你以爲我的設置不夠狡猾)。我所有的事件都在控制檯和文件100%的時間顯示出來。 Seq只捕獲5次或更多次運行中的1次事件,即它將捕獲所有運行事件或全部事件。我正在使用免費的單一用戶許可證來評估Seq,並且我還沒有發現任何暗示會導致此行爲的任何限制。Serilog Seq接收器並不總是捕獲事件

我已經在記錄器上設置了SelfLog.Out,但是根本沒有記錄任何記錄,除了我添加的測試行以確保自我記錄可以至少寫入指定文件。

public abstract class SerilogBaseLogger<T> : SerilogTarget 
{ 
    protected SerilogBaseLogger(SerilogOptions options, string loggerType) 
    { 
     LoggerConfiguration = new LoggerConfiguration(); 
     Options = options; 
     LevelSwitch.MinimumLevel = options.LogLevel.ToSerilogLevel(); 

     var file = File.CreateText(Path.Combine(options.LogFilePath, string.Format("SelfLog - {0}.txt", loggerType))); 
     file.AutoFlush = true; 
     SelfLog.Out = file; 
     SelfLog.WriteLine("Testing self log."); 
    } 

    // ... snip .... 
} 

public class SerilogSeqTarget<T> : SerilogBaseLogger<T> 
{ 
    public string Server => Options.Seq.Server; 

    public SerilogSeqTarget(SerilogOptions options) 
     : base(options, string.Format("SerilogSeqTarget[{0}]", typeof(T))) 
    { 
     LoggerConfiguration 
      .WriteTo 
      .Seq(Server); 

     InitializeLogger(); 
    } 

    public override string ToString() 
    { 
     return string.Format("SerilogSeqTarget<{0}>", typeof(T).Name); 
    } 
} 

public class SerilogLoggerFactory<TType> : LoggerFactory<SerilogTarget> 
{ 
    // .... snip .... 

    public override IMyLoggerInterface GetLogger() 
    { 
     var myLogger = new SerilogDefaultLogger() 
      .AddTarget(SerilogTargetFactory<TType>.GetFileTarget(Options)) 
      .AddTarget(SerilogTargetFactory<TType>.GetConsoleTarget(Options)) 
      .AddTarget(SerilogTargetFactory<TType>.GetSeqTarget(Options)); 

     myLogger.Info("Logger initialized with {@options} and targets: {targets}", Options, ((SerilogDefaultLogger)myLogger).Targets); 

     return myLogger; 
    } 
} 

public class SerilogTargetFactory<TType> 
{ 
    // ... snip ... 

    public static SerilogTarget GetSeqTarget(SerilogOptions options) 
    { 
     return !string.IsNullOrEmpty(options.Seq.Server) 
        ? new SerilogSeqTarget<TType>(options) 
        : null; 
    } 
} 

有什麼建議嗎?這只是一個副作用嗎?在預先發布一切(儘管在這種情況下我希望事情會一直失敗)。

回答

2

當針對dnxcore50/CoreCLR時,Serilog無法掛入AppDomain關閉,以確保始終刷新任何緩衝的消息。 (AppDomain沒有該配置文件中存在:-)

有幾個選項:

  1. 處置記錄儀(尤其是在關機的序列之一):

    (如記錄儀的IDisposable )?.的Dispose();

  2. 使用靜態Log類,並調用其CloseAndFlush()方法在關機:

    Log.CloseAndFlush();

後者 - 使用靜態Log類,而不是各個單獨​​實例 - 可能是最快和最容易獲得與打算,但它完全按照處置伐木者所以兩種方法也應該這樣做的效果它。

+0

這樣做。我讓我的'SerilogBaseLogger '實現'IDisposable',並且也用於我的目標(這些將用Serilog語言來說就是接收器),並且這似乎使事情更可靠。無論如何,這可能是一個好主意(我正在玩/轉換舊的日誌框架/包裝,並且很有可能無法正確清理它)。 –

+0

太好了,很高興聽到它被整理出來。乾杯! –

+0

所以,事實證明,我仍然看到了這個問題,但是通過設置緩衝區文件名,它至少會最終到達那裏。在這一點上,我傾向於責怪我的IDisposable模式或dnxcore50的RC統計。我將在最終版本發佈後重新訪問和更新,但如果其他人在此期間遇到此問題...... –

相關問題