Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net NLog FindTargetByName返回Null_.net_Nlog - Fatal编程技术网

.net NLog FindTargetByName返回Null

.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=

我正在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=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;
}