1 votes

Collecter les erreurs des dernières 24 heures dans les fichiers journaux de nginx

J'essaie d'écrire un script pour collecter les logs des dernières 24 heures à partir des fichiers logs de nginx. Mon script collecte tous les logs du fichier de log et je n'ai besoin que des erreurs des dernières 24 heures.

script pour collecter les dernières 24 heures nginx access.log y 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ème script :

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

Exemple de script comme ci-dessous :

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

Pour rechercher l'exception d'erreur ci-dessus dans les journaux des dernières 24 heures uniquement et l'enregistrer sous le nom de last24hourlogs.log

Format du journal requis :

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"

2voto

Jacob Vlijm Points 78990

Lecture d'un fichier journal sur x (dernières) heures, à la recherche de lignes spécifiques

Remarques importantes

  • La réponse ci-dessous a été rédigée sur la base de l'exemple fourni par OP, en supposant que l'exemple de sortie est une copie exacte de la façon dont les lignes apparaissent dans le fichier journal. Ceci est essentiel pour l'analyse correcte de la date ; si l'un ou l'autre des éléments suivants est présent dans le fichier de sortie, il est possible d'obtenir la date de sortie. position ou le format si l'horodatage est différent, il échouera !
  • En raison d'informations de tri manquantes, le script n'a pas pu être optimisé en termes de performances ; toutes les lignes doivent être vérifiées, avec les informations dont nous disposons actuellement.
  • Il n'est pas clair non plus si le fichier journal indique l'heure UTC ou l'heure locale, et le délai dans lequel le rapport doit être produit. L'expression "dernières 24 heures" doit éventuellement être corrigée en fonction du décalage horaire local.

Le script

#!/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

Comment l'utiliser

  1. Copiez le script dans un fichier vide, enregistrez-le sous le nom de get_log.py
  2. Exécutez-le avec le fichier source, le fichier de sortie et le temps comme arguments :

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

Comme nous l'avons mentionné, il est possible que l'heure ( 24 ) doit être corrigé en fonction du fuseau horaire local. Veuillez m'en informer.

Ce qu'il fait

  • Le script recherche les lignes avec un horodatage, montrant un temps dans la période définie (x heures à partir de maintenant), comparant le temps à partir de l'époque. En cas de correspondance, il vérifie si l'une des chaînes conditionnelles se trouve dans le fichier.
  • Si c'est le cas, la ligne est écrite dans le rapport

EDITAR

L'OP a indiqué que cela n'avait pas fonctionné. Un test sur les deux exemples postés par l'OP sur demande montre cependant que le script fait parfaitement l'affaire :

Pourquoi cela fonctionne-t-il ?

  • Exemple de l'opérateur - horodatage :

    2016/11/27 13:55:00

    est converti dans le format :

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

    par la ligne :

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

    et ensuite converti en époque :

    tstamp = convert_toepoch(pattern, stamp)
  • La ligne :

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

    sélectionne des lignes, estampillées à l'intérieur last_hrs à partir de maintenant.

  • La ligne :

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

    regarde ensuite si l'une ou l'autre des chaînes :

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

    se produit dans la ligne.

Comme je l'ai dit, je l'ai testé de manière approfondie avec le exactes exemples fournis par le PO, et ne peut arriver à une autre conclusion que le fait que le script fait son travail.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X