Мне нужно изменить макет для разных целей - PullRequest
0 голосов
/ 25 февраля 2012

Мне нужно изменить макет моего файла журнала при записи записей журнала из аспекта. Скорее всего, мне понадобится изменить и другие настройки во времени.

Я создал две 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("##########################################");

То, что я хочу сделать, это иметь возможность использовать 'aspectRule' вместо правила по умолчанию '*', вызвав logger и указав 'aspectRule'.

Я думал, что это будет работать:

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

все хорошо, но я не понимаю, как определить новый Logger, называемый «аспектами», особенно потому, что в коде я даже не создаю Logger, называемый «*»: -)

Обратите внимание, что я не использую XML-файл конфигурации и мне нужно решение для программного использования.

Есть идеи?

EDIT:

Мне нужно написать 1 запись в журнале, как в этом примере:

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

1 Ответ

2 голосов
/ 25 февраля 2012

РЕДАКТИРОВАТЬ: Чтобы ответить на ваш отредактированный вопрос, LoggingRule rule2 = new LoggingRule("*", LogLevel.Trace, fileTarget) будет записывать любой вывод в файл журнала.

Если вам нужен конкретный вывод, вам нужно быть конкретным с NLog. Например, регистрируйте что-нибудь в диапазоне от Trace до Info с помощью fileTarget ("*") и получите две другие специфичные цели aspects и rule2 с уровнями журналирования от Error до Fatal.

Тогда вы можете войти так:

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

-

Вы создаете две конфигурации config и aspectConfig, настраиваете обе и в конечном итоге настраиваете LogManager.Configuration = config.

В конечном итоге aspectConfig не используется. Для устранения удалите весь код, связанный с aspectConfig, и исправьте строку acpects следующим образом:

config.LoggingRules.Add(aspectRule);

...