using System; using System.IO; using System.Text; using Newtonsoft.Json; using SyncEngine.Configuration; namespace SyncEngine.MySql { /// Appends failed shop_sync_log API posts to logs/shop-sync-log-failed-YYYYMMDD.jsonl. public static class ShopSyncLogLocalWriter { private static Func LogDirectoryProvider = () => Path.Combine(EnvSettings.ExeDirectory(), "logs"); internal static void SetLogDirectoryProviderForTests(Func provider) { LogDirectoryProvider = provider ?? (() => Path.Combine(EnvSettings.ExeDirectory(), "logs")); } internal static void ResetLogDirectoryProviderForTests() { LogDirectoryProvider = () => Path.Combine(EnvSettings.ExeDirectory(), "logs"); } /// Path to the file the record was appended to. public static string WriteFailedApiPost(ShopSyncLogEntry entry, Exception mysqlEx, Exception apiEx) { var logDir = LogDirectoryProvider(); Directory.CreateDirectory(logDir); var path = Path.Combine(logDir, "shop-sync-log-failed-" + DateTime.UtcNow.ToString("yyyyMMdd") + ".jsonl"); var record = new { logged_at = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss"), mysql_error = mysqlEx != null ? mysqlEx.Message : null, api_error = apiEx != null ? apiEx.Message : null, payload = ShopSyncLogApiClient.BuildPayload(entry) }; File.AppendAllText(path, JsonConvert.SerializeObject(record) + Environment.NewLine, Encoding.UTF8); return path; } } }