Зарегистрируйте некоторую информацию независимо от того, что использует log4net - PullRequest
2 голосов
/ 09 мая 2011

Ситуация такова, что уровень log4net настроен как «Ошибка», но есть некоторая информация, которую мне нужно записать в условиях «независимо от того, что», например

«loggin начался», если только «Ошибка»или «Фатальный» включен, я не могу записать это в «Ошибка» или «Фатальный», так как это просто информация

, так что есть ли способ сделать это, кроме как изменить уровень регистратора на информацию, записать журнал, а затем изменитьобратно уровень, потому что это будет действовать как обходной путь, а не решение

и без использования заголовков, так как они приходят только в начале

РЕДАКТИРОВАТЬ: В Appender

StringMatchFilter stringFilter = new StringMatchFilter();
stringFilter.AcceptOnMatch = true;
stringFilter.StringToMatch = "successfully";
stringFilter.ActivateOptions();
appender.AddFilter(stringFilter);

DenyAllFilter deny = new DenyAllFilter();
deny.ActivateOptions();
appender.AddFilter(deny);

добавление к appender и установка уровня «All» в корневой каталог и управление уровнями в appenders, но я все еще не могу написать сообщение, содержащее «успешно», но учтите, когда я устанавливаю уровень appender для информации, фильтр начинает работать

Ответы [ 2 ]

2 голосов
/ 09 мая 2011

Я предполагаю, что это все, потому что вам не нравится идея использования .FatalFormat, когда это не является ошибкой.

Я не уверен, как бы вы сделали это программно, но если бы вы использовали файл конфигурации, вы добавили бы раздел вроде

    <logger name="ALWAYS">
        <level value="DEBUG" />
        appender-ref ref="RollingFileAppender" />
    </logger>

, что означает, что вы можете регистрировать свои сообщения как

   log4net.LogManager.GetLogger("Always").InfoFormat( ... );

или вы можете создать статический

   static readonly log4net.ILog alwaysLogger  = log4net.LogManager.GetLogger("Always");

и войти через.

   alwaysLogger.InfoFormat(....);
1 голос
/ 09 мая 2011

Я бы предложил создать фильтр, который сначала смотрит на совпадение строк, а затем на уровень. Таким образом, вы можете получить ключевую строку, которую вы передадите в сообщении (скажем, «AppInfo» или что-то уникальное и не найденное в ошибке). Затем ваш фильтр обнаружит это и зарегистрирует его, даже если вы зарегистрировали его на уровне INFO, но фильтр проигнорирует все другие сообщения, которые не были ОШИБКА или ФАТАЛЬНЫМИ. Я написал статью о CodeProject, которая покажет вам, как выполнять сложную фильтрацию следующим образом:

http://www.codeproject.com/KB/dotnet/Log4net_Tutorial.aspx

Единственным ключом здесь является то, что вам, вероятно, не нужно указывать фильтрацию в корне для этого конкретного приложения, так как root, если я правильно помню, заменяет приложение,

...