Linux: как отправлять новые строки в лог-файлах на удаленный системный журнал?

8

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

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

Желательно что-то, разработанное с учетом небольшого следа, фонового демона, который продолжает работать, который может не отставать от множества строк и т. Д. - Какие решения в настоящее время доступны?

Майкл Мартинес
источник
3
Вы смотрели на модуль ввода текстового файла для rsyslog?
yoonix
@yoonix: Нет, нет, но я собираюсь :)
Майкл Мартинес
3
Хм, syslog может отправлять на удаленные серверы syslog. Настройте локальный системный журнал для отправки на удаленный сервер. Затем получите доступ к вашему локальному системному журналу через стандартные вызовы системного журнала или с помощью регистратора или чего-то еще.
Зоредаче
4
Почему бы вам не написать лог - файлы в именованный канал и есть демон прослушивания , который отправляет их на пути serverfault.com/questions/189477/...
user9517
3
Вам не нужно изменять приложение, просто поместите именованный канал с тем же именем, что и файл журнала, в который приложение пишет, на место.
user9517

Ответы:

13

Вы уже отклонили «чужие сценарии bash», но это довольно распространенное решение - некоторые творческие loggerкоманды могут следовать за файлом и отправлять его содержимое в другое место.
Я лично не сделал бы это в производственной среде все же.


Лучший вариант , который требует меньшего количества сценариев повозки , запряженные волов используют rsyslogdи входной текстовый файл модуль , как yoonix упоминался - это довольно приличным решение , хотя есть некоторый потенциал для потерянных линий во время вращения файла, и если вы в системе Linux с rsyslogкак ваш демон syslog, не требуется много дополнительной работы.

syslog-ngтакже поддерживает источник входного файла с функциональностью, аналогичной rsyslog's.


ИМХО, лучшее решение, хотя и требующее изменения приложения, генерирующего эти журналы, - это прямой вход в системный журнал. Вы не хотите проходить через промежуточные шаги, файлы и т. Д. - syslogэто SYStem LOGger, и вещи, которые пишут журналы на платформе Unix, должны отправлять их в syslog.
Реализация этого, к сожалению, оставлена ​​как упражнение для читателя (и разработчика приложения) и может быть невозможна, если ваши разработчики не существуют, ленивы или некомпетентны ....

voretaq7
источник
7
@MichaelMartinez Вы бы изменили rsyslogконфигурацию, запущенную в данный момент в системе. Вы НЕ должны запускать два демона системного журнала. Не хамить, но вы должны прекратить пытаться сделать это неправильно *: Каждое правильное решение этого сценария требует административных (корневых) действий на сервере или модификации приложения. Вы будете иметь к лицу , что реальность и дело с тем, что группа в организации имеет корень на рассматриваемых систем, в противном случае этот вопрос находится вне темы (вы пытаетесь обойти политику вашей организации) ....
voretaq7
5
@ Майкл Все это говорит нам о том, что кто-то пытается заставить неправильную команду внедрить исправление.
Андрей B
4
@MichaelMartinez imho, это звучит как довольно быстрый путь к снижению уровня технического долга.
Sirex
2
@Sirex. Как бы то ни было, это путь вещей. Я работаю в организации, в которой работают десятки тысяч человек, большинство из которых технические (инженеры, разработчики, ops и т. Д.)
Майкл Мартинес,
5
Я полагаю. Вообще я нашел в долгосрочной перспективе, что нет никаких медалей в победе в самопричиненных битвах. Когда технический долг доходит до того, что это иронично сказывается на бизнесе, по моему опыту, люди, которые усердно трудились, чтобы избежать слона в комнате, как правило, заканчивают тем, что несли банку. Так что я бы сказал, прикрыть свою задницу и заставить кого-то согласиться написать минусы этого.
Sirex
6

Вы можете использовать logstash с файлом вводом и системным журналом выходом.

Например, создайте конфигурацию с файлом (или файлами), которые вы хотите отслеживать, и информацией о вашем системном журнале.

Файл к syslog.conf:

input { file { path => "/var/log/kern.log" } }
output {
    syslog {
        facility => "kernel"
        host => "syslog.example.com"
        port => 514
        severity => "informational"
    }
}

Запуск logstash с

java -jar logstash-1.2.2-flatjar.jar agent -f file-to-syslog.conf
Sciurus
источник
+1. если использование входного файла rsyslog не является опцией, лучше всего использовать logstash. Во многих отношениях это лучше в долгосрочной перспективе.
Sirex
Я не знаком с этим. Если бы он делал то, что мне нужно, это избавило бы меня от взлома coreutils и util-linux.
Майкл Мартинес
да, конфиг будет выглядеть примерно так: pastebin.com/xeC9hxD3
Sirex
выглядит как очень крутой инструмент, но определенно излишним для того, что мне нужно здесь. logstash - это собственный сервис с веб-интерфейсом, требующий Java и т. д. Я буду продолжать использовать мой файллоггер, который имеет небольшой вес и небольшой размер и оптимизирован для производительности. ... Но, спасибо за предложение logstash, потому что я вижу необходимость в этом в других ситуациях в будущем!
Майкл Мартинес
да, это инструмент jruby, упакованный в банку. Графический интерфейс на самом деле представляет собой кибану, которая просто упакована в него, но на самом деле это отдельный проект, поэтому он не нужен только для анализа сообщений. Это в основном швейцарский армейский нож лесозаготовок. Вы определяете входы и выходы, и в середине вы можете при желании обрабатывать журналы, что дает им контекст. - Скорее всего, это излишне для вас, если вы не хотите использовать эластичный поиск в своих данных журнала.
Sirex
4

Я взломал вместе tail.cи logger.cв одном небольшом след скомпилированной программы (бинарной) , который является легким, быстрым и стабильным. Пока у него есть доступ на чтение к файлам журналов, он работает без привилегий root.

Я также внес несколько улучшений в собственный регистратор и добавил новую (необязательную) возможность вставки текстовой строки в начале каждой строки журнала перед ее отправкой на сервер журнала. В результате получается программа, которая может быть запущена сама по себе, без необходимости использовать оболочки (т.е. не нужно tail logfile | logger). Он будет работать вечно до тех пор, пока не будет явно уничтожен или не обнаружит ошибку записи в сетевой сокет. Он даже продолжает работать, если файл журнала поворачивается или даже исчезает (он просто продолжит проверять, появляется ли файл снова).

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

Я фактически закончил программу в декабре, но ждал, пока Yahoo возьмет авторское право и сделает его доступным, что они и сделали. (Я написал это как часть моей работы в Yahoo).

Информация о программе filelogger и ссылка для скачивания:

Майкл Мартинес
источник
@slm: я переписал, как вы просили
Майкл Мартинес
Очень полезно, спасибо Майкл. Есть ли шанс, что вы запакуете его для установки Debian apt-get?
joelparkerhenderson
@joelparkerhenderson. Привет Джоэл. К сожалению, вероятно, не потому, что я не работаю с Debian. Вы пытались скопировать двоичный файл в вашу систему и посмотреть, работает ли он?
Майкл Мартинес
1

Есть несколько способов справиться с этим. Но очень, очень первое , что вы должны сделать , это: вперед журналы с помощью системного журнала себе .

Системный журнал (и многие замены системного журнала) имеют встроенные средства для пересылки журналов на другой сервер системного журнала по другому адресу. Вы можете легко сделать это, изменив файл конфигурации и добавив адрес для переадресации объекта. Например, добавив эту строку в:

*.*    @192.168.1.1

... перенаправит все средства на компьютер по адресу 192.168.1.1, на котором (надеюсь) работает служба. Пример, который я привожу здесь, относится к rsyslog, который является стандартным сервером системного журнала в Debian, хотя он должен работать для многих других. Проконсультируйтесь с документацией по вашей реализации системного журнала man syslogи посмотрите, что там говорится о «пересылке».

Удаленный сервер системного журнала может быть чем угодно. Есть даже такие продукты, как Splunk , которые с радостью объединяют эти журналы в одно представление с веб-панелью, поиском, уведомлениями, управляемыми событиями, и т. Д. И т. Д. Вы можете увидеть больше здесь: http://www.splunk.com/ Если это не соответствует вашим потребностям, вы можете использовать что-то еще. Есть даже серверы системного журнала, которые будут выгружаться в базу данных SQL!

Конечно, вы могли бы написать свой собственный скрипт / программу / сервис, чтобы сделать это для вас, но зачем заново изобретать колесо, когда оно и для вас сделано, и уже дано вам?


Изменить: Итак, я вернулся и перечитал вопрос, и заметил несколько комментариев. Это звучит как:

  1. Вы хотите объединить журналы приложений
  2. у вас нет доступа к root
  3. ваши приложения просто дампируют текст
  4. ваше приложение (я) не знает, как написать в локальный системный журнал
  5. у вас нет контроля над исходным кодом вашего приложения

Итак, давайте рассмотрим каждый из них по порядку:

  1. Системный журнал предназначен для объединения журналов вместе. Вы можете использовать все что угодно, но есть причина, по которой он существует уже давно. Он хорошо протестирован, хорошо отлажен, хорошо документирован, хорошо известен и для большинства * nix-платформ практически универсально поддерживается в том или ином варианте.
  2. нам не нужен доступ rootдля настройки регистрации. Нам нужен только доступ к API системного журнала. rootне является обязательным требованием для записи в системный журнал; если бы это было так, то все те службы, которые отбрасывают привилегии, не смогли бы записать диагностику в файлы журнала.
  3. Re: текстовые дампы, это нормально. однако вы должны иметь возможность использовать подоболочку для передачи вывода STDERR и STDOUT программе, которая вызывает API syslog. Это не ракетостроение, оно далеко не хрупкое и хорошо документировано. Фактически, это одна из причин того, что перенаправление вывода даже существует. Простая команда, которая может быть добавлена ​​в один сценарий оболочки:

    (my-application 2> & 1 | my-syslog-shunt) &

  4. если у вас есть возможность изменить исходный код вашего приложения, вы должны написать в него шунт, чтобы выводить текстовый вывод в syslog вместо простого текстового файла. Это не должно быть слишком сложно; все, что вам нужно сделать, это взять строки, которые вы бы вывели, и обернуть их вызовом. Однако....

  5. у вас может вообще не быть доступа к исходному коду, поэтому вы не можете этого сделать. Что означает что-то вроде # 3 выше, будет работать нормально.

Эйвери Пэйн
источник
две причины: (1) просто потому, что, как уже упоминалось, на рассматриваемых полях не было root или sudo. (2) сам «регистратор» может пересылать на удаленный сервер, но имеет ограничение в 400 символов на строку журнала, что не подходит для журналов Apache. Во всяком случае, я уже собрал собственное решение, которое делает именно то, что мне нужно (и также улучшает "регистратор"). Смотрите мой ответ здесь для "filelogger"
Майкл Мартинес
4. Системный журнал - это не просто файловый поток, который я могу открыть и написать текст. Шунт, который я пишу, должен был бы открыть сокет к порту UDP, который слушает системный журнал?
Нумен
1
@Noumenon, я не совсем понимаю ваши намерения, но я предполагаю, что вы хотите направить вывод программы в системный журнал, что можно сделать с помощью команды logger. linux.die.net/man/1/logger
Эвери Пэйн,
@AveryPayne Так нравится Runtime.exec("logger ...") Хорошо, спасибо.
Нумен
0

Я отвечаю на свой вопрос.

Возможно, сработал 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» - это новая опция, которую я добавил. В этом случае я вставляю локальное имя хоста в начале каждой строки журнала.

Это решение было именно тем решением, которое я искал, когда задавал вопрос, и, как оказалось, не существовало, пока я не сделал это сам. :)

Майкл Мартинес
источник
Я, вероятно, сделаю это доступным на sourceforge в какой-то момент. Его преимущества заключаются в том, что он очень компактен, легок, прост в использовании и оптимизирован для производительности. После прочтения текста сообщения вся обработка выполняется в буфере памяти, а затем передается непосредственно в сокет.
Майкл Мартинес
1
xkcd.com/763
user9517
4
Я стараюсь не быть резким, но я имею собираюсь быть тупым: Это решение не было , потому что это ужасно. Вместо того, чтобы взаимодействовать с другими группами в вашей организации и внедрять нормальное стандартное решение, вы создали хакерский код с совершенно неподдерживаемым кодом, который вам теперь нужно тестировать / отлаживать / поддерживать в будущем. Вы легко проигнорировали более чем 50-летний опыт работы, в котором говорилось: «Не делай этого» - я надеюсь, что ради тебя это не взорвется, но ты абсолютно, несомненно, делаешь это неправильно
voretaq7
1
Да. правильно .... Вот как с открытым исходным кодом движется вперед, чувак. Если бы все делали это по-своему, прогресса не было бы. Как вы думаете, откуда появились GNU, Linux и все, что на них основано? Люди делают именно то, что я сделал здесь. Если вам от этого станет легче, я собираюсь внести свой код в нашу систему управления пакетами, где все сотрудники организации могут свободно использовать ее, развертывать и совершенствовать, если они того пожелают.
Майкл Мартинес
И к вашему сведению, это не ужасное решение. Наоборот, это очень полезный инструмент. Когда на прошлой неделе я искал решения в Интернете, я столкнулся с другими людьми, спрашивающими, где они могли бы найти именно эту функциональность.
Майкл Мартинес