У нас есть несколько приложений, которые генерируют свои собственные файлы журналов в виде простого текста, которые я хотел бы направить на удаленный сервер системного журнала для централизованного ведения журнала. У меня нет доступа к root
этим машинам, и я не могу перенастроить их syslog
для перенаправления вывода на удаленный компьютер.
В Интернете я нашел несколько решений, но в основном это самодельные bash-скрипты, и я ищу что-то более надежное, подходящее для реализации в потенциально крупносерийной производственной среде.
Желательно что-то, разработанное с учетом небольшого следа, фонового демона, который продолжает работать, который может не отставать от множества строк и т. Д. - Какие решения в настоящее время доступны?
Ответы:
Вы уже отклонили «чужие сценарии bash», но это довольно распространенное решение - некоторые творческие
logger
команды могут следовать за файлом и отправлять его содержимое в другое место.Я лично не сделал бы это в производственной среде все же.
Лучший вариант , который требует меньшего количества сценариев повозки , запряженные волов используют
rsyslogd
и входной текстовый файл модуль , как yoonix упоминался - это довольно приличным решение , хотя есть некоторый потенциал для потерянных линий во время вращения файла, и если вы в системе Linux сrsyslog
как ваш демон syslog, не требуется много дополнительной работы.syslog-ng
также поддерживает источник входного файла с функциональностью, аналогичнойrsyslog
's.ИМХО, лучшее решение, хотя и требующее изменения приложения, генерирующего эти журналы, - это прямой вход в системный журнал. Вы не хотите проходить через промежуточные шаги, файлы и т. Д. -
syslog
это SYStem LOGger, и вещи, которые пишут журналы на платформе Unix, должны отправлять их в syslog.Реализация этого, к сожалению, оставлена как упражнение для читателя (и разработчика приложения) и может быть невозможна, если ваши разработчики не существуют, ленивы или некомпетентны ....
источник
rsyslog
конфигурацию, запущенную в данный момент в системе. Вы НЕ должны запускать два демона системного журнала. Не хамить, но вы должны прекратить пытаться сделать это неправильно *: Каждое правильное решение этого сценария требует административных (корневых) действий на сервере или модификации приложения. Вы будете иметь к лицу , что реальность и дело с тем, что группа в организации имеет корень на рассматриваемых систем, в противном случае этот вопрос находится вне темы (вы пытаетесь обойти политику вашей организации) ....Вы можете использовать logstash с файлом вводом и системным журналом выходом.
Например, создайте конфигурацию с файлом (или файлами), которые вы хотите отслеживать, и информацией о вашем системном журнале.
Файл к syslog.conf:
Запуск logstash с
источник
Я взломал вместе
tail.c
иlogger.c
в одном небольшом след скомпилированной программы (бинарной) , который является легким, быстрым и стабильным. Пока у него есть доступ на чтение к файлам журналов, он работает без привилегий root.Я также внес несколько улучшений в собственный регистратор и добавил новую (необязательную) возможность вставки текстовой строки в начале каждой строки журнала перед ее отправкой на сервер журнала. В результате получается программа, которая может быть запущена сама по себе, без необходимости использовать оболочки (т.е. не нужно
tail logfile | logger
). Он будет работать вечно до тех пор, пока не будет явно уничтожен или не обнаружит ошибку записи в сетевой сокет. Он даже продолжает работать, если файл журнала поворачивается или даже исчезает (он просто продолжит проверять, появляется ли файл снова).Его легко использовать: просто предоставьте ему один или несколько файлов журналов для мониторинга, и каждый раз, когда в файл записывается новая строка, он отправляет копию этой строки на указанный вами локальный или удаленный сервер системного журнала. Плюс дополнительная текстовая строка, если вы используете эту опцию.
Я фактически закончил программу в декабре, но ждал, пока Yahoo возьмет авторское право и сделает его доступным, что они и сделали. (Я написал это как часть моей работы в Yahoo).
Информация о программе filelogger и ссылка для скачивания:
источник
Есть несколько способов справиться с этим. Но очень, очень первое , что вы должны сделать , это: вперед журналы с помощью системного журнала себе .
Системный журнал (и многие замены системного журнала) имеют встроенные средства для пересылки журналов на другой сервер системного журнала по другому адресу. Вы можете легко сделать это, изменив файл конфигурации и добавив адрес для переадресации объекта. Например, добавив эту строку в:
... перенаправит все средства на компьютер по адресу 192.168.1.1, на котором (надеюсь) работает служба. Пример, который я привожу здесь, относится к rsyslog, который является стандартным сервером системного журнала в Debian, хотя он должен работать для многих других. Проконсультируйтесь с документацией по вашей реализации системного журнала
man syslog
и посмотрите, что там говорится о «пересылке».Удаленный сервер системного журнала может быть чем угодно. Есть даже такие продукты, как Splunk , которые с радостью объединяют эти журналы в одно представление с веб-панелью, поиском, уведомлениями, управляемыми событиями, и т. Д. И т. Д. Вы можете увидеть больше здесь: http://www.splunk.com/ Если это не соответствует вашим потребностям, вы можете использовать что-то еще. Есть даже серверы системного журнала, которые будут выгружаться в базу данных SQL!
Конечно, вы могли бы написать свой собственный скрипт / программу / сервис, чтобы сделать это для вас, но зачем заново изобретать колесо, когда оно и для вас сделано, и уже дано вам?
Изменить: Итак, я вернулся и перечитал вопрос, и заметил несколько комментариев. Это звучит как:
Итак, давайте рассмотрим каждый из них по порядку:
root
для настройки регистрации. Нам нужен только доступ к API системного журнала.root
не является обязательным требованием для записи в системный журнал; если бы это было так, то все те службы, которые отбрасывают привилегии, не смогли бы записать диагностику в файлы журнала.Re: текстовые дампы, это нормально. однако вы должны иметь возможность использовать подоболочку для передачи вывода STDERR и STDOUT программе, которая вызывает API syslog. Это не ракетостроение, оно далеко не хрупкое и хорошо документировано. Фактически, это одна из причин того, что перенаправление вывода даже существует. Простая команда, которая может быть добавлена в один сценарий оболочки:
(my-application 2> & 1 | my-syslog-shunt) &
если у вас есть возможность изменить исходный код вашего приложения, вы должны написать в него шунт, чтобы выводить текстовый вывод в syslog вместо простого текстового файла. Это не должно быть слишком сложно; все, что вам нужно сделать, это взять строки, которые вы бы вывели, и обернуть их вызовом. Однако....
у вас может вообще не быть доступа к исходному коду, поэтому вы не можете этого сделать. Что означает что-то вроде # 3 выше, будет работать нормально.
источник
Runtime.exec("logger ..."
) Хорошо, спасибо.Я отвечаю на свой вопрос.
Возможно, сработал swatch, но мне не удалось заставить модуль perl Sys :: Syslog работать на хосте, а установленный на хосте / usr / bin / logger не поддерживает запись на удаленный сервер (util-linux-ng- 2.17.2).
Итак, первым делом я скачал исходный код для util-linux-2.20.1, для которого программа logger поддерживает удаленную регистрацию. После тестирования стало очевидно, что существует ограничение на количество символов, разрешенных в строке журнала. Копаясь в исходном коде, я обнаружил жестко заданный предел в 400 символов. (Если вы мне не верите, запустите «strings / usr / bin / logger | grep 400» в любой системе Linux).
Это ограничение неприемлемо для ведения журнала Apache-типа (включая nodejs), поэтому я изменил код и увеличил ограничение до 4096. Пока я работал, я также добавил новый параметр командной строки, который позволяет вставлять необязательный параметр. текстовая строка в начале каждой строки журнала. Я сделал это, потому что журналы nodejs не включают имя хоста, как можно было бы увидеть в apache.
На этом этапе я мог запустить скрипт оболочки с «tail -F -n 0 [logfile] | ./modified_logger ....», и это сработало. Но у меня были некоторые опасения по поводу запуска этого из supervise (daemontools) или даже в фоновом режиме, потому что, если одна или другая сторона трубы завершается, существует риск, что вся труба завершится. У меня также были проблемы (хотя и не проверенные) по поводу производительности.
поэтому я решил объединить хвостовую функциональность с функциональностью регистратора в один исполняемый двоичный файл, который бы исключал необходимость использования Unix-каналов или внешних программ. Я сделал это, взломав tail.c из gnu coreutils и включив то, что мне нужно, в модифицированную программу регистрации.
В результате получается новый двоичный файл (размером 117 КБ), который я называю «filelogger» и который непрерывно отслеживает один или несколько файлов и записывает каждую новую строку в локальный или удаленный системный журнал, через UDP или TCP. Работает как часы. Я смог выполнить небольшой тест, и он занял около 17 000 строк (1,8 МБ) за 3 секунды в подсетях с помощью vlan и нескольких физических коммутаторов между ними на удаленном сервере с syslog-ng.
чтобы запустить программу, вы должны сделать что-то вроде следующего (на переднем плане, в фоне или под наблюдением daemontools):
./filelogger -t 'access' -d -p local1.info -n [удаленный хост-логин] -u / tmp / игнорируется -a $ (имя хоста) / tmp / myfile1 / tmp / myfile2 ...
/ tmp / myfile1 и / tmp / myfile2 - это отслеживаемые файлы.
«-A» - это новая опция, которую я добавил. В этом случае я вставляю локальное имя хоста в начале каждой строки журнала.
Это решение было именно тем решением, которое я искал, когда задавал вопрос, и, как оказалось, не существовало, пока я не сделал это сам. :)
источник