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
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).
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")));
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
<?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.
So here is a custom class i created for log4Net - because config file was very confusing I created this helper class
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) { } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With