Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

unable to get log4net working with .net windows service

I have a windows service with an app.config and a log4net.config.

app.config:

  <configSections>     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />   </configSections>   <log4net configSource="log4net.config" /> 

log4net.config:

<log4net>   <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">     <param name="File" value="D:\Projects\Integration\Interface Module\bin\Logs\MyFirstLogger.log"/>     <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />     <appendToFile value="true" />     <rollingStyle value="Size" />     <maxSizeRollBackups value="2" />     <maximumFileSize value="1MB" />     <staticLogFileName value="true" />     <layout type="log4net.Layout.PatternLayout">       <param name="ConversionPattern" value="%d [%t] %-5p %c %m%n"/>     </layout>   </appender>    <root>     <level value="ALL" />     <appender-ref ref="LogFileAppender" />   </root> </log4net> 

I have added this in AssemblyInfo.cs too:

[assembly: log4net.Config.XmlConfigurator(Watch = true)] 

And in one of my classes, I have:

private readonly ILog _log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 

and

_log.Info(content); 

I have given all users full permissions to my Logs folder.

My bin folder (which the service is running from) has both my app.config and log4net.config.

But no logging file got generated. What settings did I miss?

Updated on 4-March-2014

If you are using a separate config file like I did (log4net.config), do remember to set the Copy to output directory setting to Copy always in the Solution Explorer

like image 846
Null Reference Avatar asked May 06 '13 12:05

Null Reference


People also ask

Does log4net work with .NET 5?

log4net is one of three very popular frameworks for implementing log messages in your application (Serilog and NLog being the other two). log4net works with almost any version of . NET (including . NET Core).


2 Answers

Please note that when the process is run as Windows Service, Environment.CurrentDirectory will be "C:\Windows\system32"

So if you put the log4net configuration file (log4net.config) next to your *.exe, you can use the following code to configure log4net.

var assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); XmlConfigurator.Configure(new FileInfo(Path.Combine(assemblyFolder, "log4net.config"))); 
like image 150
YantingChen Avatar answered Oct 02 '22 22:10

YantingChen


By Design Log4Net is

fail-stop, we mean that log4net will not throw unexpected exceptions at run-time potentially causing your application to crash

So it is very difficult to figure out what is causing the issue .

How do I enable log4net internal debugging?

FROM FAQ - http://logging.apache.org/log4net/release/faq.html

  • Internal debugging can also be enabled by setting a value in the application's configuration file (not the log4net configuration file, unless the log4net config data is embedded in the application's config file). The log4net.Internal.Debug application setting must be set to the value true. For example:
<?xml version="1.0" encoding="utf-8" ?>  <configuration>             <appSettings>                 <add key="log4net.Internal.Debug" value="true"/>             </appSettings>  </configuration> 

This setting is read immediately on startup an will cause all internal debugging messages to be emitted.

  • . To enable log4net's internal debug programmatically you need to set the log4net.Util.LogLog.InternalDebugging property to true. Obviously the sooner this is set the more debug will be produced.

So here is a custom class i created for log4Net - because config file was very confusing I created this helper class

  • you can initiate as many appender you need across the applications so if one dll call other dll both can initiate appenders and both appends will work.
  • also you can close the appender and ( as in case of file appender) then send it as a email
Log4NetFileHelper log = new Log4NetFileHelper();         log.Init(); //Initialize         log.AddConsoleLogging(); //Add Console Logging         log.AddFileLogging(Path.Combine(AssemblyDirectory, "BatchConsole.log"));          log.AddFileLogging(Path.Combine(AssemblyDirectory,"BatchConsole_error.log"),log4net.Core.Level.Error);  

Do set this Property to True log4net.Util.LogLog.InternalDebugging=true;

public class Log4NetFileHelper {     private string  DEFAULT_LOG_FILENAME=string.Format("application_log_{0}.log",DateTime.Now.ToString("yyyyMMMdd_hhmm"));     Logger root;     public Log4NetFileHelper()     {      }      public virtual void Init()     {         root = ((Hierarchy)LogManager.GetRepository()).Root;         //root.AddAppender(GetConsoleAppender());         //root.AddAppender(GetFileAppender(sFileName));         root.Repository.Configured = true;     }      #region Public Helper Methods     #region Console Logging     public virtual void AddConsoleLogging()     {         ConsoleAppender C = GetConsoleAppender();         AddConsoleLogging(C);     }      public virtual void AddConsoleLogging(ConsoleAppender C)     {         root.AddAppender(C);     }     #endregion      #region File Logging     public virtual FileAppender AddFileLogging()     {         return AddFileLogging(DEFAULT_LOG_FILENAME);     }      public virtual FileAppender AddFileLogging(string sFileFullPath)     {         return AddFileLogging(sFileFullPath, log4net.Core.Level.All);     }      public virtual FileAppender AddFileLogging(string sFileFullPath, log4net.Core.Level threshold)     {         return AddFileLogging(sFileFullPath, threshold,true);       }      public virtual FileAppender AddFileLogging(string sFileFullPath, log4net.Core.Level threshold, bool bAppendfile)     {         FileAppender appender = GetFileAppender(sFileFullPath, threshold , bAppendfile);         root.AddAppender(appender);         return appender;     }      public virtual SmtpAppender AddSMTPLogging(string smtpHost, string From, string To, string CC, string subject, log4net.Core.Level threshhold)     {         SmtpAppender appender = GetSMTPAppender(smtpHost, From, To, CC, subject, threshhold);          root.AddAppender(appender);          return appender;     }      #endregion       public log4net.Appender.IAppender GetLogAppender(string AppenderName)     {         AppenderCollection ac = ((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root.Appenders;          foreach(log4net.Appender.IAppender appender in ac){             if (appender.Name == AppenderName)             {                 return appender;             }         }          return null;     }      public void CloseAppender(string AppenderName)     {         log4net.Appender.IAppender appender = GetLogAppender(AppenderName);         CloseAppender(appender);     }      private void CloseAppender(log4net.Appender.IAppender appender)     {         appender.Close();     }      #endregion      #region Private Methods      private SmtpAppender GetSMTPAppender(string smtpHost, string From, string To, string CC, string subject, log4net.Core.Level threshhold)     {         SmtpAppender lAppender = new SmtpAppender();         lAppender.Cc = CC;         lAppender.To = To;         lAppender.From = From;         lAppender.SmtpHost = smtpHost;         lAppender.Subject = subject;         lAppender.BufferSize = 512;         lAppender.Lossy = false;         lAppender.Layout = new         log4net.Layout.PatternLayout("%date{dd-MM-yyyy HH:mm:ss,fff} %5level [%2thread] %message (%logger{1}:%line)%n");         lAppender.Threshold = threshhold;         lAppender.ActivateOptions();         return lAppender;     }      private ConsoleAppender GetConsoleAppender()     {         ConsoleAppender lAppender = new ConsoleAppender();         lAppender.Name = "Console";         lAppender.Layout = new          log4net.Layout.PatternLayout(" %message %n");         lAppender.Threshold = log4net.Core.Level.All;         lAppender.ActivateOptions();         return lAppender;     }      /// <summary>     /// DETAILED Logging      /// log4net.Layout.PatternLayout("%date{dd-MM-yyyy HH:mm:ss,fff} %5level [%2thread] %message (%logger{1}:%line)%n");     ///       /// </summary>     /// <param name="sFileName"></param>     /// <param name="threshhold"></param>     /// <returns></returns>     private FileAppender GetFileAppender(string sFileName , log4net.Core.Level threshhold ,bool bFileAppend)     {         FileAppender lAppender = new FileAppender();         lAppender.Name = sFileName;         lAppender.AppendToFile = bFileAppend;         lAppender.File = sFileName;         lAppender.Layout = new          log4net.Layout.PatternLayout("%date{dd-MM-yyyy HH:mm:ss,fff} %5level [%2thread] %message (%logger{1}:%line)%n");         lAppender.Threshold = threshhold;         lAppender.ActivateOptions();         return lAppender;     }      //private FileAppender GetFileAppender(string sFileName)     //{     //    return GetFileAppender(sFileName, log4net.Core.Level.All,true);     //}      #endregion      private void  ConfigureLog(string sFileName)     {       } } 
like image 37
aked Avatar answered Oct 02 '22 23:10

aked