voile/Voile/VoileLog4netBridge.cs

79 lines
2.5 KiB
C#

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;
}
}
}