/// <summary> /// Adds a <see cref="RollingFileLogProvider"/> to the logger. /// </summary> /// <param name="builder">The <see cref="ILoggerBuilder"/>.</param> /// <param name="configureOptions"> /// A delegate to configure the <see cref="RollingFileLogProviderOptions"/> object that is used to /// configure the log provider. /// </param> /// <returns>The same <see cref="ILoggerBuilder"/>.</returns> public static ILoggerBuilder AddRollingFileLogProvider(this ILoggerBuilder builder, Action <RollingFileLogProviderOptions> configureOptions = null) { if (builder is null) { throw new ArgumentNullException(nameof(builder)); } return(builder.AddLogProvider(serviceProvider => { var optionsLoggerName = builder.LoggerName == Logger.DefaultName ? Options.DefaultName : builder.LoggerName; var optionsMonitor = serviceProvider.GetService <IOptionsMonitor <RollingFileLogProviderOptions> >(); var options = optionsMonitor?.Get(optionsLoggerName) ?? new RollingFileLogProviderOptions(); configureOptions?.Invoke(options); var formatter = options.FormatterRegistration?.Invoke(serviceProvider) ?? new TemplateLogFormatter(FileLogProvider.DefaultTemplate); if (optionsMonitor != null && options.ReloadOnChange) { return new ReloadingLogProvider <RollingFileLogProviderOptions>( optionsMonitor, options, CreateLogProvider, builder.LoggerName, configureOptions); } return CreateLogProvider(options); ILogProvider CreateLogProvider(RollingFileLogProviderOptions o) => new RollingFileLogProvider(o.File, formatter, o.Level, o.Timeout, o.MaxFileSizeKilobytes, o.MaxArchiveCount, o.RolloverPeriod); })); }
/// <summary> /// Adds a <see cref="FileLogProvider"/>, formatted with the <see cref="ILogFormatter"/> /// returned by the formatter registration, to the logger. /// </summary> /// <param name="builder">The <see cref="ILoggerBuilder"/>.</param> /// <param name="formatterRegistration"> /// The method used to create the <see cref="ILogFormatter"/> of the log provider. /// </param> /// <param name="file">The file to write to.</param> /// <param name="level">The logging level of the log provider.</param> /// <param name="timeout">The timeout of the log provider.</param> /// <returns>The same <see cref="ILoggerBuilder"/>.</returns> public static ILoggerBuilder AddFileLogProvider(this ILoggerBuilder builder, Func <IServiceProvider, ILogFormatter> formatterRegistration, string file = null, LogLevel?level = null, TimeSpan?timeout = null) { if (formatterRegistration is null) { throw new ArgumentNullException(nameof(formatterRegistration)); } return(builder.AddFileLogProvider(options => { options.FormatterRegistration = formatterRegistration; if (file != null) { options.File = file; } if (level != null) { options.Level = level.Value; } if (timeout != null) { options.Timeout = timeout; } })); }
/// <summary> /// Initializes a new instance of the <see cref="MQEventStorager"/> class. /// </summary> /// <param name="messageProducer">The message producer.</param> /// <param name="jsonSerializer">The json serializer.</param> /// <param name="eventFilter">The eventFilter.</param> /// <param name="loggerBuilder">The logger builder.</param> protected MQEventStorager(IMessageProducer messageProducer, IJsonSerializer jsonSerializer, Func <IEvent, EventBehaviorStorager, bool> eventFilter, ILoggerBuilder loggerBuilder) { this.messageProducer = messageProducer; this.jsonSerializer = jsonSerializer ?? SerializeEnvironment.JsonSerializer; this.loggerBuilder = loggerBuilder ?? LoggerBuilder.Empty; this.eventFilter = eventFilter; }
/// <summary> /// Initializes a new instance of the <see cref="MQCommandStreamStorager"/> class. /// </summary> /// <param name="messageProducer">The message producer.</param> /// <param name="jsonSerializer">The json serializer.</param> /// <param name="loggerBuilder">The logger builder.</param> protected MQCommandStreamStorager(IMessageProducer messageProducer, IJsonSerializer jsonSerializer, ILoggerBuilder loggerBuilder) { this.messageProducer = messageProducer; this.jsonSerializer = jsonSerializer ?? SerializeEnvironment.JsonSerializer; this.loggerBuilder = loggerBuilder ?? LoggerBuilder.Empty; this.commandStreamAnalyser = new DefaultCommandStreamAnalyser(); }
/// <summary> /// Initializes a new instance of the <see cref="MQEventStreamStorager"/> class. /// </summary> /// <param name="messageProducer">The message producer.</param> /// <param name="jsonSerializer">The json serializer.</param> /// <param name="eventFilter">The eventFilter.</param> /// <param name="loggerBuilder">The logger builder.</param> protected MQEventStreamStorager(IMessageProducer messageProducer, IJsonSerializer jsonSerializer, Func <IOperateEvent, EventBehaviorStorager, bool> eventFilter, ILoggerBuilder loggerBuilder) { this.messageProducer = messageProducer; this.jsonSerializer = jsonSerializer ?? SerializeEnvironment.JsonSerializer; this.loggerBuilder = loggerBuilder ?? LoggerBuilder.Empty; this.eventFilter = eventFilter; this.eventStreamAnalyser = new DefaultEventStreamAnalyser(); }
public PermissionController(ICommandBus commandBus, ILoggerBuilder loggerBuilder, IPermissionQuery permissionQuery) { this.commandBus = commandBus; this.loggerBuilder = loggerBuilder; this.permissionQuery = permissionQuery; }
public void AddContextProviderMethodSadPath() { ILoggerBuilder builder = null; Action act = () => builder.AddContextProvider <TestContextProvider>(); act.Should().ThrowExactly <ArgumentNullException>().WithMessage("*builder*"); }
public void AddRollingFileLogProviderMethod5SadPath() { ILoggerBuilder builder = null; Action act = () => builder.AddRollingFileLogProvider(); act.Should().ThrowExactly <ArgumentNullException>().WithMessage("*builder*"); }
public ApplicationService(IUnitOfWork unitOfWork, IMapper mapper, ITokenBuilder tokenBuilder, ICachingHandler cachingHandler, ILoggerBuilder loggingBuilder) { _unitOfWork = unitOfWork; _mapper = mapper; _tokenBuilder = tokenBuilder; _cachingHandler = cachingHandler; this.loggingBuilder = loggingBuilder; }
/// <summary> /// Adds an <see cref="IContextProvider"/> of type <typeparamref name="TContextProvider"/> to the logger. /// </summary> /// <typeparam name="TContextProvider">The type of <see cref="IContextProvider"/> to add to the logger.</typeparam> /// <param name="builder">The <see cref="ILoggerBuilder"/>.</param> /// <param name="parameters"> /// Constructor arguments for type <typeparamref name="TContextProvider"/> that are not provided by the /// <see cref="IServiceProvider"/>. /// </param> /// <returns>The same <see cref="ILoggerBuilder"/></returns> public static ILoggerBuilder AddContextProvider <TContextProvider>(this ILoggerBuilder builder, params object[] parameters) where TContextProvider : IContextProvider { if (builder is null) { throw new ArgumentNullException(nameof(builder)); } return(builder.AddContextProvider(serviceProvider => ActivatorUtilities.CreateInstance <TContextProvider>(serviceProvider, parameters))); }
/// <summary> /// Adds a <see cref="DebugLogProvider"/>, formatted with a <see cref="ILogFormatter"/> of /// type <typeparamref name="TLogFormatter"/>, to the logger. /// </summary> /// <typeparam name="TLogFormatter"> /// The type of <see cref="ILogFormatter"/> that the log provider uses for formatting logs. /// </typeparam> /// <param name="builder">The <see cref="ILoggerBuilder"/>.</param> /// <param name="level">The logging level of the log provider.</param> /// <param name="timeout">The timeout of the log provider.</param> /// <param name="logFormatterParameters"> /// Constructor arguments for type <typeparamref name="TLogFormatter"/> that are not provided /// by the <see cref="IServiceProvider"/>. /// </param> /// <returns>The same <see cref="ILoggerBuilder"/>.</returns> public static ILoggerBuilder AddDebugLogProvider <TLogFormatter>(this ILoggerBuilder builder, LogLevel?level = null, TimeSpan?timeout = null, params object[] logFormatterParameters) where TLogFormatter : ILogFormatter { return(builder.AddDebugLogProvider(serviceProvider => ActivatorUtilities.CreateInstance <TLogFormatter>(serviceProvider, logFormatterParameters), level, timeout)); }
/// <summary> /// Adds a <see cref="DebugLogProvider"/>, formatted with the specified <see cref="ILogFormatter"/>, /// to the logger. /// </summary> /// <param name="builder">The <see cref="ILoggerBuilder"/>.</param> /// <param name="formatter"> /// The <see cref="ILogFormatter"/> that the log provider uses for formatting logs. /// </param> /// <param name="level">The logging level of the log provider.</param> /// <param name="timeout">The timeout of the log provider.</param> /// <returns>The same <see cref="ILoggerBuilder"/>.</returns> public static ILoggerBuilder AddDebugLogProvider(this ILoggerBuilder builder, ILogFormatter formatter, LogLevel?level = null, TimeSpan?timeout = null) { if (formatter is null) { throw new ArgumentNullException(nameof(formatter)); } return(builder.AddDebugLogProvider(serviceProvider => formatter, level, timeout)); }
/// <summary> /// Adds a <see cref="DebugLogProvider"/>, formatted with a <see cref="TemplateLogFormatter"/>, /// to the logger. /// </summary> /// <param name="builder">The <see cref="ILoggerBuilder"/>.</param> /// <param name="template"> /// The template of the <see cref="TemplateLogFormatter"/> that the log provider uses for formatting /// logs. /// </param> /// <param name="level">The logging level of the log provider.</param> /// <param name="timeout">The timeout of the log provider.</param> /// <returns>The same <see cref="ILoggerBuilder"/>.</returns> public static ILoggerBuilder AddDebugLogProvider(this ILoggerBuilder builder, string template, LogLevel?level = null, TimeSpan?timeout = null) { if (template is null) { throw new ArgumentNullException(nameof(template)); } return(builder.AddDebugLogProvider <TemplateLogFormatter>(level, timeout, template)); }
public VCodeController(ICommandBus commandBus, ILoggerBuilder loggerBuilder, IJsonSerializer jsonSerializer, IEmailCodeQuery emailCodeQuery, IMobileCodeQuery mobileCodeQuery) { this.commandBus = commandBus; this.loggerBuilder = loggerBuilder; this.jsonSerializer = jsonSerializer; this.emailCodeQuery = emailCodeQuery; this.mobileCodeQuery = mobileCodeQuery; }
/// <summary> /// Build with Serilog using existing Serilog configuration /// </summary> /// <param name="builder"><see cref="LoggerBuilder"/></param> /// <param name="loggerConfiguration"><see cref="LoggerConfiguration"/></param> /// <param name="configuration"><see cref="IConfiguration"/></param> /// <returns><see cref="ILoggerBuilder"/></returns> public static ILoggerBuilder UseSerilog(this ILoggerBuilder builder, LoggerConfiguration loggerConfiguration, IConfiguration configuration) { var levelSwitch = new LoggingLevelSwitch(); var loggerFactory = new LoggerFactory(); var config = loggerConfiguration.MinimumLevel.ControlledBy(levelSwitch); loggerFactory.AddSerilog(config.CreateLogger(), dispose: true); return(new SerilogBuilder(loggerFactory, configuration, levelSwitch)); }
/// <summary> /// /// </summary> /// <param name="ex"></param> /// <param name="message"></param> protected override void HandleException(Exception ex, string message) { if (this.loggerBuilder != null) { this.loggerBuilder.Build(typeof(EventRecoveryManager)).Error(message, ex); return; } using (var scope = this.serviceLocator.BeginLifetimeScope()) { this.loggerBuilder = scope.ResolveOptional <ILoggerBuilder>(); this.loggerBuilder.Build(typeof(EventRecoveryManager)).Error(message, ex); } }
/// <summary> /// Adds a <see cref="RollingFileLogProvider"/>, formatted with a <see cref="ILogFormatter"/> of /// type <typeparamref name="TLogFormatter"/>, to the logger. /// </summary> /// <typeparam name="TLogFormatter"> /// The type of <see cref="ILogFormatter"/> that the log provider uses for formatting logs. /// </typeparam> /// <param name="builder">The <see cref="ILoggerBuilder"/>.</param> /// <param name="file">The file to write to.</param> /// <param name="level">The logging level of the log provider.</param> /// <param name="timeout">The timeout of the log provider.</param> /// <param name="maxFileSizeKilobytes"> /// The maximum file size, in bytes, of the file. If the file size is greater than this value, /// it is archived. /// </param> /// <param name="maxArchiveCount"> /// The maximum number of archive files that will be kept. If the number of archive files is /// greater than this value, then they are deleted, oldest first. /// </param> /// <param name="rolloverPeriod"> /// The rollover period, indicating if/how the file should archived on a periodic basis. /// </param> /// <param name="logFormatterParameters"> /// Constructor arguments for type <typeparamref name="TLogFormatter"/> that are not provided /// by the <see cref="IServiceProvider"/>. /// </param> /// <returns>The same <see cref="ILoggerBuilder"/>.</returns> public static ILoggerBuilder AddRollingFileLogProvider <TLogFormatter>(this ILoggerBuilder builder, string file = null, LogLevel?level = null, TimeSpan?timeout = null, int?maxFileSizeKilobytes = null, int?maxArchiveCount = null, RolloverPeriod?rolloverPeriod = null, params object[] logFormatterParameters) where TLogFormatter : ILogFormatter { return(builder.AddRollingFileLogProvider(serviceProvider => ActivatorUtilities.CreateInstance <TLogFormatter>(serviceProvider, logFormatterParameters), file, level, timeout, maxFileSizeKilobytes, maxArchiveCount, rolloverPeriod)); }
/// <summary> /// 在出错的时候写日志 /// </summary> /// <param name="runtimeModeProvider">环境运行提供者,如果为空则不写,如有需要,则重写该方法则可</param> /// <param name="loggerBuilder">日志构建者</param> /// <param name="executor">执行者</param> /// <param name="exception">异常信息</param> /// <param name="context">上下文</param> public void OnError(IRuntimeModeProvider runtimeModeProvider, ILoggerBuilder loggerBuilder, object executor, Exception exception, object context) { var logger = this.GetLogger(runtimeModeProvider, loggerBuilder, executor, exception, context); if (logger == null) { return; } if (!this.Match(runtimeModeProvider, loggerBuilder, executor, exception, context)) { return; } this.Write(runtimeModeProvider, logger, executor, exception, context); }
public void Registering_Logger_With_DI_Container2() { IServiceCollection serviceCollection = new ServiceCollection(); // Registering TacitusLogger with Microsoft DI as a singleton. ILoggerBuilder loggerBuilder = serviceCollection.TacitusLogger("logger1"); loggerBuilder.ForAllLogs() .Console() .Add() .BuildLogger(); var serviceProvider = serviceCollection.BuildServiceProvider(); // Resolving the dependency var logger = serviceProvider.GetService <ILogger>(); }
/// <summary> /// Adds a <see cref="RollingFileLogProvider"/>, formatted with the specified <see cref="ILogFormatter"/>, /// to the logger. /// </summary> /// <param name="builder">The <see cref="ILoggerBuilder"/>.</param> /// <param name="formatter"> /// The <see cref="ILogFormatter"/> that the log provider uses for formatting logs. /// </param> /// <param name="file">The file to write to.</param> /// <param name="level">The logging level of the log provider.</param> /// <param name="timeout">The timeout of the log provider.</param> /// <param name="maxFileSizeKilobytes"> /// The maximum file size, in bytes, of the file. If the file size is greater than this value, /// it is archived. /// </param> /// <param name="maxArchiveCount"> /// The maximum number of archive files that will be kept. If the number of archive files is /// greater than this value, then they are deleted, oldest first. /// </param> /// <param name="rolloverPeriod"> /// The rollover period, indicating if/how the file should archived on a periodic basis. /// </param> /// <returns>The same <see cref="ILoggerBuilder"/>.</returns> public static ILoggerBuilder AddRollingFileLogProvider(this ILoggerBuilder builder, ILogFormatter formatter, string file = null, LogLevel?level = null, TimeSpan?timeout = null, int?maxFileSizeKilobytes = null, int?maxArchiveCount = null, RolloverPeriod?rolloverPeriod = null) { if (formatter is null) { throw new ArgumentNullException(nameof(formatter)); } return(builder.AddRollingFileLogProvider(serviceProvider => formatter, file, level, timeout, maxFileSizeKilobytes, maxArchiveCount, rolloverPeriod)); }
internal static MessageExcutingElement[] FindMessageExcutingElement <TMessage>(MessageSubscriberProvider provider, TMessage e) where TMessage : IMessage { var messageHandlers = provider.FindSubscriber <TMessage>(); if (messageHandlers == null || messageHandlers.Length == 0) { return new MessageExcutingElement[] { } } ; /*先获取到每个MessageHandler的所有属性*/ var elements = new List <MessageExcutingElement>(messageHandlers.Length); for (var i = 0; i < messageHandlers.Length; i++) { var item = messageHandlers[i]; var handlerType = item.GetType(); var attributes = HandlerBehaviorStorager.Default.GetAttributes(handlerType); var loggerAttribute = ObjectExtension.GetAttribute <LoggerAttribute>(attributes); ILoggerBuilder loggerBuilder = null; if (loggerAttribute != null) { try { loggerBuilder = provider.Scope.Resolve <ILoggerBuilder>(loggerAttribute.RegisterKey); } catch { } } elements.Add(new MessageExcutingElement() { MessageContext = provider.FindMessageContext(), MessageHandler = item, MessageHandlerType = handlerType, LoggerBuilder = loggerBuilder, }); } return(elements.ToArray()); } #endregion }
/// <summary> /// Initializes a new instance of the <see cref="MessageDispatcher"/> class. /// </summary> /// <param name="messageConsumer">消费者接口</param> /// <param name="jsonSerializer">json序列号接口</param> /// <param name="sleepTimeSpan">用于控制线程while的频率</param> /// <param name="loggerBuilder">统计消息发布日志,因为不同的发布者可能都有自己的日志发布,所以这个接口通常不用赋值</param> public MessageDispatcher(IMessageConsumer messageConsumer, IJsonSerializer jsonSerializer, ILoggerBuilder loggerBuilder, TimeSpan sleepTimeSpan) : base(null, typeof(MessageDispatcher).Name) { if (messageConsumer == null) { throw new ArgumentNullException("消费者接口不能为空"); } if (jsonSerializer == null) { throw new ArgumentNullException("json序列号接口不能为空"); } this.messageConsumer = messageConsumer; this.jsonSerializer = jsonSerializer; this.loggerBuilder = loggerBuilder ?? LoggerBuilder.Empty; this.sleepTimeSpan = sleepTimeSpan; this.Replace(Change); }
/// <summary> /// dozeTime = TimeSpan.FromMinutes(1)表示1分发一个命令,如果还有命令,则一直发(间隔为1秒),此时RepeatWork返回false /// waitTime = TimeSpan.Zero 当任务完成,则进入睡眠状态,直到被唤醒,此时RepeatWork返回true /// </summary> /// <param name="storager"></param> /// <param name="commandBus"></param> /// <param name="eventBus"></param> /// <param name="serviceLocator"></param> /// <param name="loggerBuilder"></param> public CommandRecoveryManager(IFailRecoveryStorager storager, IServiceLocator serviceLocator, ICommandBus commandBus, IEventBus eventBus, ILoggerBuilder loggerBuilder) : base(null, typeof(CommandRecoveryManager).Name) { this.storager = storager; this.commandBus = commandBus; this.eventBus = eventBus; this.serviceLocator = serviceLocator; this.loggerBuilder = loggerBuilder; if (storager is IWorkTigger && ((IWorkTigger)storager).Timer != TimeSpan.Zero) { this.sleepTimeSpan = ((IWorkTigger)storager).Timer; } if (this.sleepTimeSpan == TimeSpan.Zero) { this.sleepTimeSpan = TimeSpan.FromSeconds(10); } this.Replace(Change).Start(); }
/// <summary> /// Adds a <see cref="RollingFileLogProvider"/>, formatted with the <see cref="ILogFormatter"/> /// returned by the formatter registration, to the logger. /// </summary> /// <param name="builder">The <see cref="ILoggerBuilder"/>.</param> /// <param name="formatterRegistration"> /// The method used to create the <see cref="ILogFormatter"/> of the log provider. /// </param> /// <param name="file">The file to write to.</param> /// <param name="level">The logging level of the log provider.</param> /// <param name="timeout">The timeout of the log provider.</param> /// <param name="maxFileSizeKilobytes"> /// The maximum file size, in bytes, of the file. If the file size is greater than this value, /// it is archived. /// </param> /// <param name="maxArchiveCount"> /// The maximum number of archive files that will be kept. If the number of archive files is /// greater than this value, then they are deleted, oldest first. /// </param> /// <param name="rolloverPeriod"> /// The rollover period, indicating if/how the file should archived on a periodic basis. /// </param> /// <returns>The same <see cref="ILoggerBuilder"/>.</returns> public static ILoggerBuilder AddRollingFileLogProvider(this ILoggerBuilder builder, Func <IServiceProvider, ILogFormatter> formatterRegistration, string file = null, LogLevel?level = null, TimeSpan?timeout = null, int?maxFileSizeKilobytes = null, int?maxArchiveCount = null, RolloverPeriod?rolloverPeriod = null) { if (formatterRegistration is null) { throw new ArgumentNullException(nameof(formatterRegistration)); } return(builder.AddRollingFileLogProvider(options => { options.FormatterRegistration = formatterRegistration; if (file != null) { options.File = file; } if (level != null) { options.Level = level.Value; } if (timeout != null) { options.Timeout = timeout; } if (maxFileSizeKilobytes != null) { options.MaxFileSizeKilobytes = maxFileSizeKilobytes.Value; } if (maxArchiveCount != null) { options.MaxArchiveCount = maxArchiveCount.Value; } if (rolloverPeriod != null) { options.RolloverPeriod = rolloverPeriod.Value; } })); }
/// <summary> /// 查找投资服务对象 /// </summary> /// <returns></returns> private ILoggerBuilder ResolveLoggerBuilder() { if (ContainerContext.Current == null) { return LoggerBuilder.Empty; } ILoggerBuilder @object = null; if (!registerLoggerBuilder.HasValue) { registerLoggerBuilder = ContainerContext.Current.ServiceLocator.TryResolve(ref @object); return @object; }; if (registerLoggerBuilder.Value) { return ContainerContext.Current.ServiceLocator.Resolve<ILoggerBuilder>(); } return null; }
public void Build(Project project, ProjectItem <EventSourceModel> model) { var eventSource = model.Content; if (eventSource == null) { LogError($"{model.Name} should have a content of type {typeof(EventSourceModel).Name} set but found {model.Content?.GetType().Name ?? "null"}"); return; } var loggerBuilders = new ILoggerBuilder[] { new LoggerTemplateBuilder(), new LoggerKeywordsBuilder(), new EventSourceCorrelatingEventsBuilder(), new LoggerEventScopeExpanderBuilder(), new LoggerImplicitArgumentsBuilder(), new LoggerOverrideArgumentsBuilder(), new EventSourceEventsBuilder(), new LoggerImplementationBuilder(), new LoggerEventSourcePartialBuilder(), }.Union(project.GetExtensions <ILoggerBuilder>()).ToArray(); var loggerStartId = 10000; foreach (var logger in eventSource.Loggers) { logger.StartId = logger.StartId ?? loggerStartId; logger.EventSource = eventSource; foreach (var builder in loggerBuilders) { PassAlongLoggers(builder as IWithLogging); builder.Build(project, model, logger); } loggerStartId += 1000; } }
/// <summary> /// 是否匹配 /// </summary> /// <param name="runtimeModeProvider">环境运行提供者,如果为空则不写,如有需要,则重写该方法则可</param> /// <param name="loggerBuilder">日志构建者</param> /// <param name="executor">执行者</param> /// <param name="exception">异常信息</param> /// <param name="context">上下文</param> protected virtual bool Match(IRuntimeModeProvider runtimeModeProvider, ILoggerBuilder loggerBuilder, object executor, Exception exception, object context) { if (runtimeModeProvider == null) { return(false); } if (runtimeModeProvider.RuntimeModeArray == null || runtimeModeProvider.RuntimeModeArray.Length <= 0) { return(true); } foreach (var i in runtimeModeProvider.RuntimeModeArray) { if (this.RuntimeMode.IsEquals(i.RuntimeMode)) { return(true); } } return(false); }
public async Task Invoke(HttpContext context, ILoggerBuilder loggingBuilder) { try { var request = await FormatRequest(context.Request); loggingBuilder.AddRequest(request); loggingBuilder.SetProperty(nameof(LoggingModel.RequestUrl), $"{context.Request.Scheme}://{context.Request.Host}{context.Request.Path}{context.Request.QueryString}"); loggingBuilder.SetProperty(nameof(LoggingModel.RequestMethod), context.Request.Method); loggingBuilder.SetProperty(nameof(LoggingModel.RequestHeaders), JsonConvert.SerializeObject(context.Request.Headers)); var originalBodyStream = context.Response.Body; using (var responseBody = new MemoryStream()) { context.Response.Body = responseBody; await _next(context); var response = await FormatResponse(context.Response); await responseBody.CopyToAsync(originalBodyStream); loggingBuilder.AddResponse(response); loggingBuilder.SetProperty(nameof(LoggingModel.HttpStatus), context.Response.StatusCode); loggingBuilder.SetProperty(nameof(LoggingModel.HostIp), GetHostIp()); loggingBuilder.SetProperty(nameof(LoggingModel.ClientIp), context.Features.Get <IHttpConnectionFeature>()?.RemoteIpAddress?.ToString()); var loggingModel = loggingBuilder.GetLogging(); //TODO:Save API request and response in DB or File } } catch (Exception ex) { //TODO: file log in case of logging failure or invalidate the request based on your business } }
/// <summary> /// Adds a <see cref="DebugLogProvider"/> to the logger. /// </summary> /// <param name="builder">The <see cref="ILoggerBuilder"/>.</param> /// <param name="configureOptions"> /// A delegate to configure the <see cref="DebugLogProviderOptions"/> object that is used to /// configure the log provider. /// </param> /// <returns>The same <see cref="ILoggerBuilder"/>.</returns> public static ILoggerBuilder AddDebugLogProvider(this ILoggerBuilder builder, Action <DebugLogProviderOptions> configureOptions = null) { if (builder is null) { throw new ArgumentNullException(nameof(builder)); } return(builder.AddLogProvider(serviceProvider => { var optionsLoggerName = builder.LoggerName == Logger.DefaultName ? Options.DefaultName : builder.LoggerName; var optionsMonitor = serviceProvider.GetService <IOptionsMonitor <DebugLogProviderOptions> >(); var options = optionsMonitor?.Get(optionsLoggerName) ?? new DebugLogProviderOptions(); configureOptions?.Invoke(options); var formatter = options.FormatterRegistration?.Invoke(serviceProvider) ?? new TemplateLogFormatter(DebugLogProvider.DefaultTemplate); return new DebugLogProvider(formatter, options.Level, options.Timeout); })); }
/// <summary> /// Adds the <see cref="HttpContextProvider"/> to the logger builder. /// </summary> /// <param name="builder">The logger builder.</param> /// <returns>The same logger builder.</returns> public static ILoggerBuilder AddHttpContextProvider(this ILoggerBuilder builder) => builder.AddContextProvider <HttpContextProvider>();
void IWhiteLogLogger.AddLogger(ILoggerBuilder logger) { m_addLogger.Invoke(logger); }