Я управляю apt-cacher-ng
сервер в Ubuntu Linux, который ведет журналы в следующем формате:
1299745593|O|149406|XXX.XXX.XXX.XXX|uburep/pool/main/t/tiff/libtiff4_3.9.2-2ubuntu0.4_amd64.deb
1299745593|O|10154976|XXX.XXX.XXX.XXX|uburep/pool/main/l/linux-firmware/linux-firmware_1.34.4_all.deb
1299748529|O|39368|XXX.XXX.XXX.XXX|uburep/pool/main/n/nagios-nrpe/nagios-nrpe-server_2.12-4ubuntu1_amd64.deb
1300155440|O|680100|XXX.XXX.XXX.XXX|uburep/pool/main/t/tzdata/tzdata_2011c-0ubuntu0.10.04_all.deb
Он показывает метку времени, направление (вход или выход), количество байтов, IP и имя файла.
Каждый раз, когда в него записывается строка, я хотел бы также отправить эту строку в другую программу. Я попрошу эту программу вставить строку в базу данных, чтобы я мог обработать некоторую статистику о том, сколько полосы пропускания мы экономим за счет работы кэширующего сервера.
я не хочу cat
файл журнала каждые X минут (через cron
) ищет новые записи, поскольку это было бы неэкономично с точки зрения вычислений. Вместо этого я бы предпочел, чтобы за журналом следил демон, и при обнаружении изменения каждая строка отправляется в мой скрипт вставки базы данных.
Будет swatch
добиться этого или есть варианты получше?
В зависимости от того, какой daemon-y вы хотите получить, вам может сойти с рук что-то вроде:
tail -f $FILE | xargs -n 1 frobwidget.sh
Если журналы отправляются через системный журнал, вы можете добавить правило системного журнала, чтобы отправлять их уже в другое место. Как вы это сделаете, будет зависеть от того, какой вид системного журнала вы используете (ksyslogd, syslog-ng, rsyslog и т. Д.).
В противном случае образец выглядит как хорошее решение проблемы.
Вероятно, единственный другой способ, который я мог бы придумать, чтобы сделать это без изворотливого взлома слишком плохо, - это написать свой скрипт, чтобы открыть именованный канал вместо местоположения файлов журнала - и записать журналы в БД и в другое место на диске, но для этого потребуется, чтобы именованный канал был на месте до запуска демона apt-cacher-ng.
Вы смотрели на использование syslog-ng для входа в mysql? Использование адресата канала в syslog-ng очень похоже на то, что вы пытаетесь сделать.