80 lines
2.4 KiB
C#
80 lines
2.4 KiB
C#
using log4net;
|
|
using log4net.Appender;
|
|
using log4net.Core;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using log4net.Repository;
|
|
using log4net.Repository.Hierarchy;
|
|
|
|
namespace skyscraper8.Skyscraper.Plugins
|
|
{
|
|
internal class PluginAppender : AppenderSkeleton
|
|
{
|
|
private PluginAppenderEx _finalOutput;
|
|
protected override void Append(LoggingEvent loggingEvent)
|
|
{
|
|
object? messageObject = loggingEvent.MessageObject;
|
|
if (messageObject == null)
|
|
messageObject = "";
|
|
PluginLogLevel mappedLevel = MapLevel(loggingEvent.Level);
|
|
DateTime mappedTime = DateTime.Now;
|
|
string mappedLoggerName = loggingEvent.LoggerName;
|
|
string mappedMessage = messageObject.ToString();
|
|
_finalOutput.Log(mappedTime, mappedLevel, mappedLoggerName, mappedMessage);
|
|
}
|
|
|
|
private PluginLogLevel MapLevel(Level loggingEventLevel)
|
|
{
|
|
if (loggingEventLevel.Equals(Level.Debug))
|
|
return PluginLogLevel.Debug;
|
|
else if (loggingEventLevel.Equals(Level.All))
|
|
return PluginLogLevel.All;
|
|
else if (loggingEventLevel.Equals(Level.Error))
|
|
return PluginLogLevel.Error;
|
|
else if (loggingEventLevel.Equals(Level.Fatal))
|
|
return PluginLogLevel.Fatal;
|
|
else if (loggingEventLevel.Equals(Level.Info))
|
|
return PluginLogLevel.Info;
|
|
else if (loggingEventLevel.Equals(Level.Warn))
|
|
return PluginLogLevel.Warn;
|
|
else if (loggingEventLevel.Equals(Level.Off))
|
|
return PluginLogLevel.Off;
|
|
else
|
|
throw new NotImplementedException(loggingEventLevel.ToString());
|
|
}
|
|
|
|
internal PluginAppender(PluginAppenderEx pex)
|
|
{
|
|
this._finalOutput = pex;
|
|
}
|
|
}
|
|
|
|
public abstract class PluginAppenderEx
|
|
{
|
|
private static readonly ILog logger = LogManager.GetLogger(typeof(PluginAppenderEx));
|
|
private PluginAppender appender;
|
|
|
|
public abstract void Log(DateTime mappedTime, PluginLogLevel mappedLevel, string? mappedLoggerName, string? mappedMessage);
|
|
|
|
private bool registered;
|
|
public void Register()
|
|
{
|
|
if (registered)
|
|
throw new PluginsException("Appender was already registered.");
|
|
|
|
logger.DebugFormat("Registering a log appender plugin: {0}",this.GetType().Name);
|
|
|
|
appender = new PluginAppender(this);
|
|
|
|
ILoggerRepository loggerRepository = log4net.LogManager.GetRepository();
|
|
Hierarchy hierarchy = (log4net.Repository.Hierarchy.Hierarchy)loggerRepository;
|
|
hierarchy.Root.AddAppender(appender);
|
|
|
|
registered = true;
|
|
}
|
|
}
|
|
}
|