serilog 및 seq을 사용하여 많은 성공을 거두었으며 로그 메시지에 속성을 추가하기 위해 강화제를 사용했습니다.
내 서비스에서는 ServiceLogger.CreateLogger (this)를 호출하여 서비스에 대한 모든 상태가 풍부한 로그를 얻습니다. 상관 토큰을 원하면 비교적 쉽게 추가 할 수 있어야하지만, 아직 완료하지 않은 것입니다.
아래 관련 코드를 복사 한 것 같습니다. @
public class ServiceFabricEnricher<T> : ILogEventEnricher where T : ServiceContext
{
protected T Context { get; }
private LogEventProperty _nodeName;
public ServiceFabricEnricher(T context)
{
Context = context;
}
public virtual void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
{
if (_nodeName == null) _nodeName = propertyFactory.CreateProperty("NodeName", Context.NodeContext.NodeName);
logEvent.AddPropertyIfAbsent(_nodeName);
}
}
public class ServiceEnricher<T> : ServiceFabricEnricher<T> where T : ServiceContext
{
private LogEventProperty _serviceName;
private LogEventProperty _partitionId;
private LogEventProperty _applicationName;
public ServiceEnricher(T context) : base(context)
{
}
public override void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
{
base.Enrich(logEvent, propertyFactory);
if (_serviceName == null) _serviceName = propertyFactory.CreateProperty("ServiceName", Context.ServiceName);
if (_partitionId == null) _partitionId = propertyFactory.CreateProperty("PartitionId", Context.PartitionId);
if (_applicationName == null) _applicationName = propertyFactory.CreateProperty("ApplicationName", Context.CodePackageActivationContext.ApplicationName);
logEvent.AddPropertyIfAbsent(_serviceName);
logEvent.AddPropertyIfAbsent(_partitionId);
logEvent.AddPropertyIfAbsent(_applicationName);
}
}
public static class ServiceFabricLogger
{
private static ILogger CreaterDefaultLogger()
{
var configurationProvider = new FabricConfigurationProvider("SeqConfig");
var loggerConfiguration = new LoggerConfiguration();
if (configurationProvider.HasConfiguration)
{
var seqServer = configurationProvider.GetValue("SeqServer");
loggerConfiguration =
loggerConfiguration
.WriteTo.Seq(seqServer, period: TimeSpan.FromMilliseconds(500))
;
var level = configurationProvider.GetValue("MinimumLevel");
LogEventLevel minimumLevel;
if (!string.IsNullOrWhiteSpace(level) && Enum.TryParse<LogEventLevel>(level, true, out minimumLevel))
{
loggerConfiguration = loggerConfiguration.MinimumLevel.Is(minimumLevel);
}
}
else
{
loggerConfiguration =
loggerConfiguration
.MinimumLevel.Error()
;
}
Log.Logger = loggerConfiguration.CreateLogger();
return Log.Logger;
}
public static ILogger Logger { get; } = CreaterDefaultLogger();
}
public static class ServiceLogger
{
public static ILogger CreateLogger(this StatefulServiceBase service) =>
ServiceFabricLogger.Logger.ForContext(new[] { new StatefulServiceEnricher(service.Context) });
public static ILogger CreateLogger(this StatelessService service) =>
ServiceFabricLogger.Logger.ForContext(new[] { new StatelessServiceEnricher(service.Context) });
}
닉 - radell 내 문제는 내 선택은 당신 (나는 common.loggin + log4net에 의존)하지만 그것은 아주 관계가 다릅니다 그 목적을 위해, 로그 기반 모델링에 대해 아닙니다. 내 문제는 ** 토큰을 클라이언트에서 ServiceFabric 액터/서비스 ** 내의 서버로 이동시키는 방법입니다. 더 좋은 방법은 WCF를 사용하여 통신을 설정하는 것이 간단하고 행동을 통해 헤더를 추가하는 것만으로도 충분하지만 문제는 리모팅을 사용하여 동일하게 수행하는 것입니다 (기본 설정이고이를 사용하고 싶습니다) – MonDeveloper