Serilog Seq Sink 并不总是捕获事件
Serilog Seq Sink not always capturing events
我在 Azure 实例(Windows Server 2012 R2 数据中心)上 运行ning Seq 并在本地工作站上从控制台应用程序 运行ning 使用 Serilog 进行日志记录。我配置了 3 个接收器 - 文件、控制台和 Seq。我也在 dnxcore50 运行 宁(以防万一你认为我的设置不够狡猾)。我所有的事件都 100% 地显示在控制台和文件中。 Seq 仅捕获大约 5 分之一或更多 运行 的事件,也就是说,它将捕获其中 运行 或 none 的所有事件。我正在使用免费的单用户许可证来评估 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;
}
}
有什么建议吗?这只是处于最前沿的副作用,使用预发布的一切(尽管在那种情况下我希望事情会一直失败)?
当以 dnxcore50
/CoreCLR 为目标时,Serilog 无法挂接到 AppDomain
关闭以保证任何缓冲的消息始终被刷新。 (AppDomain
在该配置文件中不存在 :-)
有几个选项:
关闭时处理记录器(尤其是 Seq 记录器):
(记录器作为 IDisposable)?.Dispose();
使用静态 Log
class 并在关闭时调用其 CloseAndFlush()
方法:
Log.CloseAndFlush();
后者 - 使用静态 Log
class 而不是各种单独的 ILogger
实例 - 可能是最快和最容易上手的,但它具有完全相同的效果与处理记录器一样,所以任何一种方法都应该这样做。
我在 Azure 实例(Windows Server 2012 R2 数据中心)上 运行ning Seq 并在本地工作站上从控制台应用程序 运行ning 使用 Serilog 进行日志记录。我配置了 3 个接收器 - 文件、控制台和 Seq。我也在 dnxcore50 运行 宁(以防万一你认为我的设置不够狡猾)。我所有的事件都 100% 地显示在控制台和文件中。 Seq 仅捕获大约 5 分之一或更多 运行 的事件,也就是说,它将捕获其中 运行 或 none 的所有事件。我正在使用免费的单用户许可证来评估 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;
}
}
有什么建议吗?这只是处于最前沿的副作用,使用预发布的一切(尽管在那种情况下我希望事情会一直失败)?
当以 dnxcore50
/CoreCLR 为目标时,Serilog 无法挂接到 AppDomain
关闭以保证任何缓冲的消息始终被刷新。 (AppDomain
在该配置文件中不存在 :-)
有几个选项:
关闭时处理记录器(尤其是 Seq 记录器):
(记录器作为 IDisposable)?.Dispose();
使用静态
Log
class 并在关闭时调用其CloseAndFlush()
方法:Log.CloseAndFlush();
后者 - 使用静态 Log
class 而不是各种单独的 ILogger
实例 - 可能是最快和最容易上手的,但它具有完全相同的效果与处理记录器一样,所以任何一种方法都应该这样做。