using System; using System.Collections.Generic; using System.Linq; using BTCPayServer.Data; namespace BTCPayServer.Logging { public class InvoiceLog { public DateTimeOffset Timestamp { get; set; } public string Log { get; set; } public InvoiceEventData.EventSeverity Severity { get; set; } public override string ToString() { return $"{Timestamp.UtcDateTime}:{Severity} {Log}"; } } public class InvoiceLogs { readonly List _InvoiceLogs = new List(); public void Write(string data, InvoiceEventData.EventSeverity eventSeverity) { lock (_InvoiceLogs) { _InvoiceLogs.Add(new InvoiceLog() { Timestamp = DateTimeOffset.UtcNow, Log = data, Severity = eventSeverity}); } } public List ToList() { lock (_InvoiceLogs) { return _InvoiceLogs.ToList(); } } internal IDisposable Measure(string logs) { return new Mesuring(this, logs); } class Mesuring : IDisposable { private readonly InvoiceLogs _logs; private readonly string _msg; private readonly DateTimeOffset _Before; public Mesuring(InvoiceLogs logs, string msg) { _logs = logs; _msg = msg; _Before = DateTimeOffset.UtcNow; } public void Dispose() { var timespan = DateTimeOffset.UtcNow - _Before; if (timespan.TotalSeconds >= 1.0) { _logs.Write($"{_msg} took {(int)timespan.TotalSeconds} seconds", InvoiceEventData.EventSeverity.Info); } else { _logs.Write($"{_msg} took {(int)timespan.TotalMilliseconds} milliseconds", InvoiceEventData.EventSeverity.Info); } } } } }