Что делают инструкции Вы придерживаетесь для записи хороших операторов входа

Поскольку вы сказали, что анализируете документ .txt (со встроенными комментариями HTML), вы можете попробовать Regexp::Grammars . Вот отправная точка:

use strict;
use warnings;
use Regexp::Grammars;

my $parser = qr{   
          
          
           (?:(?:<[word]><[separator]>?)|(?:<[separator]><[word]>?))+
           <.wordchar>+
           <.comment> | (?:(?:(?!<.comment>)(?!<.wordchar>)).)+
           [a-zA-Z]
           \< <.wordchar>+ \> [^<]* \
}sx;

my $fn = 'file.txt';
open ( my $fh, '<', $fn ) or die "Could not open file '$fn': $!";
my $text = do { local $/; <$fh> };
close $fh;

if ($text =~ $parser) {
    for my $word (@{ $/{words}{word} } ) {
        print "'", $word, "'\n";
    }
}

20
задан Daniel Honig 6 November 2008 в 22:50
поделиться

7 ответов

Тот оператор 'журнала' больше походит на оператор трассировки.

Вход: покажите нормальные события и ошибки

Трассировка: покажите путь выполнения, а также все регистрирующиеся события

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

, Таким образом, Вы должны иметь 2 уровня журнала, по крайней мере, и смочь выключить трассировку для производительности. Необходимо смочь направить эти потоки событий к различным местоположениям. Это позволяет Вам легко сохранять журналы для хронологических записей, не создавая помехи им информацией об отладке, которую Вы только хотите для трассировки проблем.

Много ответов здесь фокусируется на полях, которые Вы включали бы в сообщение журнала, но я буду утверждать, что размещение и регистрирующийся уровень вызовов журнала более важны. При использовании log4net, Вы смогли бы включать/исключать отметку даты по желанию с помощью файлов конфигурации, но Вы не сможете поместить или удалить операторы журнала без перекомпиляции, таким образом, будет иметь смысл думать довольно трудно о том, куда они идут. Вне стандартных полей, таких как метка времени и идентификатор потока, и т.д., Вы хотите знать имя класса и имя метода, от которого был выполнен вызов. Log4net и др. уже заботится об имени класса, если Вы идете их лучшей практикой именования Вашего регистратора после типа, Вы обеспокоены в. Вне этого я обычно включаю имя метода. Это особенно необходимо для трассировки, но я включаю ее во все свои сообщения журнала.

Вход :

Вы хотите знать достаточно информации о том, что действие собирается быть выполненным, чтобы возвратиться и ввести по абсолютному адресу вокруг, если что-то идет не так, как надо. Хорошие кандидаты являются идентификаторами сообщений, адресами электронной почты, что-то, что однозначно определяет объект работы. Этот вид сообщения должен прибыть, как только этот вид данных доступен, так, чтобы, когда Вы читаете вниз через файл журнала, Вы видели что-то как 'попытка сделать x с y' и затем позже, если мы будем видеть исключение, мы знаем, на какой объект работы мы должны посмотреть видеть, почему мы перестали работать.

Регистрирующиеся исключения должны быть соединены с сообщением журнала 'попытки', так, чтобы сообщение об исключении имело смысл в контексте при чтении журнала. Это означает думать о структуре обработки исключений. Если Вы используете .NET, и Вы только хотите зарегистрировать исключение, не обработать его, Вы хотите повторно бросить тот же , исключение, не новое, поэтому просто 'бросает' не, 'бросают e', где 'e' является Вашим экземпляром исключения. Ищите этого, если это не имеет смысла.

Трассировка :

Это на самом деле более просто, обычно у меня будут сообщение вначале и конец метода интереса, как держатели для книг. В записи можно распечатать критические аргументы метода, которые влияют на процесс выполнения программы. Вход сообщения в конце метода является довольно дополнительным, обычно Вы будете интересоваться рассмотрением вида трассировки подобных отслеживание стека. Можно выяснить путь выполнения без них.

Производительность :

Для строковой производительности, используйте '*Format' методы при использовании log4net или чего-то подобного. Это внутренне будет использовать StringBuilder так, чтобы Вы не платили неизменный строковый штраф все время. Обычно, хотя ключ должен смочь выключить трассировку для производительности и иметь вход быть достаточно кратким для отъезда на, даже если сообщение журнала является дорогим. Когда правильно сделано, не должно быть достаточного количества из них, чтобы быть проблемой.

14
ответ дан 29 November 2019 в 23:27
поделиться

Самая полезная часть в операторе журнала (кроме, возможно, даты & время, конечно), уникальный идентификатор. Все наши записи в журнале начинаются с MSG-xxxxx, где xxxxx является уникальным целым числом. Этот тег MSG-xxxxx всегда трудно кодируется в источнике, никогда в файле ресурсов, таким образом, легко найти его назад. Это - также очень легкий ключ поиска в документации.

Также то, что полезно, должно всегда включать содержание переменной строки в двойные кавычки для легкой дифференциации от самого сообщения:

MSG-12345, Испытанный для открытия "myfile.txt", возвратил код ошибки "123 - файл, не найденный".

Это также помогает, когда Вы пытаетесь извлечь информацию из журнала с помощью некоторого регулярного выражения.

14
ответ дан 29 November 2019 в 23:27
поделиться

Не делайте Конкатенации строк в регистрирующихся операторах, по крайней мере, отлаживайте операторы.

Одно приложение Java, я продолжал работать только что, имело мрачную производительность. Таким образом, мы взломали профилировщика для наблюдения, где узкие места были. Выпущенный, что это происходило главным образом из-за операций Конкатенации строк, понесенных путем сборки операторов входа Уровня отладки, которые произошли ВСЕ ВРЕМЯ во вложенных внутренних циклах и т.д. (ха, и думать они были добавлены во-первых для выяснения, почему производительность была так плоха!)

не делают, это

LOGGER.debug("The variable was " + myVariable + " and we are doing " + foo);

Вместо этого делает это

if (LOGGER.isDebugEnabled()) {
  LOGGER.debug("put your debug statement here " + foo + " and " + bar);
}
6
ответ дан 29 November 2019 в 23:27
поделиться

В моих журналах мне нужна дата и время, процесс, который создает журналы и PID. Нет ничего худшего, чем рассмотрение журналов и удивление, прибыли ли они в пять минут назад, или были ли они оставлены позади 5 лет назад перед Вашими изменениями. Дата и время важна.

, Когда я сообщаю об ошибках, я заявляю кратко, что назвали, что произошло, и какие коды ошибок возвратились. Если это - errno, я также сообщаю strerror (errno). Я читаю это для нахождения проблемы, и обычно я нахожусь в кричащей спешке найти проблему. Я не хочу искать материал. Я хочу, чтобы это сказало мне, что произошло, и я предпочитаю подробный бесполезному. Если я отлажу, и часто даже когда я не, я буду регистрировать все данные как SQL-оператор или запись низкого уровня, ключи, что-либо, что поможет мне найти проблему как можно скорее.

Иногда мы регистрируемся безумно, и это может замедлить систему немного. Но когда дерьмо понижается, и мы получаем повестку в суд и существует судебный процесс на свободе, и обвинения в детоубийце бросаются вокруг, мы любим это, у нас есть достаточно касания входа в систему для показа точно, что произошло и почему и кто вызвал его. Это - управление Виной.

4
ответ дан 29 November 2019 в 23:27
поделиться

Существует 5 аспектов, которые важны для меня (начинающий с менее важного):

  1. Включают метку времени в запись в журнале
  2. , Обеспечивают возможность отфильтровать менее важные, "посылающие спам" записи. Хороший, теги скобок старой площади должны быть достаточно для grep. Было бы хорошо, если некоторые из них будут сгенерированы автоматически - в зависимости от типа журнала (сообщение, предупреждение, утверждать и т.д.), и дополнительно передайте уровень важности (спам, нормальный, высокий, очень важный). Добавляя дополнительный, тегам сужения контекста вручную также рекомендуют IMO.
  3. Делают функции/макросы журнала столь же простыми в использовании, как это возможно.
  4. буферы вывода Сброса сразу.
  5. Обеспечивают возможность мгновенного и однозначного определения места поколения записи в журнале (имя исходного файла + номер строки). Это может быть трудно на некоторых языках, но очень часто знающий точно, какое утверждение привело средства к сбою непосредственная фиксация ошибки. Дополнительно Вы не теряете время для добавления идентификаторов места журнала вручную (например, "SomeClass:: SomeMethod: обменивайтесь сообщениями")
5
ответ дан 29 November 2019 в 23:27
поделиться

Мы используем "двумерный" вход т.е. вход отдельным модулем и в этом уровнем. Это дает нам реальный контроль при попытке отладить клиентские проблемы.

Каждая запись в журнале имеет уникальный идентификатор плюс дата плюс время плюс модуль плюс уровень отладки. Идентификатор отражается (в случае необходимости) в исключении / сообщение об ошибке, отображенное пользователю. Таким образом, если пользователи регистрируют инцидент, мы можем быстро потянуть тот раздел журнала и видеть то, что произошло вокруг той точки.

сообщения Уровня отладки не используют общие места как "Недопустимый вход", Мы регистрируем фактические значения, которые вызвали проблему. Если то поле имеет отношения к другим полям, мы регистрируем их также.

2
ответ дан 29 November 2019 в 23:27
поделиться

Уровни переменной кода входа, таким образом, Вы не можете переключиться ни между чем, основной информацией о процессе выполнения программы и безумно подробной информацией о внутренних работах. Затем путем корректировки переменной, которая управляет регистрирующимся уровнем, которым можно управлять, сколько произведенный Вы хотите получить.

В крупных проектах, где Вы хотите смочь получить вход от клиентов, встречающихся с проблемами, также помогает, можно ли управлять, какие части приложения зарегистрируются; например, если существует проблемы с чтением AD информации о пользователе, можно добавить "AD_LOGGING=EVERYTHING" и получить подробный logginginformation на этом, не видя информации о журнале от любого раздела программы.

2
ответ дан 29 November 2019 в 23:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: