namespace PrismaticSync.Infrastructure; /// /// Minimal timestamped logger — writes to the console and appends to a rolling log file so an /// unattended (Task Scheduler) run leaves an audit trail. Intentionally dependency-free. /// public static class Log { private static string _logFile = "prismatic-sync.log"; private static readonly object Gate = new(); public static void Configure(string logFile) => _logFile = logFile; public static void Info(string message) => Write("INFO", message); public static void Warn(string message) => Write("WARN", message); public static void Error(string message) => Write("ERROR", message); private static void Write(string level, string message) { var line = $"[{DateTime.UtcNow:yyyy-MM-ddTHH:mm:ssZ}] {level,-5} {message}"; // Live console stream (visible on a manual run); color-code so warnings/errors stand out. lock (Gate) { var color = level switch { "WARN" => ConsoleColor.Yellow, "ERROR" => ConsoleColor.Red, _ => (ConsoleColor?)null }; if (color is { } c) { var previous = Console.ForegroundColor; Console.ForegroundColor = c; Console.WriteLine(line); Console.ForegroundColor = previous; } else { Console.WriteLine(line); } // File trail — never let logging break a run. try { File.AppendAllText(_logFile, line + Environment.NewLine); } catch { /* ignore */ } } } }