using AWS.Logger;
using System;
using System.Linq;
// Placed in the Microsoft namespaces so that the extension methods are visible whenever the owning namespace
// is declared.
namespace Microsoft.Extensions.Configuration
{
///
/// Extensions methods for IConfiguration to lookup AWS logger configuration
///
public static class ConfigurationSectionExtensions
{
// Default configuration block on the appsettings.json
// Customer's information will be fetched from this block unless otherwise set.
private const string DEFAULT_BLOCK = "Logging";
// This library was originally written before logging standarized, or it at least we didn't realize it was standarized, on the "Logging" section in the config.
// The library now uses "Logging" as the default section to look for config but to maintain backwards compatibility the package will fallback
// AWS.Logging if a log group is not configured in the "Logging" config block".
private const string LEGACY_DEFAULT_BLOCK = "AWS.Logging";
///
/// Loads the AWS Logger Configuration from the ConfigSection
///
/// ConfigSection
/// ConfigSection SubPath to load from
///
public static AWSLoggerConfigSection GetAWSLoggingConfigSection(this IConfiguration configSection, string configSectionInfoBlockName = DEFAULT_BLOCK)
{
var loggerConfigSection = configSection.GetSection(configSectionInfoBlockName);
AWSLoggerConfigSection configObj = null;
if (loggerConfigSection[AWSLoggerConfigSection.LOG_GROUP] != null)
{
configObj = new AWSLoggerConfigSection(loggerConfigSection);
}
// If the code was relying on the default config block and no log group was found then
// check the legacy default block.
else if(string.Equals(configSectionInfoBlockName, DEFAULT_BLOCK, StringComparison.InvariantCulture))
{
loggerConfigSection = configSection.GetSection(LEGACY_DEFAULT_BLOCK);
if (loggerConfigSection[AWSLoggerConfigSection.LOG_GROUP] != null)
{
configObj = new AWSLoggerConfigSection(loggerConfigSection);
}
}
return configObj;
}
}
///
/// This class stores the configuration section information to connect to AWS and how the messages should be sent and the LogLevel section details
///
public class AWSLoggerConfigSection
{
///
/// Configuration options for logging messages to AWS
///
public AWSLoggerConfig Config { get; set; } = new AWSLoggerConfig();
///
/// Custom LogLevel Filters for
///
public IConfiguration LogLevels { get; set; } = null;
///
/// Gets the property. This determines if scopes - if they exist - are included in a log message.
///
/// The default is false.
///
///
public bool IncludeScopes { get; set; } = AWS.Logger.AspNetCore.Constants.IncludeScopesDefault;
///
/// Gets the property. This determines if log level is included in a log message.
///
/// The default is true.
///
///
public bool IncludeLogLevel { get; set; } = AWS.Logger.AspNetCore.Constants.IncludeLogLevelDefault;
///
/// Gets the property. This determines if category is included in a log message.
///
/// The default is true.
///
///
public bool IncludeCategory { get; set; } = AWS.Logger.AspNetCore.Constants.IncludeCategoryDefault;
///
/// Gets the property. This determines if event id is included in a log message.
///
/// The default is false.
///
///
public bool IncludeEventId { get; set; } = AWS.Logger.AspNetCore.Constants.IncludeEventIdDefault;
///
/// Gets the property. This determines if a new line is added to the end of the log message.
///
/// The default is true.
///
///
public bool IncludeNewline { get; set; } = AWS.Logger.AspNetCore.Constants.IncludeNewlineDefault;
///
/// Gets the property. This determines if exceptions are included in a log message.
///
/// The default is false.
///
///
public bool IncludeException { get; set; } = AWS.Logger.AspNetCore.Constants.IncludeExceptionDefault;
internal const string LOG_GROUP = "LogGroup";
internal const string DISABLE_LOG_GROUP_CREATION = "DisableLogGroupCreation";
internal const string REGION = "Region";
internal const string SERVICEURL = "ServiceUrl";
internal const string PROFILE = "Profile";
internal const string PROFILE_LOCATION = "ProfilesLocation";
internal const string BATCH_PUSH_INTERVAL = "BatchPushInterval";
internal const string BATCH_PUSH_SIZE_IN_BYTES = "BatchPushSizeInBytes";
internal const string LOG_LEVEL = "LogLevel";
internal const string MAX_QUEUED_MESSAGES = "MaxQueuedMessages";
internal const string LOG_STREAM_NAME_SUFFIX = "LogStreamNameSuffix";
internal const string LOG_STREAM_NAME_PREFIX = "LogStreamNamePrefix";
internal const string LIBRARY_LOG_FILE_NAME = "LibraryLogFileName";
internal const string LIBRARY_LOG_ERRORS = "LibraryLogErrors";
internal const string FLUSH_TIMEOUT = "FlushTimeout";
private const string INCLUDE_LOG_LEVEL_KEY = "IncludeLogLevel";
private const string INCLUDE_CATEGORY_KEY = "IncludeCategory";
private const string INCLUDE_NEWLINE_KEY = "IncludeNewline";
private const string INCLUDE_EXCEPTION_KEY = "IncludeException";
private const string INCLUDE_EVENT_ID_KEY = "IncludeEventId";
private const string INCLUDE_SCOPES_KEY = "IncludeScopes";
///
/// Construct an instance of AWSLoggerConfigSection
///
/// ConfigSection to parse
public AWSLoggerConfigSection(IConfiguration loggerConfigSection)
{
Config.LogGroup = loggerConfigSection[LOG_GROUP];
Config.DisableLogGroupCreation = loggerConfigSection.GetValue(DISABLE_LOG_GROUP_CREATION);
if (loggerConfigSection[REGION] != null)
{
Config.Region = loggerConfigSection[REGION];
}
if (loggerConfigSection[SERVICEURL] != null)
{
Config.ServiceUrl = loggerConfigSection[SERVICEURL];
}
if (loggerConfigSection[PROFILE] != null)
{
Config.Profile = loggerConfigSection[PROFILE];
}
if (loggerConfigSection[PROFILE_LOCATION] != null)
{
Config.ProfilesLocation = loggerConfigSection[PROFILE_LOCATION];
}
if (loggerConfigSection[BATCH_PUSH_INTERVAL] != null)
{
Config.BatchPushInterval = TimeSpan.FromMilliseconds(Int32.Parse(loggerConfigSection[BATCH_PUSH_INTERVAL]));
}
if (loggerConfigSection[BATCH_PUSH_SIZE_IN_BYTES] != null)
{
Config.BatchSizeInBytes = Int32.Parse(loggerConfigSection[BATCH_PUSH_SIZE_IN_BYTES]);
}
if (loggerConfigSection[MAX_QUEUED_MESSAGES] != null)
{
Config.MaxQueuedMessages = Int32.Parse(loggerConfigSection[MAX_QUEUED_MESSAGES]);
}
if (loggerConfigSection[LOG_STREAM_NAME_SUFFIX] != null)
{
Config.LogStreamNameSuffix = loggerConfigSection[LOG_STREAM_NAME_SUFFIX];
}
if (loggerConfigSection[LOG_STREAM_NAME_PREFIX] != null)
{
Config.LogStreamNamePrefix = loggerConfigSection[LOG_STREAM_NAME_PREFIX];
}
if (loggerConfigSection[LIBRARY_LOG_FILE_NAME] != null)
{
Config.LibraryLogFileName = loggerConfigSection[LIBRARY_LOG_FILE_NAME];
}
if (loggerConfigSection[LIBRARY_LOG_ERRORS] != null)
{
Config.LibraryLogErrors = Boolean.Parse(loggerConfigSection[LIBRARY_LOG_ERRORS]);
}
if (loggerConfigSection[FLUSH_TIMEOUT] != null)
{
Config.FlushTimeout = TimeSpan.FromMilliseconds(Int32.Parse(loggerConfigSection[FLUSH_TIMEOUT]));
}
if (loggerConfigSection[INCLUDE_LOG_LEVEL_KEY] != null)
{
this.IncludeLogLevel = Boolean.Parse(loggerConfigSection[INCLUDE_LOG_LEVEL_KEY]);
}
if (loggerConfigSection[INCLUDE_CATEGORY_KEY] != null)
{
this.IncludeCategory = Boolean.Parse(loggerConfigSection[INCLUDE_CATEGORY_KEY]);
}
if (loggerConfigSection[INCLUDE_NEWLINE_KEY] != null)
{
this.IncludeNewline = Boolean.Parse(loggerConfigSection[INCLUDE_NEWLINE_KEY]);
}
if (loggerConfigSection[INCLUDE_EXCEPTION_KEY] != null)
{
this.IncludeException = Boolean.Parse(loggerConfigSection[INCLUDE_EXCEPTION_KEY]);
}
if (loggerConfigSection[INCLUDE_EVENT_ID_KEY] != null)
{
this.IncludeEventId = Boolean.Parse(loggerConfigSection[INCLUDE_EVENT_ID_KEY]);
}
if (loggerConfigSection[INCLUDE_SCOPES_KEY] != null)
{
this.IncludeScopes = Boolean.Parse(loggerConfigSection[INCLUDE_SCOPES_KEY]);
}
var logLevels = loggerConfigSection.GetSection(LOG_LEVEL);
if (logLevels?.GetChildren().Any() == true)
{
this.LogLevels = logLevels;
}
}
}
}