5

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();
}
4

2 に答える 2

6

は、プロパティとしてHostSettingsを含むサービスファクトリに渡されInstanceNameます。これを使用して、追加するログアペンダーを初期化する必要がありますlog4net

于 2012-12-02T03:50:20.597 に答える
4

インスタンス名はコマンドラインで渡されます。コマンドライン引数にアクセスして、そこからプルできます。これには少し調整が必要かもしれませんが、ServiceInstallerを見ると、サービスがインストールされた後、レジストリ編集を介してコマンドパスを調整する方法がわかります。

于 2012-09-19T12:54:06.333 に答える