using System.Diagnostics.CodeAnalysis; using Serilog.Events; namespace Phantom.Common.Logging; static class DefaultLogLevel { private const string ENVIRONMENT_VARIABLE = "LOG_LEVEL"; public static LogEventLevel Value { get; } = GetDefaultLevel(); public static LogEventLevel Coerce(LogEventLevel level) { return level < Value ? Value : level; } private static LogEventLevel GetDefaultLevel() { var level = Environment.GetEnvironmentVariable(ENVIRONMENT_VARIABLE); return level switch { "VERBOSE" => LogEventLevel.Verbose, "DEBUG" => LogEventLevel.Debug, "INFORMATION" => LogEventLevel.Information, "WARNING" => LogEventLevel.Warning, "ERROR" => LogEventLevel.Error, null => GetDefaultLevelFallback(), _ => LogEnvironmentVariableErrorAndExit(level) }; } private static LogEventLevel GetDefaultLevelFallback() { #if DEBUG return LogEventLevel.Verbose; #else return LogEventLevel.Information; #endif } [DoesNotReturn] private static LogEventLevel LogEnvironmentVariableErrorAndExit(string logLevel) { Console.Error.WriteLine("Invalid value of environment variable {0}: {1}", ENVIRONMENT_VARIABLE, logLevel); Environment.Exit(1); return LogEventLevel.Fatal; } }