public static void DeleteOldLogFiles(LoggingData data, string dirFullName)
        {
            if (
                data.ConfigurationSettings.DaysToRetain <= 0 ||        //don't bother to check if we're not configured to delete files.
                _lastFileDeleteCheck > DateTime.Now.AddMinutes(-5)     //only check every 5 minutes, avoid costly call on every log entry.
                )
            {
                return;
            }

            Console.WriteLine($"Checking delete log files, dir: {dirFullName}");

            var numberOfDays = data.ConfigurationSettings.DaysToRetain;
            var cutoffDate   = DateTime.Now.Date.AddDays(numberOfDays * -1);

            var dirInfo             = new DirectoryInfo(dirFullName);
            var listOfFilesToDelete = dirInfo.GetFiles().Where(x => x.CreationTime.Date < cutoffDate)
                                      .Select(x => x)
                                      .ToList();

            foreach (var file in listOfFilesToDelete)
            {
                Console.WriteLine($"Deleting old log file: {file.Name}");
                file.Delete();
            }
            _lastFileDeleteCheck = DateTime.Now;
        }
        //public async Task FatalAsync(string message) => await FatalAsync(message, null);
        //public async Task FatalAsync(string message, Exception exception) => await LogAsync(LogLevel.Fatal, message, exception);
        //-----------------------

        private void Log(LogLevel logLevel, string message, Exception exception)
        {
            if (logLevel < FileLogLevelAsEnum && logLevel < ConsoleLogLevelAsEnum)
            {
                return;
            }

            var data = new LoggingData
            {
                ConfigurationSettings = ConfigurationSettings,
                LogLevel        = logLevel,
                CurrentDateTime = DateTime.Now,
                Message         = message
            };

            var renderer = new ContentRenderer {
                LayoutData = data
            };

            //determine log file we're writing to
            var logFileFullName = LogFileManagement.SetUpLogFile(data);
            //format the string to write
            var logContent = renderer.Render(ConfigurationSettings.LogEntryLayout) + Environment.NewLine;

            if (exception != null)
            {
                logContent += $">>>Exception Message: {exception.Message}{Environment.NewLine}{exception.StackTrace}{Environment.NewLine}";
            }

            //if Console logging enabled, write to Console

            if (ConfigurationSettings.LogToConsole && logLevel >= ConsoleLogLevelAsEnum)
            {
                Console.Write(logContent);
            }

            //write/append, non locking
            if (logLevel >= FileLogLevelAsEnum)
            {
                LogFileManagement.WriteLog(logFileFullName, logContent);
            }
        }
        public static string SetUpLogFile(LoggingData data)
        {
            CreateDirIfNotExists(data.ConfigurationSettings.LogDirectory);
            var dirFullName = Path.GetFullPath(data.ConfigurationSettings.LogDirectory);
            var dirInfo     = new DirectoryInfo(dirFullName);

            if (!dirInfo.Exists)
            {
                throw new ArgumentException($"Directory {data.ConfigurationSettings.LogDirectory} not exists and/or could not be created");
            }

            DeleteOldLogFiles(data, dirFullName);

            var renderer = new ContentRenderer
            {
                LayoutData = data
            };

            var filename = renderer.Render(data.ConfigurationSettings.LogFileName);

            return(Path.Combine(data.ConfigurationSettings.LogDirectory, filename));
        }