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!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
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:
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
To pokaż fragment tego loga, w którym nie możesz złapać jakiejś godziny.
Offline
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
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:
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
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:
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:
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:
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
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
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
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
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:
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
Hello dzieki za odpowiedzi! ;)
Rozwiazanie z pobieraniem ostatniej lini na ktorej skonczylem wydaje sie najlepsze i dziala prawidlowo..
Takze dzieki djjanek!
Pozdr!
Offline
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 |