Ejemplo n.º 1
0
        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.");
            }
        }
Ejemplo n.º 2
0
        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());
        }