using System; using System.Diagnostics; namespace Umbraco.Core.Logging { /// /// Implements by writing profiling results to an . /// internal class LogProfiler : IProfiler { private readonly ILogger _logger; public LogProfiler(ILogger logger) { _logger = logger; } /// public string Render() { return string.Empty; } /// public IDisposable Step(string name) { _logger.Debug("Begin: {ProfileName}", name); return new LightDisposableTimer(duration => _logger.Info("End {ProfileName} ({ProfileDuration}ms)", name, duration)); } /// public void Start() { // the log will always be started } /// public void Stop(bool discardResults = false) { // the log never stops } // a lightweight disposable timer private class LightDisposableTimer : DisposableObjectSlim { private readonly Action _callback; private readonly Stopwatch _stopwatch = Stopwatch.StartNew(); protected internal LightDisposableTimer(Action callback) { if (callback == null) throw new ArgumentNullException(nameof(callback)); _callback = callback; } protected override void DisposeResources() { _stopwatch.Stop(); _callback(_stopwatch.ElapsedMilliseconds); } } } }