Регистрируйте некоторую информацию независимо от того, что с помощью log4net

#c# #logging #log4net

#c# #ведение журнала #log4net

Вопрос:

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

«loggin запущен», если включена только ‘Error’ или ‘Fatal’, я не могу зарегистрировать это как ошибку или Fatal, поскольку это просто информация

итак, есть ли какой-либо способ, которым я могу это сделать, кроме как изменить уровень регистратора на info, записать журнал, а затем изменить уровень обратно, потому что это будет действовать как обходной путь, а не решение

и без использования заголовков, поскольку они появляются только в начале

РЕДАКТИРОВАТЬ: в приложении

 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’ для root и управление уровнями в appenders, но я все равно не могу написать какое-либо сообщение, содержащее ‘успешно’
но, пожалуйста, обратите внимание, когда я устанавливаю уровень добавления в info, фильтр начинает работать

Комментарии:

1. Есть ли причина, по которой вы не используете файл конфигурации для log4net?

2. n добавлений для n количества файлов журнала, все созданы новые с добавлением даты и времени к имени файла для n номера инициализирующего класса

Ответ №1:

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

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

     <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. вы пытаетесь сказать, что у меня должен быть один файл и несколько регистраторов к нему?

2. Вы можете, и это то, что я делаю, но вам не нужно, если вы этого не хотите. Обычно определение другого регистратора используется для увеличения или уменьшения регистрации в одном конкретном классе. Например, в моем приложении я могу установить root в значение ошибка уровня и добавить другой регистратор в мой конфигурационный файл с именем, например, MyCompany. Клиент. Инструкции и установите его уровень на debug, что означает, что я буду получать отладочные сообщения для этого класса, не получая отладочных сообщений для остальной части моего приложения. И если вы используете файл конфигурации, вы можете обновить этот файл без необходимости перезапуска вашего приложения.

3. хм, я думаю, у меня нет другого выбора: (

Ответ №2:

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

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

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

Комментарии:

1. ах, я просматривал вашу статью, можем ли мы добавить фильтры в root? Потому что я использую все записи во время выполнения, т. е. программно

2. Проблема в том, что порог регистрации применяется на корневом уровне, и если уровень равен «Ошибка», то фильтры информации никогда не применяются