.net NLog FindTargetByName返回Null
我正在VB.NET 4.5 Visual Studio 2013解决方案中使用NLog 4.4.12(撰写本文时的最新版本)。当我试图检索.net NLog FindTargetByName返回Null,.net,nlog,.net,Nlog,我正在VB.NET 4.5 Visual Studio 2013解决方案中使用NLog 4.4.12(撰写本文时的最新版本)。当我试图检索MailTarget以编程方式修改配置(例如,设置用户的服务器详细信息、'to'地址等)时,我可以使用 Dim oTargets As ReadOnlyCollection(Of Targets.Target) = LogManager.Configuration.AllTargets 这将返回我配置的两个目标:一个databasetarget(index=
MailTarget
以编程方式修改配置(例如,设置用户的服务器详细信息、'to'地址等)时,我可以使用
Dim oTargets As ReadOnlyCollection(Of Targets.Target) = LogManager.Configuration.AllTargets
这将返回我配置的两个目标:一个databasetarget
(index=0,Name=“Database\u Target”)和一个MailTarget
(index=1,Name=“Email\u Target”)
但是如果我尝试使用
Dim oTarget as Targets.Target = LogManager.Configuration.FindTargetByName("Email_Target")
或
甚至
Dim oTarget as Targets.Target = LogManager.Configuration.FindTargetByName(oTargets(1).Name)
我得到空值
我在bug列表、GitHub和在线搜索了解决方案,但什么也没找到,所以我可能做错了什么。但我看不出是什么。有人有什么想法吗?根据罗尔夫的回答,这是问题的全部内容注意:这个问题或困惑很可能在您阅读本文时得到解决 问题是我正确地创建了
目标
,并在其参数中包含名称值,例如:
Dim oConfig As LoggingConfiguration = New LoggingConfiguration
Dim oMailTarget As New MailTarget
With oMailTarget
.Name = "Email_Target"
.SmtpServer = "mail.mydomain.com"
.EnableSsl = True
...
oConfig.AddTarget("Email", oMailTarget)
但最后一行,我添加了带有可选名称(“Email”)的oMailTarget
,可能覆盖了oMailTarget.name
值
将最后一行更改为:
oConfig.AddTarget(oMailTarget)
解决了这个问题
如果是我,我会转储AddTarget(Name,Target)
重载,这样,如果要命名Target
必须在Target
对象本身中完成。就我的2c
感谢Rolf的帮助。我遇到了类似的问题,即
LogManager.Configuration。FindTargetByName
为有效的记录器返回null
(在C#中),但(似乎)原因略有不同。我是这样配置日志的(根据文档):
这很有效。但是对FindTargetByName
的调用总是返回null
。我通过明确添加目标来解决:
private static void ConfigureLogging()
{
var config = new LoggingConfiguration();
var logfile = new NLog.Targets.FileTarget() { FileName = "log.txt", Name = "logfile", Layout = "${longdate} ${uppercase:${level}} ${message}" };
var logconsole = new NLog.Targets.ColoredConsoleTarget() { Name = "logconsole", Layout = "${message}" };
var logmemory = new NLog.Targets.MemoryTarget () { Name = "logmemory", Layout = "${longdate} ${uppercase:${level}} ${message}" };
config.AddTarget(logfile);
config.AddTarget(logconsole);
config.AddTarget(logmemory);
config.LoggingRules.Add(new LoggingRule("*", LogLevel.Info, logconsole));
config.LoggingRules.Add(new LoggingRule("*", LogLevel.Debug, logfile));
config.LoggingRules.Add(new LoggingRule("*", LogLevel.Debug, logmemory));
LogManager.Configuration = config;
}
LoggingConfiguration,FindTargetByName
当前仅返回使用LoggingConfiguration.AddTarget
注册的目标。但是如果它对用户更友好一点,那就更好了。您的场景是否与此定制NLog.4.5.0-rc04 nuget软件包配合使用:啊!太可怕了!!但是我实际上是这样添加目标的,只是我在添加中包含了一个名称,例如oConfig.AddTarget(“Email”,oTargetEmail)
,它超过了实际目标中的名称。这将改进围绕此的内部日志记录,因此有更好的机会了解配置不起作用的原因。我想使用AddTarget
而不使用name-parameter更安全。是的,AddTarget(name,Target)
允许使用与目标实际名称不同的别名注册目标,这让人感到困惑。不确定这什么时候有意义。我可以理解创建一个目标
作为一种模板的想法-例如“Database_Target”,然后将其添加为两个不同的实例,具有不同的名称、设置等。但是我认为您需要从目标
类中删除.Name
属性。或者保留两者,但作为单独的属性,例如.Name
和.InstanceName
。否则很容易出错。是的,一个人可以有这样的限制,当目标不知名时,只能使用别名执行AddTarget。这样就不会那么混乱了。但现在这将是一个突破性的变化,因此它将不得不等待。
private static void ConfigureLogging()
{
var config = new LoggingConfiguration();
var logfile = new NLog.Targets.FileTarget() { FileName = "log.txt", Name = "logfile", Layout = "${longdate} ${uppercase:${level}} ${message}" };
var logconsole = new NLog.Targets.ColoredConsoleTarget() { Name = "logconsole", Layout = "${message}" };
var logmemory = new NLog.Targets.MemoryTarget () { Name = "logmemory", Layout = "${longdate} ${uppercase:${level}} ${message}" };
config.LoggingRules.Add(new LoggingRule("*", LogLevel.Info, logconsole));
config.LoggingRules.Add(new LoggingRule("*", LogLevel.Debug, logfile));
config.LoggingRules.Add(new LoggingRule("*", LogLevel.Debug, logmemory));
LogManager.Configuration = config;
}
private static void ConfigureLogging()
{
var config = new LoggingConfiguration();
var logfile = new NLog.Targets.FileTarget() { FileName = "log.txt", Name = "logfile", Layout = "${longdate} ${uppercase:${level}} ${message}" };
var logconsole = new NLog.Targets.ColoredConsoleTarget() { Name = "logconsole", Layout = "${message}" };
var logmemory = new NLog.Targets.MemoryTarget () { Name = "logmemory", Layout = "${longdate} ${uppercase:${level}} ${message}" };
config.AddTarget(logfile);
config.AddTarget(logconsole);
config.AddTarget(logmemory);
config.LoggingRules.Add(new LoggingRule("*", LogLevel.Info, logconsole));
config.LoggingRules.Add(new LoggingRule("*", LogLevel.Debug, logfile));
config.LoggingRules.Add(new LoggingRule("*", LogLevel.Debug, logmemory));
LogManager.Configuration = config;
}