Calcula a maior diferença de tempo entre a mensagem de log em / var / log / messages

3

Eu preciso calcular a diferença de tempo entre duas mensagens de log de / var / log / messages. Como sabemos, as mensagens de registro prefixadas por data & tempo, eu quero diferença de tempo entre duas entradas de log.

    
por vnix27 01.06.2011 / 13:05

3 respostas

1

Eu escolhi a primeira e a última mensagem em /var/log/messages para demonstrar, você terá que modificá-la para ter seus próprios horários de início e término

#!/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"
    
por 01.06.2011 / 13:52
1

No bash, depois de descobrir que data / hora você quer usar, você pode escrever

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

Que lhe dará o número de segundos entre essas duas vezes. Se você quiser automatizar a busca pela primeira vez e pela segunda vez, terá que nos dizer exatamente o que está procurando no registro.

    
por 01.06.2011 / 13:24
1

Suponho que você deseja encontrar o maior intervalo de tempo entre duas mensagens de log consecutivas. Se assim for, veja abaixo um script que deve fazer o truque. Escrevi este script há alguns anos para imprimir um intervalo de tempo específico a partir do arquivo de mensagens, e foi muito fácil personalizar:

#!/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";
    
por 01.06.2011 / 13:49

Tags