using System; using JD.Kernel.StaticHelpers; namespace JD.LogService { /// /// Basic logging facilities. /// public static class Logger { private static ILogger m_emptyLogger; /// /// Gets a logger that does nothing except not being null :) /// public static ILogger Empty { get { return m_emptyLogger = m_emptyLogger ?? new EmptyLogger(); } } /// /// Creates and return a delegated logger. /// /// Will be used as the logging action of the logger. public static ILogger FromAction(Action logAction) { return new DelegatedLogger(logAction); } /// /// Returns a wrapper logger that locks each log call individually. /// public static ILogger Locked(ILogger logger) { return new LockedLogger(logger); } public static ILogger CreateConsoleLogger() { return new ConsoleLogger(); } #region Nested private class EmptyLogger : ILogger { public void Log(LogEvent @event) { // Do nothing! } } private class DelegatedLogger : ILogger { private readonly Action m_logAction; public DelegatedLogger(Action logAction) { Throw.IfNull(logAction, "logAction"); m_logAction = logAction; } public void Log(LogEvent @event) { m_logAction(@event); } } private class LockedLogger : ILogger { private readonly object m_lock = new object(); private readonly ILogger m_logger; public LockedLogger(ILogger logger) { Throw.IfNull(logger, "logger"); m_logger = logger; } public void Log(LogEvent @event) { lock (m_lock) { m_logger.Log(@event); } } } private class ConsoleLogger : ILogger { public void Log(LogEvent @event) { if (@event.Category == LogCategory.Error) { Console.Error.WriteLine(@event.ToCanonicalString()); } else if (@event.Category == LogCategory.Warning) { Console.Out.WriteLine(@event.ToCanonicalString()); } else { Console.Out.WriteLine(@event.Message); } } } #endregion } }