我需要改变布局以适应不同的用途

本文关键字:改变 布局 | 更新日期: 2023-09-27 18:25:41

从一个方面写入日志条目时,我需要更改日志文件的布局。我可能还需要及时更改其他设置。

我创建了两个FileTargets,根据需要创建布局。

    LoggingConfiguration config = new LoggingConfiguration();
    LoggingConfiguration aspectConfig = new LoggingConfiguration();
    FileTarget fileTarget = new FileTarget();
    fileTarget.Name = "fileTarget";
    fileTarget.Layout = "${longdate} ${machineName} ${callsite} ${message} ${exception:format=tostring}";
    fileTarget.FileName = String.Format("{0}Admin.log", Config.DatabasePath);
    fileTarget.KeepFileOpen = false;

    FileTarget aspectTarget = new FileTarget();
    aspectTarget.Name = "aspectTarget";
    aspectTarget.Layout = "${longdate} ${machineName} ${message} ${exception:format=tostring}";
    aspectTarget.FileName = String.Format("{0}Admin.log", Config.DatabasePath);
    aspectTarget.KeepFileOpen = false;

    LoggingRule rule2 = new LoggingRule("*", LogLevel.Trace, fileTarget);
    config.LoggingRules.Add(rule2);
    LoggingRule aspectRule = new LoggingRule("aspects", LogLevel.Trace, aspectTarget);
    aspectConfig.LoggingRules.Add(aspectRule);

    LogManager.Configuration = config;

可能还会有其他变化/差异,但这不是现阶段的重点。

使用以下方法可以很好地用于"默认"或"*"配置,即使用:

  var log = LogManager.GetCurrentClassLogger();
  log.Fatal("##########################################");

我想做的是能够通过调用logger并指定"aspectRule"来使用"aspectRule"而不是默认的"*"规则。

我原以为这会奏效:

  var log = LogManager.GetLogger("aspects");
  log.Fatal("########################################");

这一切都很好,但我看不出我是如何定义一个名为"方面"的新Logger的,尤其是在代码中,我甚至没有创建一个称为"*"的Logger:-)

请注意,我没有使用XML配置文件,需要一个可编程使用的解决方案。

有什么想法吗?

编辑:

我需要写一个日志条目,如本例所示:

  if (someCondition)
    logger.Fatal("#############"); // use layout in fileTarget
  else
    logger.Fatal("##############");  // use layout in aspectTarget

我需要改变布局以适应不同的用途

EDIT:要回答编辑后的问题,LoggingRule rule2 = new LoggingRule("*", LogLevel.Trace, fileTarget)任何输出记录到日志文件中。

如果你想要一个特定的输出,那么你必须使用NLog。例如,使用fileTarget("*")记录从TraceInfo的任何内容,并具有另外两个特定目标aspectsrule2,日志级别从ErrorFatal

然后你可以这样登录:

LogManager.GetCurrentClassLogger().Debug( "Non-specific message" );
LogManager.GetLogger( "rule2" ).Fatal( "From rule2" );
LogManager.GetLogger( "aspects" ).Fatal( "From Aspects" );

--

您正在创建两个配置configaspectConfig,设置这两个配置并最终设置LogManager.Configuration = config

最终CCD_ 11没有被使用。要解决此问题,请删除所有与aspectConfig相关的代码,并将acpects行修复为:

config.LoggingRules.Add(aspectRule);