public static void LogStartConfiguration(this ILogger logger, IConfiguration configuration = default, bool jgEnvVars = true) { if (configuration != default) { var configurationDictionary = configuration.AsEnumerable().ToDictionary(x => x.Key, y => y.Value); var secrets = configuration.GetSection(LogProps.APP_SETTING_SECRETS_KEY)?.Get <List <string> >(); secrets?.ForEach(key => configurationDictionary.Remove(key)); // TODO: Customize dumping to not include sensitive data logger.ForContext(LogProps.APP_SETTINGS, configurationDictionary, true) .Information("AppSettings dump. See props for details."); var enrich = new EnrichLoggingConfiguration(); // TODO: Move to Constants configuration.Bind("JG-Logging:Enrich", enrich); var props = new Dictionary <string, string> { [LogProps.DEVOPS_ENV_NAME] = enrich.DevOpsEnvName, [LogProps.BRANCH] = enrich.Branch, [LogProps.COMMIT] = enrich.Commit, [LogProps.BUILD] = enrich.Build, [LogProps.BUILD_NAME] = enrich.BuildName, [LogProps.BUILT_BY] = enrich.BuiltBy, [LogProps.RELEASE] = enrich.Release, [LogProps.RELEASE] = enrich.Release, [LogProps.RELEASE_NAME] = enrich.ReleaseName, [LogProps.RELEASE_BY] = enrich.ReleaseBy }; logger.ForContext(LogProps.DEV_OPS, props, true) .Information("DevOps configuration. See props for details."); } if (jgEnvVars) { IDictionary <string, object> inaSettings = new Dictionary <string, object>(); foreach (DictionaryEntry entry in Environment.GetEnvironmentVariables()) { var key = entry.Key.ToString(); if (key.StartsWith("JG_")) { inaSettings.Add(key, entry.Value); } } logger.ForContext(LogProps.JG_ENV_VARS, inaSettings, true) .Information("JG environment variables dump. See props for details."); } }
public ILogger Build() { _loggerConfiguration = _loggerConfiguration ?? new LoggerConfiguration(); var jgLoggingConfiguration = new JgLoggingConfiguration(); var enrichLoggingConfig = new EnrichLoggingConfiguration(); _configuration?.Bind("JG-Logging:Enrich", enrichLoggingConfig); _configuration?.Bind("JG-Logging:Serilog", jgLoggingConfiguration); if (jgLoggingConfiguration.WriteToSeq) { var seqLoggingConfig = new SeqLoggingConfiguration(); _configuration?.Bind("JG-Logging:Serilog:Seq", seqLoggingConfig); _loggerConfiguration .Destructure.JsonNetTypes() .WriteTo.Seq( seqLoggingConfig.ServerUrl, seqLoggingConfig.RestrictedToMinimumLevel, seqLoggingConfig.BatchPostingLimit, seqLoggingConfig.Period, seqLoggingConfig.ApiKey, seqLoggingConfig.BufferBaseFilename, seqLoggingConfig.BufferSizeLimitBytes, seqLoggingConfig.EventBodyLimitBytes, seqLoggingConfig.ControlLevelSwitch, null, seqLoggingConfig.RetainedInvalidPayloadsLimitBytes, seqLoggingConfig.Compact, seqLoggingConfig.QueueSizeLimit); } if (jgLoggingConfiguration.WriteToColoredConsole) { _loggerConfiguration.WriteTo.ColoredConsole(); } if (jgLoggingConfiguration.WriteToFile) { var fileLoggingConfig = new FileLoggingConfiguration(); _loggerConfiguration.WriteTo.File( // Note: IIS requires write access Path.Combine(Environment.CurrentDirectory, fileLoggingConfig.Path), fileLoggingConfig.RestrictedToMinimumLevel, fileLoggingConfig.OutputTemplate, null, fileLoggingConfig.FileSizeLimitBytes, fileLoggingConfig.LevelSwitch, fileLoggingConfig.Buffered, fileLoggingConfig.Shared, fileLoggingConfig.FlushToDiskInterval, fileLoggingConfig.RollingInterval, fileLoggingConfig.RollOnFileSizeLimit, fileLoggingConfig.RetainedFileCountLimit); } _loggerConfiguration .Enrich.FromLogContext() .Enrich.WithExceptionDetails() .Enrich.WithMachineName() .Enrich.WithEnvironmentUserName() .Enrich.WithProcessName() .Enrich.WithProcessId() .Enrich.WithProperty(LogProps.APPLICATION, "JG.FinTechTest") .Enrich.WithProperty(LogProps.ENVIRONMENT, _environment) .Enrich.WithProperty(LogProps.ENV_NAME, enrichLoggingConfig.EnvName); _loggerConfiguration.MinimumLevel.Debug() .MinimumLevel.Override("Microsoft", LogEventLevel.Error) .MinimumLevel.Override("System", LogEventLevel.Error); _loggerConfiguration.Enrich.With(new CorrelationEnricher(new CorrelationContextAccessor())); // TODO: Revisit this, although Props is shorter, how much does it cost us to clone the dictionary? _loggerConfiguration.Destructure.ByTransformingWhere <Props>(type => type == typeof(Props), value => value.ToDictionary(entry => entry.Key, entry => entry.Value)); return(_loggerConfiguration.CreateLogger()); }