using System.Diagnostics.CodeAnalysis; using System.Text; using InABox.Core; namespace InABox.Logging; public class LogFileLogger : LoggerBase { private static readonly object logfileLock = new(); private string TmpFolder; private string _folder; public string Folder { get => _folder; [MemberNotNull(nameof(_folder), nameof(TmpFolder))] set { _folder = value; TmpFolder = Path.Combine(Folder, "Temp"); if (Directory.Exists(TmpFolder)) { Directory.CreateDirectory(TmpFolder); var files = Directory.GetFiles(TmpFolder); foreach (var file in files) File.Delete(file); } } } public LogFileLogger(string folder) { Folder = folder; } public override void Send(LogType logtype, string user, string message, Guid transaction) { if (logtype == LogType.Update) UpdateJournal(message); else base.Send(logtype, user, message, transaction); } protected override void DoSend(string message) { if (!string.IsNullOrEmpty(Folder)) { UpdateLogFile(message); } } private void UpdateLogFile(string msg) { if (!Directory.Exists(Folder)) Directory.CreateDirectory(Folder); var filename = Path.Combine(Folder, string.Format("{0:yyyy-MM-dd}.log", DateTime.Today)); try { lock (logfileLock) { using (var sw = new StreamWriter(filename, true, Encoding.UTF8, 65536)) { sw.WriteLine(msg); sw.Close(); } } } catch (Exception e) { Console.WriteLine("*** Failed to Update Log: " + e.Message); Console.WriteLine("*** Message: " + msg); } } private void UpdateJournal(string sql) { var filename = Path.Combine(Folder, string.Format("{0:yyyy-MM-dd}.sql", DateTime.Today)); try { lock (logfileLock) { using (var sw = new StreamWriter(filename, true, Encoding.UTF8, 65536)) { sw.WriteLine(sql); sw.Close(); } } } catch (Exception e) { Console.WriteLine("*** Failed to Update SQL Journal: " + e.Message); Console.WriteLine("*** Message: " + sql); } } }