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