log4net configuration loading issue
description
Nullreference Exception when loading log4net file, that has been amended:
at SuperSocket.Common.DynamicLog4NetLogger.CloneAppender(RollingFileAppender appender)
at SuperSocket.Common.DynamicLog4NetLogger.AdaptAppenderFilePath()
at SuperSocket.Common.DynamicLog4NetLogger..ctor(String name, ILogger nestedLogger)
at SuperSocket.Common.DynamicLog4NetLogger..ctor(String name)
at SuperSocket.SocketBase.AppServerBase`2.SetupLogger()
at SuperSocket.SocketBase.AppServerBase`2.Setup(IRootConfig rootConfig, IServerConfig config, ISocketServerFactory socketServerFactory, ICustomProtocol`1 protocol)
at SuperSocket.SocketBase.AppServer`2.Setup(IRootConfig rootConfig, IServerConfig config, ISocketServerFactory socketServerFactory, ICustomProtocol`1 protocol)
at SuperWebSocket.WebSocketServer`1.Setup(IRootConfig rootConfig, IServerConfig config, ISocketServerFactory socketServerFactory, ICustomProtocol`1 protocol) in c:\Projects\Websockets\SuperWebSocket(0.2)\SuperWebSocket\WebSocketServer.cs:line 229
I've amended the template log4net.config file adding more appenders and SuperSocket can't handle it. The reason is:
that in SuperSocket.Common.DynamicLog4NetLogger
private void AdaptAppenderFilePath()
{
var currentLogger = Logger.Logger as log4net.Repository.Hierarchy.Logger;
currentLogger.Additivity = false;//disable root appender for this logger
foreach (var ap in m_RawAppenders)
{
//Always use shared perf appender
if (ap.Name.StartsWith("perf", StringComparison.OrdinalIgnoreCase))
{
currentLogger.AddAppender(ap);
continue;
}
var rollingFileAppender = CloneAppender(ap as RollingFileAppender); <==========
if (rollingFileAppender == null)
continue;
rollingFileAppender.File = ProcessLogFilePath(rollingFileAppender.File);
currentLogger.AddAppender(rollingFileAppender);
rollingFileAppender.ActivateOptions();
}
}
private RollingFileAppender CloneAppender(RollingFileAppender appender)
{
var newAppender = new RollingFileAppender();
newAppender.Name = appender.Name; <===============
newAppender.RollingStyle = appender.RollingStyle;
newAppender.StaticLogFileName = appender.StaticLogFileName;
newAppender.Threshold = appender.Threshold;
newAppender.MaxSizeRollBackups = appender.MaxSizeRollBackups;
newAppender.MaximumFileSize = appender.MaximumFileSize;
newAppender.MaxFileSize = appender.MaxFileSize;
//newAppender.LockingModel = appender.LockingModel;
newAppender.Layout = appender.Layout;
newAppender.ImmediateFlush = appender.ImmediateFlush;
newAppender.File = appender.File;
newAppender.ErrorHandler = appender.ErrorHandler;
newAppender.Encoding = appender.Encoding;
newAppender.DatePattern = appender.DatePattern;
newAppender.CountDirection = appender.CountDirection;
newAppender.AppendToFile = appender.AppendToFile;
newAppender.AddFilter(appender.FilterHead);
return newAppender;
}
if appender type is different than RollingFileAppender, the method CloneAppender will throw NullReferenceException when executing
appender.Name;
Proposed fix:
private RollingFileAppender CloneAppender(RollingFileAppender appender)
{
if (appender == null)
return null;
else
{
var newAppender = new RollingFileAppender();
newAppender.Name = appender.Name; <===============
newAppender.RollingStyle = appender.RollingStyle;
newAppender.StaticLogFileName = appender.StaticLogFileName;
newAppender.Threshold = appender.Threshold;
newAppender.MaxSizeRollBackups = appender.MaxSizeRollBackups;
newAppender.MaximumFileSize = appender.MaximumFileSize;
newAppender.MaxFileSize = appender.MaxFileSize;
//newAppender.LockingModel = appender.LockingModel;
newAppender.Layout = appender.Layout;
newAppender.ImmediateFlush = appender.ImmediateFlush;
newAppender.File = appender.File;
newAppender.ErrorHandler = appender.ErrorHandler;
newAppender.Encoding = appender.Encoding;
newAppender.DatePattern = appender.DatePattern;
newAppender.CountDirection = appender.CountDirection;
newAppender.AppendToFile = appender.AppendToFile;
newAppender.AddFilter(appender.FilterHead);
return newAppender;
}
}