public async Task ExecuteAsync(string configFilePath)
        {
            ILogger logger = _logger;
            var     totalNewExecutedScript = 0;

            try
            {
                logger.Info($"Loading configuration file {configFilePath}.");
                var configContent = _ioHelper.LoadFileContent(configFilePath);
                var configuration = MigrationConfiguration.ParseConfiguration(configContent);
                logger.Info($"Configuration file {configFilePath} loaded successfully.");

                if (!string.IsNullOrWhiteSpace(configuration.LogOutputDirectory))
                {
                    logger = new FileLogger(configuration.LogOutputDirectory, "output.log", _logger);
                }

                var trackerRepository = _trackerRepositoryFactory.GetTrackerRepository(configuration.DbConnection);

                logger.Info($"Checking if db_megreat_track table available in the database.");
                if (!await trackerRepository.CheckTrackTableExistAsync())
                {
                    logger.Info($"db_megreat_track table is not available in the database. Creating the table.");
                    await trackerRepository.CreateTrackTableAsync();

                    logger.Info($"db_megreat_track table successfully created.");
                }
                else
                {
                    logger.Info("db_megreat_track table is available in the database.");
                }

                logger.Info("Loading schema history records from db_megreat_track table.");
                var schemaHistoryRecords = await trackerRepository.GetSchemaHistoryRecordsAsync();

                logger.Info("Schema history records loaded successfully.");

                foreach (var directory in configuration.SqlFilesDirectories)
                {
                    logger.Info($"Searching {directory} directory for *.sql files.");
                    var directoryPath = directory.EndsWith("/") ? directory : $"{directory}/";
                    var files         = _ioHelper.GetFilesFromDirectory(directoryPath);
                    logger.Info($"{files.Count()} *.sql file(s) have been found in {directory}.");

                    foreach (var file in files.OrderBy(x => x))
                    {
                        if (!schemaHistoryRecords.ContainsKey(file))
                        {
                            logger.Info($"Executing {file}.");
                            var scriptContent = _ioHelper.LoadFileContent(file);
                            await trackerRepository.ExecuteNonQueryAsync(scriptContent);

                            await trackerRepository.InsertTrackingAsync(file);

                            logger.Info($"{file} has been executed successfully.");

                            totalNewExecutedScript++;
                        }
                    }
                }

                if (totalNewExecutedScript > 0)
                {
                    logger.Info($"{totalNewExecutedScript} script(s) have been executed. Your database shcema is now up to date.");
                }
                else
                {
                    logger.Info("No new script has been found. Your database schema is up to date.");
                }
            }
            catch (Exception ex)
            {
                logger.Error("There is a problem during updating the database schema.", ex);
            }
        }