Fórum Root.cz
Hlavní témata => Server => Téma založeno: meo 02. 08. 2017, 11:17:54
-
Ahojte,
poradili by ste mi ako by som z jedneho logu ktorý vypada takto: "Wed Aug 2 10:29:45 CEST 2017 INFO:" vypísal všetky logy napr za posledný týždeň?
-
Je to vas locale?
`date +%c` sa podoba? Ak to nie je moc velky file asi by som si vypisal do premennej poslednych 7 datumov v tomto formate a grepol to
-
journalctl --since (--until)
-
Co ak to nie je systemovy log, ale file z nejakej app?
Popravde ak to nepotrebujete automatizovat na velkej urovni tak
grep -e "Aug [1-2]" -e "Jul 2[8-9]" -e "Jul 3[0-1]" file.log
-
Můžeš zkusit parsovámí v Pythonu:
https://stackoverflow.com/questions/466345/converting-string-into-datetime (https://stackoverflow.com/questions/466345/converting-string-into-datetime)
https://stackoverflow.com/questions/1345827/how-do-i-find-the-time-difference-between-two-datetime-objects-in-python (https://stackoverflow.com/questions/1345827/how-do-i-find-the-time-difference-between-two-datetime-objects-in-python)
-
#!/bin/bash
for d in `seq 7 -1 0`
do
pttn=$(date -d "$d days ago" +'%a[ ]*%b[ ]*%e[ 0-9:]*%Z[ ]*%Y')
grep "$pttn" log
done
-
Ďakujem veľmi pekne :)
-
Nebo třeba...
#!/bin/bash
AGE=$2
CUR=$(date +%s)
MAGE=$(($CUR-(AGE*24*3600)))
cat $1 | while read line; do
LTIME=$( date --date "$(echo $line | cut -d' ' -f1-6)" +%s )
if [ $LTIME -ge $MAGE ]; then
echo -e "$line"
fi
done
použití
skript.sh nazev_logu pocet_dni
skript.sh log.log 10
-
Nebo třeba...
#!/bin/bash
AGE=$2
CUR=$(date +%s)
MAGE=$(($CUR-(AGE*24*3600)))
cat $1 | while read line; do
LTIME=$( date --date "$(echo $line | cut -d' ' -f1-6)" +%s )
if [ $LTIME -ge $MAGE ]; then
echo -e "$line"
fi
done
použití
skript.sh nazev_logu pocet_dni
skript.sh log.log 10
tohle bude zoufale pomalé, pro větší logy nepoužitelné.
-
#!/bin/bash
for d in `seq 7 -1 0`
do
pttn=$(date -d "$d days ago" +'%a[ ]*%b[ ]*%e[ 0-9:]*%Z[ ]*%Y')
grep "$pttn" log
done
tohle je dobré
-
Nebo třeba...
#!/bin/bash
AGE=$2
CUR=$(date +%s)
MAGE=$(($CUR-(AGE*24*3600)))
cat $1 | while read line; do
LTIME=$( date --date "$(echo $line | cut -d' ' -f1-6)" +%s )
if [ $LTIME -ge $MAGE ]; then
echo -e "$line"
fi
done
použití
skript.sh nazev_logu pocet_dni
skript.sh log.log 10
tohle bude zoufale pomalé, pro větší logy nepoužitelné.
To jo, na velký logy blbý, ale obecně dobře upravitelný :D
-
Můžeš zkusit parsovámí v Pythonu:
https://stackoverflow.com/questions/466345/converting-string-into-datetime (https://stackoverflow.com/questions/466345/converting-string-into-datetime)
https://stackoverflow.com/questions/1345827/how-do-i-find-the-time-difference-between-two-datetime-objects-in-python (https://stackoverflow.com/questions/1345827/how-do-i-find-the-time-difference-between-two-datetime-objects-in-python)
funkce dateutil.parser.parse je celkem inteligentní. Stačí parse(line, fuzzy=True).date() a nemusí se specifikovat formát ani splitovat řádka.
-
To jo, na velký logy blbý, ale obecně dobře upravitelný :D
ono je toblbé už na docela malé logy. Kdybyste tu smyčku přepsal do nějakého skriptovacího jazyka, nebude to delší ani hůře upravitelné a zrychlí se to mnohanásobně.
-
ono je toblbé už na docela malé logy. Kdybyste tu smyčku přepsal do nějakého skriptovacího jazyka, nebude to delší ani hůře upravitelné a zrychlí se to mnohanásobně.
Tak aby řeč nestála...
#!/usr/bin/python3
import sys
import time
import datetime
fromtime=time.time()-(int(sys.argv[2])*24*3600)
with open(sys.argv[1], 'rU') as f:
for line in f:
ldate = (line[0:29])
secs=datetime.datetime.strptime(ldate, "%a %b %d %H:%M:%S %Z %Y").timestamp()
if secs > fromtime:
print(line,end="")
Nicméně pro velký logy je stejně nejefektivnější dohledat první vyhovující řádek a pak vypsat zbytek - třeba zkusit půlku souboru, větší/menší, půlku z půlky... v pár iteracích to najdeme a pak je to šup šup