2

Azure インスタンス (Windows Server 2012 R2 データセンター) で Seq を実行し、ローカル ワークステーションで実行されているコンソール アプリケーションから Serilog でログを記録しています。File、Console、および Seq の 3 つのシンクが構成されています。私は dnxcore50 でも実行しています (念のため、私のセットアップが十分に危険ではないと考えている場合に備えて)。すべてのイベントがコンソールとファイルに 100% 表示されます。Seq は、5 回以上の実行で約 1 回のイベントのみをキャプチャします。つまり、実行のすべてのイベントをキャプチャするか、まったくキャプチャしません。無料のシングル ユーザー ライセンスを使用して 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;
    }
}

助言がありますか?これは、プレリリースのすべてに取り組んで、最先端にいることの単なる副作用ですか?

4

1 に答える 1

3

/CoreCLRを対象とする場合dnxcore50、Serilog はAppDomainシャットダウンにフックして、バッファリングされたメッセージが常にフラッシュされることを保証できません。(AppDomainそのプロファイルには存在しません:-)

いくつかのオプションがあります。

  1. シャットダウン時にロガー (特に Seq のもの) を破棄します。

    (IDisposable としてのロガー)?.Dispose();

  2. 静的Logクラスを使用して、CloseAndFlush()シャットダウン時にそのメソッドを呼び出します。

    Log.CloseAndFlush();

後者 -Logさまざまな個々のインスタンスの代わりに静的クラスを使用するILogger- は、おそらく最も迅速かつ簡単に使用できますが、ロガーを破棄するのとまったく同じ効果があるため、どちらのアプローチでも行う必要があります。

于 2015-12-10T10:18:47.213 に答える