我正在使用NLog内置的对castle的支持,并尝试在运行时找到一种改变连接字符串的方法。
这是我最新的摇摆和未命中,我确定它必须在此时进行生命周期,因为所有配置都为空,所以我猜测城堡尚未连接NLog上的内容。
private const string NLogConnectionString = "NLogConnection";
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.AddFacility<LoggingFacility>(l => l.UseNLog());
var config = new NLog.Config.LoggingConfiguration();
var dbtarget = config.FindTargetByName("database") as DatabaseTarget;
if (dbtarget != null)
{
dbtarget.ConnectionString = MethodThatGiveMeConnectionString(NLogConnectionString);
}
}
查看this post它可能是一个选项但是根据事情在这里完成的方式,我不想改变它,而且更喜欢直接向NLog提供连接字符串。
looking here我知道我可以在运行时配置它,但我更喜欢让大多数设置来自配置文件,然后只是覆盖连接字符串。
答案 0 :(得分:0)
所以我找到了一个有效的解决方案但不确定它是最好的方法。
使用this post作为参考。这条评论最有帮助:
最初,我尝试实现自定义ILoggerFactory并通过customLoggerFactory将其注入LoggingFacility。但很快就证明这是一个死胡同。然后我查看了NLog集成并注意到已经有一个NLogFactory将其方法标记为虚拟。所以我能够从这个类派生出来
作者解决的问题与我自己的问题不同,但它让我想出了这个解决方案:
public class LoggerInstall : IWindsorInstaller
{
private const string NLogConnectionString = "NLogConnection";
public void Install(IWindsorContainer container, IConfigurationStore store)
{
var config = new NLog.Config.LoggingConfiguration();
container.AddFacility<LoggingFacility>(l => l.LogUsing(new OwnNLogFactory(GetYourConnectionStringMethod(NLogConnectionString))));
}
}
public class OwnNLogFactory : NLogFactory
{
public OwnNLogFactory(string connectionString)
{
foreach (var dbTarget in LogManager.Configuration.AllTargets.OfType<DatabaseTarget>().Select(aTarget => aTarget))
{
dbTarget.ConnectionString = connectionString;
}
}
}
仍然不确定这是最好的解决方案,但它现在有效,如果有人有其他解决方案,我很乐意看到其他解决方案