using System; using System.Collections.Generic; using System.Linq; namespace FileInterface.Scheduler { public sealed class JobLogEntry { public DateTime Timestamp { get; set; } public string JobType { get; set; } public string JobId { get; set; } public string JobName { get; set; } public string Level { get; set; } public string Message { get; set; } } public sealed class JobLog { private readonly object _sync = new object(); private readonly Queue _entries = new Queue(); private readonly int _maxEntries; public JobLog(int maxEntries) { _maxEntries = Math.Max(100, maxEntries); } public void Info(CronJobConfig job, string message) { Add("CRON", job == null ? "" : job.Id, job == null ? "" : job.Name, "INFO", message); } public void Error(CronJobConfig job, string message) { Add("CRON", job == null ? "" : job.Id, job == null ? "" : job.Name, "ERROR", message); } public void Info(WatcherJobConfig job, string message) { Add("WATCHER", job == null ? "" : job.Id, job == null ? "" : job.Name, "INFO", message); } public void Error(WatcherJobConfig job, string message) { Add("WATCHER", job == null ? "" : job.Id, job == null ? "" : job.Name, "ERROR", message); } public void SystemInfo(string message) { Add("SYSTEM", "", "System", "INFO", message); } public void SystemError(string message) { Add("SYSTEM", "", "System", "ERROR", message); } public IList GetLatest(int limit) { lock (_sync) { return _entries.Reverse().Take(Math.Max(1, Math.Min(limit, _maxEntries))).ToList(); } } private void Add(string jobType, string jobId, string jobName, string level, string message) { lock (_sync) { _entries.Enqueue(new JobLogEntry { Timestamp = DateTime.Now, JobType = jobType ?? "", JobId = jobId ?? "", JobName = jobName ?? "", Level = level, Message = message ?? "" }); while (_entries.Count > _maxEntries) _entries.Dequeue(); } } } }