I';我想使用Topshelf实例名作为log4net日志文件名的一部分

I';我想使用Topshelf实例名作为log4net日志文件名的一部分,log4net,topshelf,Log4net,Topshelf,当使用TopShelf创建服务实例时,我希望能够访问服务实例名称(可能在作为服务安装期间在命令行上设置;这意味着我没有直接访问权),以便能够将其用作Log4Net中日志文件名的属性 在下面的示例代码中,我们设置了可用于在全局上下文中进行日志记录的各种属性。我希望能够在这里设置服务实例名称;但在主机初始化期间似乎无法访问它 任何人都可以就如何使用Topshelf在运行时访问服务实例名称值提出任何建议 public static TopshelfExitCode Run(Func<IConsu

当使用TopShelf创建服务实例时,我希望能够访问服务实例名称(可能在作为服务安装期间在命令行上设置;这意味着我没有直接访问权),以便能够将其用作Log4Net中日志文件名的属性

在下面的示例代码中,我们设置了可用于在全局上下文中进行日志记录的各种属性。我希望能够在这里设置服务实例名称;但在主机初始化期间似乎无法访问它

任何人都可以就如何使用Topshelf在运行时访问服务实例名称值提出任何建议

public static TopshelfExitCode Run(Func<IConsumerController> controllerFactory,
    string serviceName,
    string serviceDescription)
{
    // Initialise the Global log4net properties so we can use them for log file names and logging when required.
    log4net.GlobalContext.Properties["custom-assembly"] = System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location);
    log4net.GlobalContext.Properties["custom-processname"] = System.Diagnostics.Process.GetCurrentProcess().ProcessName;
    log4net.GlobalContext.Properties["custom-process-id"] = System.Diagnostics.Process.GetCurrentProcess().Id;
// WOULD LIKE ACCESS TO THE SERVICE INSTANCE NAME HERE
    var logFileInfo = new System.IO.FileInfo(".\\Log.config");
    log4net.Config.XmlConfigurator.Configure(logFileInfo);

    var host = HostFactory.New(r =>
    {
        var controller = controllerFactory();
        r.Service<ConsumerService>( () => new ConsumerService(controller));
        r.SetServiceName(serviceName);
        r.SetDescription(serviceDescription + " © XYZ Ltd. 2012");
        r.SetDisplayName(serviceDescription + " © XYZ Ltd. 2012");
        r.StartAutomatically();
        r.EnablePauseAndContinue();
        r.RunAsLocalSystem();
    });
    return host.Run();
}
下面的示例是一个通用函数的一部分,我们的所有服务都使用该函数来启动使用Topshelf的服务

public static TopshelfExitCode Run(Func<IConsumerController> controllerFactory,
    string serviceName,
    string serviceDescription)
{
    // Initialise the Global log4net properties so we can use them for log file names and logging when required.
    log4net.GlobalContext.Properties["custom-assembly"] = System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location);
    log4net.GlobalContext.Properties["custom-processname"] = System.Diagnostics.Process.GetCurrentProcess().ProcessName;
    log4net.GlobalContext.Properties["custom-process-id"] = System.Diagnostics.Process.GetCurrentProcess().Id;
// WOULD LIKE ACCESS TO THE SERVICE INSTANCE NAME HERE
    var logFileInfo = new System.IO.FileInfo(".\\Log.config");
    log4net.Config.XmlConfigurator.Configure(logFileInfo);

    var host = HostFactory.New(r =>
    {
        var controller = controllerFactory();
        r.Service<ConsumerService>( () => new ConsumerService(controller));
        r.SetServiceName(serviceName);
        r.SetDescription(serviceDescription + " © XYZ Ltd. 2012");
        r.SetDisplayName(serviceDescription + " © XYZ Ltd. 2012");
        r.StartAutomatically();
        r.EnablePauseAndContinue();
        r.RunAsLocalSystem();
    });
    return host.Run();
}
公共静态Topshelfexit代码运行(Func controllerFactory,
字符串serviceName,
字符串(服务描述)
{
//初始化全局log4net属性,以便在需要时将其用于日志文件名和日志记录。
log4net.GlobalContext.Properties[“custom assembly”]=System.IO.Path.GetFileNameWithoutExtension(System.Reflection.assembly.GetEntryAssembly().Location);
log4net.GlobalContext.Properties[“CustomProcessName”]=System.Diagnostics.Process.GetCurrentProcess().processname;
log4net.GlobalContext.Properties[“自定义进程id”]=System.Diagnostics.process.GetCurrentProcess().id;
//是否希望在此访问服务实例名称
var logFileInfo=new System.IO.FileInfo(“.\\Log.config”);
log4net.Config.XmlConfigurator.Configure(logFileInfo);
var host=HostFactory.New(r=>
{
var controller=controllerFactory();
r、 服务(()=>newconsumerservice(controller));
r、 SetServiceName(服务名称);
r、 SetDescription(serviceDescription+“©XYZ有限公司,2012”);
r、 SetDisplayName(serviceDescription+“©XYZ有限公司,2012”);
r、 StartAutomatically();
r、 启用PauseandContinue();
r、 RunAsLocalSystem();
});
返回host.Run();
}

实例名称在命令行上传递,您可以访问命令行参数并从那里提取它。这可能需要一些调整,但是如果您查看ServiceInstaller,您可以看到我们如何在安装服务后通过注册表编辑来调整命令路径

主机设置将传递给服务工厂,服务工厂包含
InstanceName
属性。您应该使用它来初始化要添加到
log4net

的日志追加器,谢谢Travis;我会试试看结果如何;很好,谢谢。我可以从命令行解析命令行中的实例名称。再次感谢您的专业知识。没问题,如果您有问题,也可以点击邮件列表。要添加一点细节…主机设置将传递给ServiceConfigurator上的“ConstructUsing”方法。您可能会有这样的代码:`x.Service(sc=>{sc.ConstructUsing(hostSettings=>newServiceRunner(hostSettings))`