3 votes

Calculer la plus grande différence de temps entre les messages log dans /var/log/messages

J'ai besoin de calculer la différence de temps entre deux messages du journal /var/log/messages. Comme nous savons que les messages de log sont préfixés par la date et l'heure, je veux calculer la différence de temps entre deux entrées de log.

1voto

Amy Anuszewski Points 1228

En bash, une fois que vous avez déterminé la date et l'heure que vous souhaitez utiliser, vous pouvez écrire

firsttime="Jun  1 02:00:13"
secondtime="Jun  1 03:00:46"
echo $(( $(date -d "$secondtime" +"%s") - $(date -d "$firsttime" +"%s") ))

Ce qui vous donnera le nombre de secondes entre ces deux temps. Si vous voulez automatiser la recherche de firsttime et secondtime, vous allez devoir nous dire ce que vous cherchez exactement dans le journal.

1voto

Je suppose que vous voulez trouver le plus grand écart de temps entre deux messages de journal consécutifs. Si c'est le cas, vous trouverez ci-dessous un script qui devrait faire l'affaire. J'ai écrit ce script il y a quelques années pour imprimer un intervalle de temps particulier à partir du fichier de messages, et il était assez facile à personnaliser :

#!/usr/bin/perl -W

use strict;
use Time::Local;

my %MONTHS = ( "Jan" => 0, "Feb" => 1, "Mar" => 2, "Apr" => 3, "May" => 4, "Jun" => 5,
               "Jul" => 6, "Aug" => 7, "Sep" => 8, "Oct" => 9, "Nov" => 10, "Dec" => 11 );

# Messages file doesn't include the year, so we need to assume that
# all messages are less than a year old and make some guesses

my $currenttime = time();
my $currentyear  = (localtime($currenttime))[5];
my $currentmonth = (localtime($currenttime))[4];

my $largestgap;
my $largestgapbefore;
my $largestgapafter;
my $lasttime;
my $lastmsg;

open(FILE, "</var/log/messages") || die "Unable to open messages file: $!\n";
while(<FILE>) {
    chomp;
    /^(...) (..) (..):(..):(..)/;
    my $year = $currentyear;
    if($MONTHS{$1} > $currentmonth) {$year -= 1; } 
    my $time = timelocal($5, $4, $3, $2, $MONTHS{$1}, $year);

    if(defined($lasttime)) {
        my $gap = $time - $lasttime;
        if(!defined($largestgap) || $gap > $largestgap) {
            $largestgap = $gap;
            $largestgapbefore = $lastmsg;
            $largestgapafter  = $_;
        }
    }
    $lasttime = $time;
    $lastmsg  = $_;
}
close(FILE);

if(!defined($lasttime)) {
    print "No entries in log file.\n";
    exit;
}

print "Largest gap was: " . $largestgap . " seconds.\n";

print "Entry before the gap: " . $largestgapbefore . "\n";
print " Entry after the gap: " . $largestgapafter . "\n";

1voto

user9517 Points 113163

J'ai choisi le premier et le dernier message de la rubrique /var/log/messages pour la démonstration, vous devrez la modifier pour obtenir vos propres heures de début et de fin.

#!/bin/bash

start=$(head -n 1 /var/log/messages | awk {'print $1, $2,$3'})
finish=$(tail -n 1 /var/log/messages | awk {'print $1, $2,$3'})

start_secs=$(date -d "$start" +"%s")
finish_secs=$(date -d  "$finish" +"%s")

let diff_secs=($finish_secs - $start_secs)

let days=$diff_secs/86400
let remainder=$diff_secs%86400
let hours=$remainder/3600
let remainder=$remainder%3600
let minutes=$remainder/60
let seconds=$remainder%60
echo "Days = $days, Hours = $hours, Minutes = $minutes, Seconds = $seconds"

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