Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.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
C# 如何在运行时更改NLog布局?_C#_Logging_Nlog - Fatal编程技术网

C# 如何在运行时更改NLog布局?

C# 如何在运行时更改NLog布局?,c#,logging,nlog,C#,Logging,Nlog,我创建了NLog.config: <?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" throwExceptions="false" throwConfigExceptions="true"&

我创建了NLog.config:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      throwExceptions="false"
      throwConfigExceptions="true"> <!--make NLog complain, when something is wrong with the configuration-->


  <targets>
    <target name="logfile" xsi:type="File" 
            fileName="${basedir}/Logs/Log_${shortdate}.txt" 
            layout="[${longdate}] [${uppercase:${level}}] ${message} ${exception:format=tostring}"
            />
    <target name="logconsole" xsi:type="ColoredConsole" 
            layout="[${longdate}] ${uppercase:${level}}: ${message} ${exception:format=tostring}"
            />    
  </targets>

  <rules>
    <logger name="*" minlevel="Info" writeTo="logconsole" />
    <logger name="*" minlevel="Debug" writeTo="logfile" />

  </rules>
</nlog>
这很好。 现在在某些情况下我不想显示日期时间部分,我只想在控制台中显示它

我将如何使用NLog实现这一点

我想要的解决方案是:

logger.Info("Hello World", writeTo: "logconsole", layout: "[${uppercase:${level}}] ${message}");
我尝试添加一个新的
taget

<target name="logconsole_simple" xsi:type="ColoredConsole"
            layout="${uppercase:${level}}: ${message} ${exception:format=tostring}"/>
但它仍然显示日期时间部分,并将其记录到文件中(我不希望这样)。
如何解决此问题?

为您的特殊情况添加目标和规则,并按姓名引用记录器

配置:


用法:

internal class Program
{
    private static readonly Logger DefaultLogger = LogManager.GetLogger("default");

    private static readonly Logger OtherLogger = LogManager.GetLogger("other");

    private static void Main(string[] args)
    {
        for (var i = 0; i < 2; i++)
        {
            if (i % 2 == 0)
            {
                DefaultLogger.Info("normal log message");
            }
            else
            {
                OtherLogger.Info("special case");
            }
        }
    }
}
内部类程序
{
私有静态只读记录器DefaultLogger=LogManager.GetLogger(“默认”);
专用静态只读记录器OtherLogger=LogManager.GetLogger(“其他”);
私有静态void Main(字符串[]args)
{
对于(变量i=0;i<2;i++)
{
如果(i%2==0)
{
DefaultLogger.Info(“正常日志消息”);
}
其他的
{
OtherLogger.Info(“特殊情况”);
}
}
}
}
编辑:如果您真的想通过修改现有目标和规则在代码中完成这项工作,您可以(这将使用原始帖子中的配置):

使用System.Linq;
使用NLog;
使用NLog.布局;
使用非直瞄目标;
内部课程计划
{
私有静态只读记录器Logger=LogManager.GetCurrentClassLogger();
私有静态void Main(字符串[]args)
{
对于(变量i=0;i<2;i++)
{                
如果(i%2==0)
{
Logger.Info(“正常日志消息”);
}
其他的
{
//重新配置
var consoleTarget=LogManager.Configuration.FindTargetByName(“logconsole”);
var oldLayout=consoleTarget.Layout;
consoleTarget.Layout=new SimpleLayout{Text=“${uppercase:${level}}:${message}${exception:format=tostring}”};
var fileRule=LogManager.Configuration.LoggingRules.Single(r=>r.Targets.Any(t=>t.Name==“logfile”);
LogManager.Configuration.LoggingRules.Remove(fileRule);
LogManager.Configuration.Reload();
Logger.Info(“特殊情况”);
//替换原件
consoleTarget.Layout=旧布局;
LogManager.Configuration.LoggingRules.Add(fileRule);
LogManager.Configuration.Reload();
}
}
}
}

您知道这是否是添加
其他记录器的唯一方法吗?对于特定的案例使用,
DefaultLogger
,不能在运行时更改此设置吗?
<logger name="logconsole_simple"  level="Info" writeTo="logconsole_simple" />
logger.Log(LogEventInfo.Create(LogLevel.Info, "logconsole_simple", "simple message!"));
internal class Program
{
    private static readonly Logger DefaultLogger = LogManager.GetLogger("default");

    private static readonly Logger OtherLogger = LogManager.GetLogger("other");

    private static void Main(string[] args)
    {
        for (var i = 0; i < 2; i++)
        {
            if (i % 2 == 0)
            {
                DefaultLogger.Info("normal log message");
            }
            else
            {
                OtherLogger.Info("special case");
            }
        }
    }
}
using System.Linq;
using NLog;
using NLog.Layouts;
using NLog.Targets;

internal class Program
{
    private static readonly Logger Logger = LogManager.GetCurrentClassLogger();

    private static void Main(string[] args)
    {
        for (var i = 0; i < 2; i++)
        {                
            if (i % 2 == 0)
            {
                Logger.Info("normal log message");
            }
            else
            {
                // reconfigure
                var consoleTarget = LogManager.Configuration.FindTargetByName<ColoredConsoleTarget>("logconsole");
                var oldLayout = consoleTarget.Layout;
                consoleTarget.Layout = new SimpleLayout { Text = "${uppercase:${level}}: ${message} ${exception:format=tostring}" };
                var fileRule = LogManager.Configuration.LoggingRules.Single(r => r.Targets.Any(t => t.Name == "logfile"));
                LogManager.Configuration.LoggingRules.Remove(fileRule);
                LogManager.Configuration.Reload();

                Logger.Info("special case");

                // replace originals
                consoleTarget.Layout = oldLayout;
                LogManager.Configuration.LoggingRules.Add(fileRule);
                LogManager.Configuration.Reload();
            }
        }
    }
}