public static LoggerConfiguration WithConsoleLog(this LoggerConfiguration logger, NanoLoggerManager manager, IPropertyRetriever propertyRetriever, bool withDefaultConsoleLog = false)
        {
            if (withDefaultConsoleLog)
            {
                logger = logger
                         .WriteTo.Console(
                    outputTemplate: "{Timestamp} [{ColoredLogLevel}] (MachineName: {MachineName}) (Thread: {ThreadId}) {Message} {Exception}{NewLine}",
                    levelSwitch: new LoggingLevelSwitch());
            }
            else
            {
                var withConsoleLog = propertyRetriever.CheckFromCommandLine("withConsoleLog");

                if (withConsoleLog)
                {
                    var consoleMessageTemplate = propertyRetriever.RetrieveFromCommandLineOrEnvironment("consoleMessageTemplate", "consoleMessageTemplate", "{Timestamp} [{LogLevel}] (MachineName: {MachineName}) (Thread: {ThreadId}) {Message} {Exception}{NewLine}").Replace("{LogLevel}", "{ColoredLogLevel}");
                    manager.SetConsoleLoggingLevel(propertyRetriever.RetrieveFromCommandLineOrEnvironment("consoleMinimumLogEventLevel", "consoleMinimumLogEventLevel", LogLevel.None));
                    logger = logger
                             .WriteTo.Console(
                        outputTemplate: consoleMessageTemplate,
                        levelSwitch: manager.ConsoleLoggingLevelSwitch);
                }
            }

            return(logger);
        }
        public static LoggerConfiguration WithSeqLog(this LoggerConfiguration logger, NanoLoggerManager manager, IPropertyRetriever propertyRetriever)
        {
            var withSeqLog = propertyRetriever.CheckFromCommandLine("withSeqLog");

            if (withSeqLog)
            {
                var seqAddress = propertyRetriever.RetrieveFromCommandLineOrEnvironment("seqLogAddress", "seqLogAddress", null);
                var seqApiKey  = propertyRetriever.RetrieveFromCommandLineOrEnvironment("seqApiKey", "seqApiKey", null);
                manager.SetSeqLoggingLevel(propertyRetriever.RetrieveFromCommandLineOrEnvironment("seqMinimumLogEventLevel", "seqMinimumLogEventLevel", LogLevel.None));

                logger = logger
                         .WriteTo.Seq(
                    serverUrl: seqAddress,
                    apiKey: seqApiKey,
                    controlLevelSwitch: manager.SeqLoggingLevelSwitch);
            }

            return(logger);
        }
        public static LoggerConfiguration WithFileLog(this LoggerConfiguration logger, NanoLoggerManager manager, IPropertyRetriever propertyRetriever)
        {
            var withFileLog = propertyRetriever.CheckFromCommandLine("withFileLog");

            if (withFileLog)
            {
                var fileMessageTemplate = propertyRetriever.RetrieveFromCommandLineOrEnvironment("fileMessageTemplate", "fileMessageTemplate", "{Timestamp} [{LogLevel}] (MachineName: {MachineName}) (Thread: {ThreadId}) {Message} {Exception}{NewLine}");
                var fileRollingInterval = propertyRetriever.RetrieveFromCommandLineOrEnvironment("fileRollingInterval", "fileRollingInterval", RollingInterval.Hour);
                manager.SetFileLoggingLevel(propertyRetriever.RetrieveFromCommandLineOrEnvironment("fileMinimumLogEventLevel", "fileMinimumLogEventLevel", LogLevel.None));

                logger = logger
                         .WriteTo.File(
                    path: $"log\\log_{propertyRetriever.RetrieveServiceName()}_.txt",
                    levelSwitch: manager.FileLoggingLevelSwitch,
                    rollingInterval: fileRollingInterval,
                    outputTemplate: fileMessageTemplate,
                    shared: true);
            }

            return(logger);
        }