我想用Topshelf实例名log4net的日志文件名的一部分(I'd like to us

2019-09-22 14:25发布

当创建使用TopShelf服务的一个实例,我想能够访问该服务实例的名称(可能已被设置安装为服务时在命令行上,这意味着我不必直接访问它)要能够使用它作为在log4net的日志文件名称的属性。

在下面,我们的示例代码集,其可用于在全球范围内记录的各种属性。 我很想能够在这里还设置了服务实例的名称; 但似乎无法能够主机初始化期间访问它。

任何人任何建议,我怎么能在运行时Topshelf访问服务实例名称值。

下面的例子是,我们的所有服务都使用使用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();
}

Answer 1:

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



Answer 2:

HostSettings传递给服务工厂,其中包含InstanceName作为属性。 附加器要添加到您应该用它来初始化日志log4net



文章来源: I'd like to use the Topshelf instance name as part of the log4net log file name