I am trying to create a Helper class for log4net which will log all my messages to the log files.
The solution consists of an MVC Web Application and 2 Windows services. I want to be able to use the same logger class for all three projects.
The Helper Class I am creating is in a Common Project.
This is what the class looks like:
public class TBLogger
{
private static ILog Logger;
public ILog Log
{
get
{
if (Logger != null) return Logger;
XmlConfigurator.Configure();
var type = MethodBase.GetCurrentMethod().DeclaringType;
Logger = LogManager.GetLogger(type);
return Logger;
}
}
public void LogMessage(MessageType messageType, string message)
{
switch (messageType)
{
case MessageType.Debug:
Log.Debug(message);
break;
case MessageType.Information:
Log.Info(message);
break;
case MessageType.Error:
Log.Error(message);
break;
}
}
public void LogExceptionMessage(string message, Exception innerException, string stackTrace, int iStage)
{
var exceptionMessage = string.Format("iStage: [{0}] Exception: [{1}], Inner: [{2}], Stack Trace: [{3}]", iStage, message, innerException.Message, stackTrace);
Log.Error(exceptionMessage);
}
}
I have added the Log4net settings in the Assembly Class
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4net.config", Watch = true)]
And the config files look like this: (web.config for MVC Application and App.config for Services)
<log4net file="Log4net.config" />
The Log4net.config is something like this:
<log4net>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
<file value="D:\MyPath\Logs\WebLogs\" />
<datePattern value="dd-MMM-yyyy\\\\'GeneralLog.txt'" />
<staticLogFileName value="false" />
<appendToFile value="true" />
<rollingStyle value="Composite" />
<layout type="log4net.Layout.PatternLayout">
<!--<conversionPattern value="%date{MM/dd/yy HH:mm} [%thread] %-5level - %message%newline" />-->
<conversionPattern value="%date{MM/dd/yy HH:mm} %-5level - %message%newline" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="INFO" />
<levelMax value="INFO" />
</filter>
</appender>
<root>
<appender-ref ref="RollingLogFileAppender" />
</root>
</log4net>
What I want to do is create an object of TBLogger and call the LogMessage functions from both windows services and the MVC Application.
var logger = new TBLogger();
logger.LogMessage(MessageType.Information, "This is Information");
But it doesn't seem to be working.
EDIT
The log4net debug file gives this information:
log4net: log4net assembly [log4net, Version=1.2.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a]. Loaded from [C:\Users\[]\AppData\Local\Temp\Temporary ASP.NET Files\vs\bc22238d\7aa91eba\assembly\dl3\c228fa05\4ec3fa68_5175d101\log4net.dll]. (.NET Runtime [4.0.30319.42000] on Microsoft Windows NT 10.0.10240.0)
log4net: defaultRepositoryType [log4net.Repository.Hierarchy.Hierarchy]
log4net: Creating repository for assembly [DotNetOpenAuth.Core, Version=4.3.0.0, Culture=neutral, PublicKeyToken=2780ccd10d57b246]
log4net: Assembly [DotNetOpenAuth.Core, Version=4.3.0.0, Culture=neutral, PublicKeyToken=2780ccd10d57b246] Loaded From [C:\Users\[]\AppData\Local\Temp\Temporary ASP.NET Files\vs\bc22238d\7aa91eba\assembly\dl3\a73bdbf7\3acfe046_5175d101\DotNetOpenAuth.Core.dll]
log4net: Assembly [DotNetOpenAuth.Core, Version=4.3.0.0, Culture=neutral, PublicKeyToken=2780ccd10d57b246] does not have a RepositoryAttribute specified.
log4net: Assembly [DotNetOpenAuth.Core, Version=4.3.0.0, Culture=neutral, PublicKeyToken=2780ccd10d57b246] using repository [log4net-default-repository] and repository type [log4net.Repository.Hierarchy.Hierarchy]
log4net: Creating repository [log4net-default-repository] using type [log4net.Repository.Hierarchy.Hierarchy]
log4net: Creating repository for assembly [Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]
log4net: Assembly [Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null] Loaded From [C:\Users\[]\AppData\Local\Temp\Temporary ASP.NET Files\vs\bc22238d\7aa91eba\assembly\dl3\e7a0face\f76e0d4c_cf79d101\Common.dll]
log4net: Assembly [Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null] does not have a RepositoryAttribute specified.
log4net: Assembly [Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null] using repository [log4net-default-repository] and repository type [log4net.Repository.Hierarchy.Hierarchy]
log4net: repository [log4net-default-repository] already exists, using repository type [log4net.Repository.Hierarchy.Hierarchy]
log4net: configuring repository [log4net-default-repository] using .config file section
log4net: Application config file is [C:..........\web.config]
log4net: Configuring Repository [log4net-default-repository]
log4net: Configuration update mode [Merge].
log4net: Hierarchy Threshold []
log4net: No appenders could be found for logger [Common.Constants.TBLogger] repository [log4net-default-repository]
log4net: Please initialize the log4net system properly.
log4net: Current AppDomain context information:
log4net: BaseDirectory : C:\.............\
log4net: FriendlyName : /LM/W3SVC/2/ROOT-1-131019801091897637
log4net: DynamicDirectory: C:\Users\[]\AppData\Local\Temp\Temporary ASP.NET Files\vs\bc22238d\7aa91eba
EDIT 2: It works for the MVC Application when I add these lines to the Global.asax.cs
var l4net = Server.MapPath("~/Log4net.config");
log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(l4net));