我遇到了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。
答案 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之间的差异是不明显的服务模板。