using log4net.Appender; using log4net.Core; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Voile.Common; using Voile.Common.Logging; namespace Voile { internal class VoileLog4netSink : IAppender { private VoileLogger myOwnLogger; private bool wasInitalized; private bool isClosed; public void Initalize() { if (wasInitalized) { throw new VoileException("Log sink already initalized."); } myOwnLogger = VoileLogManager.GetLogger(GetType()); myOwnLogger.Debug("Initalize VoileLog4netSink"); var hierarchy = (log4net.Repository.Hierarchy.Hierarchy)log4net.LogManager.GetRepository(); hierarchy.Root.AddAppender(this); hierarchy.Root.Level = log4net.Core.Level.All; log4net.Config.BasicConfigurator.Configure(hierarchy); wasInitalized = true; } private log4net.Layout.PatternLayout logLayout; private string log4netName; public string Name { get => log4netName; set => log4netName = value; } public void DoAppend(LoggingEvent loggingEvent) { if (isClosed) { throw new VoileException("Can't append to a closed logger."); } if (logLayout == null) { logLayout = new log4net.Layout.PatternLayout(); logLayout.ConversionPattern = "%date %level %logger - %message"; logLayout.ActivateOptions(); } string v = logLayout.Format(loggingEvent); string loggerName = loggingEvent.LoggerName; VoileLogLevel logLevel = TranslateLogLevel(loggingEvent.Level); VoileLogManager.GetLogger(loggerName).Log(logLevel, loggingEvent.RenderedMessage); } private VoileLogLevel TranslateLogLevel(Level level) { switch(level.Value) { case 30000: return VoileLogLevel.DEBUG; case 40000: return VoileLogLevel.INFO; default: throw new NotImplementedException(String.Format("Loglevel: {0}", level.Value)); } } public void Close() { isClosed = true; } } }