не могу получить запись Python, используя apache2 CustomLog для правильной работы - PullRequest
1 голос
/ 25 февраля 2011

Я пытаюсь использовать директиву apache CustomLog для передачи строк журнала в скрипт python (который должен входить в бэкэнд django). Я использую следующую строку customlog на виртуальном хосте:

CustomLog "|/usr/bin/python -u /home/rolf/feedmemore/myproject/logger.py > /tmp/out.txt 2> /tmp/err.txt" combined

Это основной цикл в logger.py:

.
c = sys.stdin.read(1)
line = ""
while True:

    if c:
        line += c
        if ord(c) == 4:
            break
    else:
        sys.stderr.write("huh?\n")

    if c == '\n':
        print line
        logline(line.rstrip('\n'))
        line = ""

    c = sys.stdin.read(1)

Сначала я полагал, что если я получу "" от apache с read (1), то программа должна завершиться. Однако apache продолжает выдавать «» независимо от активности сервера. /tmp/err.txt быстро заполняется словами "а?" Что с этим?

Как моя программа регистрации должна знать, когда ввод завершен и должен завершиться? Я пытался проверить 0x4 (EOT), но это не сработало.

Моя первая попытка была с использованием "readline ()", но это не удалось.

Любые другие предложения о том, как централизованно регистрировать запросы в django, также будут полезны.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2011

У меня это работает.Apache закрывает stdin, когда он останавливается, так что вы можете просто подождать, пока sys.stdin.closed в главном цикле будет True и игнорировать пустые строки.

Странно, но apache порождает дополнительный процесс регистрации зомби.Поскольку ppid для зомби равен 1, код просто завершается, если он обнаруживает, что ppid равен 1.

Это работает для меня:

if os.getppid() == 1:
    sys.exit()
c = sys.stdin.read(1)
line = ""
while not sys.stdin.closed:
    if c:
        line += c

    if c == '\n':
        print line,
        logline(line.rstrip('\n'))
        line = ""

    c = sys.stdin.read(1)
0 голосов
/ 25 февраля 2011

Просто сосредоточив внимание на вашей последней строке сообщения.Вы, вероятно, не хотите запускать скрипт Python для каждого запроса.Вы бросаете в ~ 20 МБ программу, чтобы прочитать одну строку текста.

Читайте о современных системных журналах, таких как syslog-ng.Вы платите слишком много за что-то очень простое.

http://www.balabit.com/sites/default/files/documents/syslog-ng-admin-guide_en.html/configuring_destinations_tcpudp.html

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