6

Like many others, I'm trying to implement Log4net into my C#.net application and I just can't get it to work for me. I've done a lot of searching (including on this site) and have tried many different solutions but nothing has worked for me yet. So the simple question: What am I doing wrong???

Assembly.cs contains the following line.

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

App.config contains the following.

<configSections> 
  <section name="log4net" 
           type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 
</configSections>
<log4net> 
  <root> 
    <level value="ALL"/> 
    <appender-ref value="RollingFileAppender"/> 
    <appender-ref value="ConsoleAppender"/> 
  </root>
  <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">  
    <param name="File" value="C:\Temp\Minion.log" />
    <appendToFile value="true" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="5" />
    <maximumFileSize value="10MB" />
    <staticLogFileName value="true" />
    <layout type="log4net.Layout.PatternLayout">  
      <conversionPattern value="%date{Y-m-d H:i:s.u} | %thread | %method | %level | %message%newline" />
    </layout>
  </appender>
  <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
    <layout type="log4net.Layout.PatternLayout">
      <param name="Header" value="[Header]\r\n" />
      <param name="Footer" value="[Footer]\r\n" />
      <param name="ConversionPattern" value="%date{Y-m-d H:i:s.u} | %thread | %method | %level | %message%newline" />
    </layout>
  </appender>
</log4net>

My code contains the following at the start of the class.

private static readonly ILog logger =
LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

And these tests at the start of the main function.

logger.Debug("test1");
logger.Info("test2");
logger.Warn("test3");
logger.Error("test4");
logger.Fatal("test5");

EDIT:

A tip led to the following errors during log4net initializaiton.

log4net:ERROR XmlHierarchyConfigurator: No appender named [] could be found.
log4net:ERROR Appender named [] not found.
log4net:ERROR XmlHierarchyConfigurator: No appender named [] could be found.
log4net:ERROR Appender named [] not found.
Lodra
  • 147
  • 1
  • 2
  • 7
  • 1
    Have you looked at http://stackoverflow.com/questions/756125/how-to-track-down-log4net-problems? – Jeroen Mostert Oct 21 '14 at 18:27
  • As an aside, I recommend against using the `[XmlConfigurator]` attribute because this doesn't make it clear when log4net initializes -- and it has a nasty habit of not always working (in ASP.NET sites, for example). Instead, call `XmlConfigurator.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile))` explicitly from your `Main()`. – Jeroen Mostert Oct 21 '14 at 18:33
  • Did you tried to call `XmlConfigurator.Configure()` ? – Ofiris Oct 21 '14 at 18:35
  • Jeroen: Gah. Yes, I did but I must have had a typo before. This time I've actually got a log file to review. Thanks for prompting a second shot. I'll give this a look over and report back. – Lodra Oct 21 '14 at 18:35
  • That formatting is terrible. Edited the main post with the new info. – Lodra Oct 21 '14 at 18:45

2 Answers2

7

Change this:

<appender-ref value="RollingFileAppender"/> 
<appender-ref value="ConsoleAppender"/> 

to this:

<appender-ref ref="RollingFileAppender"/> 
<appender-ref ref="ConsoleAppender"/> 

And see if it won't cooperate better.

Jeroen Mostert
  • 27,176
  • 2
  • 52
  • 85
2

I had that problem and it was because in root I had two references and in code I was just calling one. Example:

<root>
      <level value="INFO"/>
      <appender-ref ref="FileAppender"/>
      <appender-ref ref="ConsoleAppender" />
</root>

private static readonly log4net.ILog logger = LogManager.GetLogger("FileAppender");

In this case I was giving the error. Delete one of the root references and try again. Like this

<root>
      <level value="INFO"/>
      <appender-ref ref="FileAppender"/>
</root>

private static readonly log4net.ILog logger = LogManager.GetLogger("FileAppender");