Сбор ошибок за последние 24 часа из лог файлов nginx [закрыто]

Я пытаюсь написать скрипт для сбора логов за последние 24 часа из лог-файлов nginx. Мой скрипт собирает все логи из лог-файла, а мне нужны только ошибки за последние 24 часа.

Скрипт для сбора последних 24 часов nginx access.log и error.log

awk -vDate=`date -d'now-24 hours' +[%d/%b/%Y:%H:%M:%S` '$4 > Date {print Date, $0}' /var/log/nginx/access.log > /data/production_logs/nginxaccess.log
awk -vDate=`date -d'now-24 hours' +[%d/%b/%Y:%H:%M:%S` '$4 > Date {print Date, $0}' /var/log/nginx/error.log > /data/production_logs/nginxerror.log

2-й скрипт:

egrep 'Error|error|Exception|failed|Unhandled|err|Err' /data/production_logs/myapp.log > /data/production_logs/myapp_error.log

Пример скрипта ниже:

egrep 'Error|error|Exception|failed|Unhandled|err|Err' /var/log/nginx/error.log > /var/log/nginx/last24hourlogs.log

Для grep исключения ошибки выше из последних 24 часов журналов только и сохранить его в last24hourlogs.log

Формат журнала требуется:

2016/11/27 13:55:00 [error] 6822#0: *14569 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 223.182.171.4, server: myappserver
2016/12/03 12:51:26 [error] 6820#0: *19094 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 157.48.95.8, server:

tail -f /home/example.com/.forever/bdapp.log

2016/12/19 12:30:51 [error] 2147#0: *5647 open() "/usr/share/nginx/html/example.com/myapp_email-templates/social-01.png" failed (2: No such file or directory), client: 66.249.84.191, server: example.com, request: "GET /myapp_email-templates/social-01.png HTTP/1.1", host: "example.com"
2016/12/19 12:30:51 [error] 2147#0: *5646 open() "/usr/share/nginx/html/example.com/myapp_email-templates/social-02.png" failed (2: No such file or directory), client: 66.249.84.128, server: example.com, request: "GET /myapp_email-templates/social-02.png HTTP/1.1", host: "example.com"
1
задан 19 December 2016 в 17:28

1 ответ

Чтение файла журнала по x (прошлые) часы, поиск определенных строк

Важные примечания

  • Ответ ниже был записан, на основе примера OP, если, принимая выходной пример точная копия того, как строки происходят в файле журнала. Это важно для корректного парсинга дата; если или положение или формат метки времени будут отличаться, то это перестанет работать!
  • Из-за пропавших без вести информации о сортировке, сценарий не мог быть оптимизирован для производительности; все строки должны быть проверены с информацией, которую мы в настоящее время имеем.
  • Неясный также то, если файл журнала сообщает в UTC или местное время, и в том, во сколько отчет должен быть представлен. "прошлые 24 часа" возможно должны быть исправлены различием местного времени.

Сценарий

#!/usr/bin/env python3
import time
import calendar
import sys

#--- set conditions below 
matches = ['Error', 'error', 'Exception', 'failed', 'Unhandled', 'err', 'Err']
# ---

pattern = "%Y/%m/%d%H:%M:%S"

source = sys.argv[1]
report = sys.argv[2]
last_hrs = sys.argv[3]

# shift =  time.timezone
shift = 0
now = time.time()

def convert_toepoch(pattern, stamp):
    """
    function to convert readable format (any) into epocherror
    """
    return int(time.mktime(time.strptime(stamp, pattern)))

with open(source) as infile:
    with open(report, "wt") as outfile:
        for l in infile:
            try:
                # parse out the time stamp, convert to epoch
                stamp = "".join(l.split()[:2])
                tstamp = convert_toepoch(pattern, stamp)
                # set the conditions the line has to meet
                if now - tstamp - shift <= int(last_hrs)*3600:
                    if any([s in l for s in matches]):
                        outfile.write(l)
            except (IndexError, ValueError):
                pass

Как использовать

  1. Скопируйте сценарий в пустой файл, сохраните его как get_log.py
  2. Выполните его с исходным файлом, выходным файлом и время как аргументы:

    python3 /path/to/get_log.py <logfile> <ouput_file> 24
    

Как упомянуто, возможно время (24) потребности, которые будут зафиксированы локальным часовым поясом.Пожалуйста, дайте мне знать.

Что это делает

  • Сценарий ищет строки с меткой времени, показывая время в течение определенного периода времени (x-часы назад с этого времени), сравнивая время с эпохи. В случае соответствия это смотрит, находится ли какая-либо из условных строк в файле.
  • Если так, строка записана в отчет

Править

OP упомянула, что не работала. Тест на обоих примерах OP, отправленный по запросу однако, показывает, что сценарий делает задание отлично:

Почему это работает?

  • Пример Op - метка времени:

    2016/11/27 13:55:00
    

    преобразовывается в формат:

    "%Y/%m/%d%H:%M:%S"
    

    строкой:

    stamp = "".join(l.split()[:2])
    

    и впоследствии преобразованный в эпоху:

    tstamp = convert_toepoch(pattern, stamp)
    
  • Строка:

    if now - tstamp - shift <= int(last_hrs)*3600:
    

    выбирает строки, штампованные в last_hrs с этого времени.

  • Строка:

    if any([s in l for s in matches]):
    

    впоследствии взгляды, если любая из строк:

    ['Error', 'error', 'Exception', 'failed', 'Unhandled', 'err', 'Err']
    

    происходит в строке.

Как упомянуто, я протестировал его полностью с точными примерами OP, если, и не может прийти к другому заключению, чем которое сценарий делает свое задание.

2
ответ дан 7 December 2019 в 13:39

Другие вопросы по тегам:

Похожие вопросы: