8
votes

I have a console app which I am converting into a windows service. As a console app my log4net logging is working fine. But converting it into a windows service, my log4net logging has stopped working.

I have added this to my assemblyInfo.cs in the service project:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)] 

This is my service class with onstart and onstop:

private static log4net.ILog _log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        private Builder _builder;

        public YCSWebServerService()
        {
            InitializeComponent();
            _builder = new Builder();
        }

        protected override void OnStart(string[] args)
        {
            _log.Info("YCSWebServerService started");
            _builder.Start();
        }

        protected override void OnStop()
        {
            _log.Info("YCSWebServerService stopped");
            _builder.Stop();
        }

I have a "specific" log4net config file added to my service project:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

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

  <log4net>
    <root>
      <level value="ALL" />
      <appender-ref ref="EventLogAppender" />
    </root>
    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
      <threshold value="DEBUG" />
      <applicationName value="Lantic YCS WebServer" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="(%-5level %date{hh}:%date{mm}:%date{ss} [%thread] %logger [%property{NDC}] ) %message %n" />
      </layout>
    </appender>
  </log4net>

</configuration>

Any ideas or tips?

4
I solved this issue by overriding the appender. Check this issue: stackoverflow.com/questions/1922430/…RClemens

4 Answers

6
votes

Did you just add a log4net section to your app.config file? In your question you mentioned that you have "specific log4net config file", but the sample you gave looks like the whole contents of app.config. If app.config is the case then you could have simpler string in AssemblyInfo.cs:

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

Also adding requirePermission="false" to the section in my app.config helped me when I fixed similar problem with log4net not logging to file for Windows Service (see extra attribute - requirePermission="false"):

<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false"/>
  </configSections>
1
votes

Some things to try:

Does the user running the service have write permissions?

Are any exceptions getting logged to the windows logs?

Have you tried running the service in debug mode to see if Log4net is throwing any exceptions?

1
votes

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=293617

http://social.msdn.microsoft.com/Forums/en-US/windowsgeneraldevelopmentissues/thread/5bef59bc-a28f-4e6d-8ddb-730e12764162

In Windows Vista, Windows XP SP 2, Windows Server 2003, 2008 and Windows 7 a user needs Administrator rights to access the Security Log. Now when log4net tries to create a Event Log Source, all Logs are checked if it already exists. So with a Windows Service, the user of the Windows Server would need Administrator rights (which is not good).

Solution: configure a explicit Source in the log4net configuration (as you did: <applicationName value="Lantic YCS WebServer" />, Lantic YCS WebServer is your Source) and create this Source in you Setup (because Setup-User should have Administrator rights).

0
votes

Well this question was asked long time back, I have a suggestion which may be of some help to anyone looking for a solution to this issue. If you are converting console app to windows service... you must have created an installer for installing the app. When you install the app, it creates a installation folder for the service usually under ProgramFile..... (Check it when you are installing your service..it gives you the path to the installation directory). If in your web.config file you have provided path to Log file as "Log\Log.txt", then there will be a folder(Log) in the installation folder with your Log file(Log.txt). You are wasting your time if you are looking for log file in your application folder.