LINUX.ORG.RU

rsyslogd в centos7 и perl

 , ,


1

1

Приветствую! Наткнулся на некую «особенность» то ли перла, то ли centos7, а то ли и rsyslog.

Дано:

  • Centos7 (Linux test 3.10.0-123.9.3.el7.x86_64 #1 SMP Thu Nov 6 15:06:03 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux)
  • Perl (This is perl 5, version 16, subversion 3 (v5.16.3) built for x86_64-linux-thread-multi)
  • rsyslog (rsyslogd 7.4.7)

Хочу:

  • Просто повешать некий перловый скрипт в бесконечный цикл и передавать ему логи из rsyslog

Что сделано:

  • Дефолтно настроено всё (Система «из коробки»), своими кривыми руками не успел никуда ещё залезть.
  • В конфиг rsyslog добавлено:
    $ModLoad omprog           # Enables filter programs to futher analyze logs
    $ActionOMProgBinary                            /test.pl
    *.* :omprog:;RSYSLOG_TraditionalFileFormat
  • И написан, собсно, сам test.pl
    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    open (LOG , ">> /tmp/test") or die ("Can't open file :: $!\n");
    
    while (<>) { print LOG $_; }
    

Результат:

  • Запускается всё без ошибок, скрипт успешно демонизируется, но всё, что он пишет в /tmp/test это одну строку при рестарте rsyslog:
    Feb 24 14:50:16 test rsyslogd: [origin software="rsyslogd" swVersion="7.4.7" x-pid="19880" x-info="http://www.rsyslog.com"] exiting on signal 15.

Что предпринято в связи с этим до обращения на форум:

  • Я написал «скрипт» на bash
    #!/bin/bash
    
    while read LINE; do
        echo $LINE >> /tmp/testoutput
    done

    и, о чудо (!), он пишет в файл абсолютно всё, что пишет rsyslog в логи.

Вопрос:

  • Как это объяснить?
  • Как заставить perl так же писать _всё_ в файл, что пишет rsyslog в логи?

Если это глупый вопрос - извиняюсь, я не очень сильный программист :) Заранее спасибо!



Последнее исправление: Grotesque (всего исправлений: 2)

print() буферизирует вывод, поэтому прежде чем попасть в файл оно будет писаться в память пока не заполнится отведенный буфер. Возможные пути решения:
1. Отключаем буфер для этого хэндела: LOG->autoflush(1)
2. Используем функцию, которая не буферизирует: syswrite(LOG, $_)

Olegymous ★★★
()

rsyslogd: [...] exiting on signal 15.

У тебя rsyslogd завершается почему-то, вот скрипт логи и не шлет в файл.

Kiborg ★★★
()
Ответ на: комментарий от Kiborg

... но всё, что он пишет в /tmp/test это одну строку при рестарте rsyslog (c)

То есть это я его руками перезапускаю.

Grotesque
() автор топика
Ответ на: комментарий от Olegymous

Вы мой спаситель! Финт с syswrite сработал, autoflush ещё не пробовал, но думаю тоже вкатит.

Премного благодарен!

Grotesque
() автор топика
Ответ на: комментарий от uspen

Я могу ошибаться, но по-моему очень-очень давно тут не было кнопки «Пометить как решённую» и была такая шутка с РЕШЕТОМ =)

Grotesque
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.