Log4net适用于控制台应用程序,但不适用于Windows服务

时间:2015-01-16 21:46:10

标签: c# log4net

我遇到了log4net的问题。我正在开发一个服务应用程序,我一直在开发它作为DLL的控制台应用程序。 dll是自包含的,控制台应用程序只是调用服务上的start方法,以允许我快速换出Windows服务进行部署。 (没有权利在我的开发盒上安装服务,但在服务器上有完整的管理员,这是我工作的安全噩梦,所以不要问)。

在服务器上启动控制台应用程序时,log4net功能就好了。启动Windows服务时,我在log4net日志中收到此错误:

log4net: repository [log4net-default-repository] already exists, using repository type [log4net.Repository.Hierarchy.Hierarchy]
no configuration section <common/logging> found - suppressing logging output

我也在项目的另一部分使用quartz,所以Common.Logging.dll在文件夹中,但添加Common.Logging的配置部分以使用log4net并没有解决问题。从我可以看到,控制台应用程序和服务之间的唯一区别是输出类型。控制台应用程序和服务都具有相同的packages.config,只包含log4net和仅引用log4net dll和主项目dll的相同引用。

任何帮助追踪到哪里寻找都会非常感激。

编辑:我对控制台应用程序和名为正确的program.exe.config的Windows服务使用相同的app.config。

1 个答案:

答案 0 :(得分:1)

因此,在尝试了几件事后,我用标准控制台应用程序替换了Windows服务模板项目。使用此处的代码https://stackoverflow.com/a/7764451/3302585

(如果链接死亡,则复制)

public static class Program
{
    #region Nested classes to support running as service
    public const string ServiceName = "MyService";

    public class Service : ServiceBase
    {
        public Service()
        {
            ServiceName = Program.ServiceName;
        }

        protected override void OnStart(string[] args)
        {
            Program.Start(args);
        }

        protected override void OnStop()
        {
            Program.Stop();
        }
    }
    #endregion

    static void Main(string[] args)
    {
        if (!Environment.UserInteractive)
            // running as service
            using (var service = new Service())
                ServiceBase.Run(service);
        else
        {
            // running as console app
            Start(args);

            Console.WriteLine("Press any key to stop...");
            Console.ReadKey(true);

            Stop();
        }
    }

    private static void Start(string[] args)
    {
        // onstart code here
    }

    private static void Stop()
    {
        // onstop code here
    }
}

并添加服务安装程序(http://msdn.microsoft.com/en-us/library/system.serviceprocess.serviceinstaller.aspx以了解发生了什么,然后从服务安装程序的Windows服务模板项目中复制Initialize Component代码)项目现在按预期运行。

我仍然不确定发生了什么,因为代码显示98%相同,但是如果我不得不猜测这对于初学者来说对于Console App模板和Windows之间的差异是不明显的服务模板。