Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2012-11-13 01:50:05

  Grzeslaw - Użytkownik

Grzeslaw
Użytkownik
Zarejestrowany: 2008-02-12

Grepowanie dat

Witam,

Problem niby blachy, a rozwiązanie cholernie ciężkie ;)

Mam error logi aplikacji, która loguje tylko jak są błędy warningi i inne. Data jest normalna date +%H%M
Jednak problem w tym, ze co minute nie mam warningow etc.. Logi sa np z 13:12 13:30 13:33 etc..

Pisze skrypt do nagiosa, który sprawdza czy w ostatniej godzinie wystąpiły jakieś błędy..
Z logu wyłuskuje treści co było w ostatniej godzinie, poprzez:

Kod:

CUR_HOUR="`date +%H:%M`"
LAST_HOUR="`date +%H:%M -d "1 hour ago"`"
sed -n "/${LAST_HOUR}:/,/${CUR_HOUR}:/p" ${LOGFILE} |grep WARN

No i problem zaczyna się kiedy jest np 14:20, a nie ma żadnego wpisu o godzinie 13:20. A jest np wpis o 13:23 ale tego już nie złapie..

Jak sobie poradzić z takim problemem? Logi są dość duże wiec za dużo grepowac nie można i kombinować z funkcjami..
No ale liczę na propozycje mądrzejszych kolegów ;)


Pozdrawiam Pingwinow ;)

Offline

 

#2  2012-11-13 08:39:04

  prosze - Użytkownik

prosze
Użytkownik
Zarejestrowany: 2012-09-25

Re: Grepowanie dat

To pokaż fragment tego loga, w którym nie możesz złapać jakiejś godziny.

Offline

 

#3  2012-11-13 09:07:07

  djjanek - Użytkownik

djjanek
Użytkownik
Skąd: whereis
Zarejestrowany: 2007-11-15
Serwis

Re: Grepowanie dat

Ja robię coś takiego:

1) mam mały plik z numerem linii na której skończyłem
2) Pobieram sobie ten numer linii na którym skończyłem, jak nie ma tej zmiennej ustawiam na 0
3) Pobieram wszystko do końca od numeru linii na której skończyłem +1 #chyba wiadomo dlaczego +1
4) zapisuje nowy numer linii na której skończyłem
5) przetwarzam małą ilość danych

Offline

 

#4  2012-11-13 20:59:58

  Grzeslaw - Użytkownik

Grzeslaw
Użytkownik
Zarejestrowany: 2008-02-12

Re: Grepowanie dat

djjanek: dzieki, wlasnie tak przerobilem skrypt i wyglada dzialac prawidlowo..
Jutro jade w trase, takze w przyszlym tygodniu dam znac jak wyniki..

prosze: ponizej przykladowe logi:

Kod:

INFO   | jvm 1    | main    | 2012/10/18 11:45:38.657 | ERROR [TBUashiVaryJpg298x298ResizeCrop::de.corp.platform.mam.celum.cronjobs.FilePicturesIntegrationJob] [10.130.100.232] (TBUashiVaryJpg298x298ResizeCrop) [CelumDownloadServiceImpl] File /usr/corp/data25/media2/sys_master/celum_assets/8801372536862_up_500x500_uniroyal_touringcclaredo_bw_8186_jpg.jpg has size 0 bytes and will be removed quietly. Is Celum server alive?
INFO   | jvm 1    | main    | 2012/10/18 11:45:38.657 | WARN  [TBUashiVaryJpg298x298ResizeCrop::de.corp.platform.mam.celum.cronjobs.FilePicturesIntegrationJob] [10.130.100.232] (TBUashiVaryJpg298x298ResizeCrop) [CelumAsset] Cannot download asset! (Reason: {ERRORCODE=666, ERRORTEXT=Internal server error! Please contact your administrator.})
INFO   | jvm 1    | main    | 2012/10/18 12:32:44.810 | ERROR [00001O6S::com.uashibuyer.corp.catalog.sync.UashiBuyerUSCatalogVersionSyncJob] [10.130.100.232] (00001O6S) [FlexibleSearch] Flexiblesearch error: could not translate value expression 'session.catalogversions'
INFO   | jvm 1    | main    | 2012/10/18 12:32:44.810 | ERROR [00001O6S::com.uashibuyer.corp.catalog.sync.UashiBuyerUSCatalogVersionSyncJob] [10.130.100.232] (00001O6S) [FlexibleSearch] query was 'SELECT {pk} FROM {CatalogVersionSyncScheduleMedia} WHERE {cronjob}=?key ORDER BY {cronjobPOS} ASC,{creationtime} ASC '
INFO   | jvm 1    | main    | 2012/10/18 12:32:44.810 | ERROR [00001O6S::com.uashibuyer.corp.catalog.sync.UashiBuyerUSCatalogVersionSyncJob] [10.130.100.232] (00001O6S) [FlexibleSearch] translated query was: SELECT  item_t0.PK  FROM medias item_t0 WHERE ( item_t0.p_cronjob =?) AND (item_t0.TypePkString=? AND ( item_t0.p_catalogversion  IN ( ? ) OR   item_t0.p_catalogversion  IS NULL)) ORDER BY  item_t0.p_cronjobpos  ASC, item_t0.createdTS  ASC

BTW: Jeśli ktoś ma jeszcze jakieś koncepcje to zachęcam do prezentacji ;)

Pozdrawiam!

Offline

 

#5  2012-11-14 14:49:34

  prosze - Użytkownik

prosze
Użytkownik
Zarejestrowany: 2012-09-25

Re: Grepowanie dat

Jeżeli chcesz wydrukować linie, które pojawiły się nie później niż 60 minut temu od czasu, w którym sprawdzasz plik to należy:

1. Zainstalować rozszerzoną wersję awk, czyli gawk, która ułatwi nam sprawę.
2. Datę łącznie z godziną, minutą i sekundą przeliczyć na liczbę sekund jakie upłynęły od początku epoki Uniksa.
3. Przeanalizować ten przykład, który pomoże zrozumieć jak to działa.

Załóżmy, że mamy plik, który zawiera datę (rok, miesiąc, dzień, godzinę, minutę i sekundę) w takim formacie:

Kod:

2012 11 14 12 03 00
2012 11 14 13 03 00
2012 11 14 13 13 00
2012 11 14 13 23 00
2012 11 14 13 40 00
2012 11 14 11 03 00
2012 11 14 10 03 00
2012 11 14 09 03 00
2012 11 14 13 26 00
2012 11 14 13 03 00

Chcemy z tego pliku wydrukować linie, które pojawiły się nie później niż 60 minut temu licząc od czasu sprawdzania. Wiadomo, że w zależności o której godzinie będziemy sprawdzać zawartość pliku to dostaniemy różny wynik. Sprawdzenie zawartości pliku o godzinie „14:05:52” wydrukuje:

Kod:

gawk '{ if( (systime() - mktime($0) ) <= 3600) print $0, " sprawdzamy o godznie: "strftime("%H:%M:%S")}' plik
2012 11 14 13 13 00  sprawdzamy o godznie: 14:05:52
2012 11 14 13 23 00  sprawdzamy o godznie: 14:05:52
2012 11 14 13 40 00  sprawdzamy o godznie: 14:05:52
2012 11 14 13 26 00  sprawdzamy o godznie: 14:05:52

W związku z powyższym dla Twojego pliku wzorcowego polecenie, które wydrukuje odpowiednie linie będzie takie:

Kod:

gawk -F "[ /:.]" '{i=" "; if( (systime() - mktime( $16 i $17 i $18 i $19 i $20 i $21 ) ) <= 3600) print }' plik

Polecenie należy umieścić w pętli.

Ostatnio edytowany przez prosze (2012-11-14 16:44:01)

Offline

 

#6  2012-11-14 15:19:56

  djjanek - Użytkownik

djjanek
Użytkownik
Skąd: whereis
Zarejestrowany: 2007-11-15
Serwis

Re: Grepowanie dat

rozwiązanie takie ma jedno wadę zawsze analizujesz wpisy już przetworzone. Jeśli masz mało wpisów to wszytsko ok, jak jednak masz liczoną w tysiącach linii to można zastosować mój sposób, lub jeszcze wczesniej myślałem o analizie x ostatnich linii, jednak ile te x ma wynosic 100, 10, 200...

Offline

 

#7  2012-11-14 16:39:51

  prosze - Użytkownik

prosze
Użytkownik
Zarejestrowany: 2012-09-25

Re: Grepowanie dat

Dlaczego mówisz, że zawsze analizujesz linie już przetworzone?  Przecież linie, które pojawiły się później niż jedną godzine do tyłu nie będą wyświetlane. Wszystko zależy od tego, jak często wykonywana jest pętla. Faktycznie pętla, która wykonuje się kilka razy w ciągu 60 minut, będzie powtarzać wyniki. Jednak częstotliwość pętli i zakres drukowanych linii na podstawie czasu można dowolnie zmieniać. 

Rozwiązanie to jest podobne do Twojego pomysłu z analizą x linii. Tylko że w tym przypadku nie ustawiasz wydruku x linii, ale przedział czasowy.

Ostatnio edytowany przez prosze (2012-11-14 16:41:36)

Offline

 

#8  2012-11-14 16:52:13

  djjanek - Użytkownik

djjanek
Użytkownik
Skąd: whereis
Zarejestrowany: 2007-11-15
Serwis

Re: Grepowanie dat

Najpierw musisz zamienić format daty na sekundy, czyli analizujesz cały plik, potem nastepuje przeszukanie, zgadza sie czy cos przeoczyłem?

W moim przypadku obcinasz plik od razu do odpowiedniej ilości linii i wtedy go analizujesz.

Wycinanie x ostatnich lini pisałem że jest nieoptymalne bo nie wiesz ile tych lini powinieneś wyciąć.

Offline

 

#9  2012-11-14 17:31:39

  prosze - Użytkownik

prosze
Użytkownik
Zarejestrowany: 2012-09-25

Re: Grepowanie dat

Dokładnie tak jest jak napisałeś. Autor chciał, ja „wykonał” :) Nic nie stoi na przeszkodzie, aby te dwa sposoby połączyć.

EDIT:
Jeżeli nie chcesz instalować gawk, to tym poleceniem zrobisz to samo,  ale na awk:

Kod:

awk -F "[ .]" '{ " date -d \" "$16" "$17" \" +%s " | getline a; " date \"+%s\" " | getline b; if( (b - a) <= 3600 ) print }' plik

Ostatnio edytowany przez prosze (2012-11-15 12:15:04)

Offline

 

#10  2012-12-07 18:07:44

  Grzeslaw - Użytkownik

Grzeslaw
Użytkownik
Zarejestrowany: 2008-02-12

Re: Grepowanie dat

Hello dzieki za odpowiedzi! ;)
Rozwiazanie z pobieraniem ostatniej lini na ktorej skonczylem wydaje sie najlepsze i dziala prawidlowo..
Takze dzieki djjanek!

Pozdr!

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Nas ludzie lubią po prostu, a nie klikając w przyciski ;-)

[ Generated in 0.008 seconds, 9 queries executed ]

Informacje debugowania

Time (s) Query
0.00009 SET CHARSET latin2
0.00004 SET NAMES latin2
0.00120 SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='18.117.94.77' WHERE u.id=1
0.00062 REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '18.117.94.77', 1732218696)
0.00042 SELECT * FROM punbb_online WHERE logged<1732218396
0.00075 SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=22291 AND t.moved_to IS NULL
0.00005 SELECT search_for, replace_with FROM punbb_censoring
0.00216 SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=22291 ORDER BY p.id LIMIT 0,25
0.00091 UPDATE punbb_topics SET num_views=num_views+1 WHERE id=22291
Total query time: 0.00624 s