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

Log4net works for a console app but not a windows service

我遇到 log4net 问题。我正在开发一个服务应用程序,我一直在开发它作为带有 DLL 的控制台应用程序。 dll 是独立的,控制台应用程序只调用服务的启动方法,让我可以快速换出 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 whichn 仅包含 log4net 和仅引用 log4net dll 和主项目 dll 的相同引用。

如果您能帮助追踪查找位置,我们将不胜感激。

编辑:我对控制台应用程序和名为正确 program.exe.config.

的 windows 服务使用相同的 app.config

因此,在尝试了几件事之后,我用标准控制台应用程序替换了 Windows 服务模板项目。使用此处

中的代码

(复制以防 link 死亡)

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 服务模板项目复制初始化组件代码)项目现在按预期运行。

我仍然不确定发生了什么,因为代码看起来 98% 相同,但如果我不得不猜测这将是某种差异,对于初学者来说控制台应用程序模板和控制台应用程序模板之间的差异并不明显Windows 服务模板。