Общий алгоритм синтаксического анализа журнала - PullRequest
1 голос
/ 05 июля 2011

Мое приложение при запуске пишет логи. Теперь мне нужно проверить, завершено ли индексирование, проверяя сообщение о состоянии относительно того, записано ли оно в журналах или нет (обратите внимание, что ведение журнала происходит динамически и процесс выполняется). Мое приложение не отправляет сигнал о том, когда оно завершило процесс индексации, просто регистрирует его и выполняет другие действия. Должен ли я опрашивать журналы постоянно, чтобы проверить, было ли записано состояние в журналах, но это было бы своего рода анти-паттерном или плохим дизайном. Я даже не могу сделать цикл ожидания или ничего не делать, а затем проверить, еще один плохой дизайн. Как можно наилучшим образом проверить введенную запись в журналах, не запрашивая при этом журналы повторно и потребляя меньше циклов ЦП?

Ответы [ 3 ]

1 голос
/ 05 июля 2011

Опрос - обычное решение.Другие решения требуют совместной работы процесса генерации;если это возможно, это, очевидно, предпочтительное решение, но если процесс генерации должен оставаться в неведении о слушателе (в смысле незнания о его существовании), тогда опрос - это единственное допустимое решение.(В зависимости от возможностей ведения журнала вы можете организовать запись журнала в именованный канал и прочитать его.)

Обратите внимание, что опрос не обязательно стоит так дорого, если вы этого не делаетеэто слишком часто.

1 голос
/ 05 июля 2011

Если вы управляете обеими программами (т. Е. Читаете и пишете журнал), то самое простое решение состоит в том, чтобы писатель уведомлял всех слушателей, когда это делается с использованием некоторой формы межпроцессного взаимодействия (например, сигналов).

Только если IPC невозможен, вам следует искать более разумные методы ожидания опроса изменений.Большинство операционных систем позволяют регистрировать обратный вызов при изменении файла или каталога.Посмотрите на этот вопрос для некоторых предложений.

0 голосов
/ 08 июля 2011

Предполагая, что разбор журналов - единственная альтернатива, которую вы имеете, идиома, которую вы ищете, имеет следующее высокоуровневое представление (стиль UNIX CLI)

# tail -f logfile.txt | grep STATUS_PATTERN

Там (1) "tail -f"выводит все новые строки, которые добавляются в logfile.txt, и передает их в (2) «grep», который выполняет фактическое сопоставление с образцом.

Функциональность (1) и (2) тривиальна для реализации вJava / C ++ как отдельный поток / процесс и обеспечивает более легкую загрузку, чем периодический опрос.Вам также понадобится дополнительная функциональность для определения условий ротации журналов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...