Logger-lista wymogów

Odpowiedz Nowy wątek
2011-07-25 20:24
0

Heja

Z nudów postanowiłem napisać sobie logera przy użyciu qt,chciałem tylko się upewnić,że nie zapomnę o żadnym ficzerze.Zapodam najpierw co sam uważam za potrzebne:
1.Pisanie logów do okna oraz do pliku-można ustawić czy się chce tylko okno/tylko do pliku,czy tu i tu
2.Kolor tekstu w zależności od typu komunikatu,np errory na czerwono,warningi niebiesko,debugi na zielono
3.Okno z logami powinno się dać zrobić jako "above all"

O czym zapomniałem?


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]

Pozostało 580 znaków

2011-07-25 20:36
1

-wybór formatu pliku np. zwykły tekstowy, csv, xml
-wybór poziomu logowania z możliwością włączenia w danej chwili logowania tylko z danego poziomu tzn. funkcja logująca nie robi nic jeżeli nie jest wybrany dany poziom (coś jak logger z javy)


Dzięki,na pewno te uwagi się przydadzą - MasterBLB 2011-07-26 01:08

Pozostało 580 znaków

2011-08-22 14:25
0

Część zrobiona,loguje do okna,do .txt w postaci:
22-08-2011 13:54:01 | DEBUG | .\main.cpp | 16 | 4 | default
22-08-2011 13:54:01 | DEBUG | .\main.cpp | 18 | 4 | Always on top? true
22-08-2011 13:54:01 | DEBUG | .\main.cpp | 20 | 4 | Always on top? false
22-08-2011 13:56:14 | WARNING | .\main.cpp | 20 | 4 | Added warning log
22-08-2011 13:56:15 | ERROR | .\main.cpp | 24 | 4 | Added error log
te liczby to linia w pliku i poziom logowania (0-4)

Co do .csv,to ja nie widzę użyteczności tego,może ktoś mnie uświadomi?
A co poradzilibyście apropos .xmla?Ja osobiście myślę o takim czymś

<log>
<debug>
<datetime>22-08-2011 13:54:01</datetime>
<filename>main.cpp</filename>
<fileline>16</fileline>
<loglevel>4</loglevel>
<message>some message</message>
</debug>
.....
</log>

"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
csv'kę łatwo zaimportować do excela, accessa - Rev 2011-08-22 14:26
Mhm...oki,czuję się przekonany,tym bardziej że zrobić takie coś nie jest rzeczą trudną.Dzięki Rev - MasterBLB 2011-08-22 14:48
Uo....testowego .csva odworzył mi z automatu w excelu ładnie wrzucając dane do komórek.Ten ficzer faktycznie jest o wiele ciekawszy niż sądziłem z początku ;D - MasterBLB 2011-08-22 14:51

Pozostało 580 znaków

2011-08-22 14:27
Kumashiro
0
  • Autorotacja po rozmiarze lub czasie z zachowaniem wybranej liczby archiwalnych plików i ewentualną ich kompresją.
Hmmm...opisz proszę dokładniej,co masz na myśli - MasterBLB 2011-08-22 14:48
Ograniczasz rozmiar pliku/ilość wpisów w pliku, ograniczasz ilość plików. W momencie przekroczenia maksymalnej ilości wpisów(ilość wpisów na plik * max plików) usuwasz najstarszy plik - byku_guzio 2011-08-22 16:36

Pozostało 580 znaków

2011-08-22 22:25
Kumashiro
1

Sorry, że odpowiadam tu, a nie w komentarzach, ale chcę dać przykład.
Co to jest autorotacja i jak to działa. Byku_guzio już opisał po krótce w komentarzu, ja tylko uściślę.
Kiedy plik logu przekroczy określony rozmiar, lub nastąpi określona godzina, zmieniasz jego nazwę doklejając ".1", po czym tworzysz i otwierasz nowy plik. Jeśli plik o nazwie zakończonej na ".1" już istnieje, zmieniasz suffiks tego istniejącego na ".2", itd. Użytkownik może określić czy rotacja następuje po wielkości pliku (np. jeśli przekroczy 10MB), czy codziennie o określonej godzinie (np. o północy). Dodatkowo może określić ile plików z suffiksami może być utworzonych (np. 10; nadmiarowe mają być usuwane).
Przykład: rozmiar pliku "server.log" przekroczył 10MB, w katalogu są już pliki archiwalne "server.log.1" oraz "server.log.2". Zmieniasz nazwy: "server.log.2"->"server.log.3", "server.log.1"->"server.log.2", zamykasz plik logu i zmieniasz jego nazwę na "server.log.1", tworzysz nowy plik "server.log" i otwierasz go do zapisu. Jeśli plików archiwalnych jest już 10, usuwasz najpierw plik "server.log.10".
Przy wykonywaniu rotacji (zmiany nazwy "server.log" na "server.log.1") możesz skompresować plik archiwalny, ale lepiej robić to w oddzielnym wątku.

Na serwerach za to odpowiada program logrotate, więc możesz podejrzeć jak on to robi. Niestety, nie zawsze userzy mogą dodać swoje pliki logów do rotowania przez proces systemowy, więc logger który rotuje i troszczy się o archiwizację jest niesamowicie przydatny. W Pythonie jest od tego odpowiednia klasa, w C musiałem sobie sam takowy wyklepać dla loggera w GObject, bo standardowy tylko pluje do pliku i nie wnika co dalej.

Pozostało 580 znaków

2011-08-22 22:53
0

Okay,skoro mówcie iż ta autorotacja jest takim użytecznym ficzerem to ją zapodam.Jedynie co do tego zmieniania nazw wszystkich plików mam zastrzeżenia,ja wolę zrobić to tak:
1.Każę logerowi logować do pliku log.txt
2.Po spełnieniu wymogów limitu log.txt jest zamykany a tworzony jest nowy plik log2.txt i teraz logi lecą do niego
3.itd,itp

Podsumujmy jeszcze tylko,wg jakich kryteriów ma się plik logu wypełniać i być zamykany
-czasowe,tj o okreśonej godzinie
-ilością wpisów(wierszy) w pliku
-rozmiarowo,czyli jak plik logu osiągnie zadany rozmiar
-jakieś jeszcze?

A,powiedzcie koledzy czy widzicie potrzebę logowania warningów,debugów i errorów do oddzielnych plików?


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
edytowany 1x, ostatnio: MasterBLB, 2011-08-22 23:04

Pozostało 580 znaków

2011-08-22 23:02
0

Co do tego, lepiej zmieniać nazwy wszystkich plików, im nowszy plik tym mniejszy indeks - wyżej na listach plików. Operacja taka będzie rzadko wykonywana, więc czasem czegoś takiego nie ma się co przejmować.

Z tym logowaniem do oddzielnego pliku raczej nie widzę sensu. Ale za to fajnie by było, gdyby można definiować poziomy logowania. Np. standardowo ERROR, WARRNING, INFO i do tego możliwość dodania własnego(np. OKRUTNY_ERROR) i ustawienie mu "ważności"


Pozostało 580 znaków

2011-08-22 23:26
0

Na chwilę obecną są poziomy 0-4,przy czym domyślny jest 4,oraz typy debug,warning itd.Działają głównie w trybie logowania okienkowego(patrz obrazek) powodując filtrację danych z tabeli.
Niestety,takie coś w trybie konsolowym czy plikowym za bardzo sensu nie ma,stąd póki co do pliku wpada wszystko jak leci.

Hmmm...można by zrobić to tak,że loger miałby funkcję w stylu setLoggingLevel(int maxlevel) która by w trybie okienkowym nastawiała odpowiednio te guziki filtrów,a w trybie plikowym/konsolowym powodowała,że jedynie logi z przedziału <0,maxLevel> były zapisywane


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
Możliwość ustawienia poziomu logowania jest wręcz konieczne - byku_guzio 2011-08-23 02:51
Oki,zrobię tak jak piszę-w trybie graficznym wszystko+filtrowanie guzikami,a w trybie plikowym/konsolowym będzie fizyczne wycinanie nadmiarowych logów - MasterBLB 2011-08-23 02:54

Pozostało 580 znaków

2011-08-22 23:31
Kumashiro
2
MasterBLB napisał(a)

Okay,skoro mówcie iż ta autorotacja jest takim użytecznym ficzerem to ją zapodam.Jedynie co do tego zmieniania nazw wszystkich plików mam zastrzeżenia,ja wolę zrobić to tak:
1.Każę logerowi logować do pliku log.txt
2.Po spełnieniu wymogów limitu log.txt jest zamykany a tworzony jest nowy plik log2.txt i teraz logi lecą do niego
3.itd,itp

To nie jest dobry pomysł.
Po pierwsze, jako admin chcę szybko wyświetlić zawartość pliku logu, bez zastanawiania się i dociekania który indeks jest aktualnie obowiązujący.
Po drugie, różne narzędzia analizujące logi odczytują tylko jeden plik, o bazowej nazwie.
Po trzecie, jak w ten sposób chcesz załatwić sprawę przedawnionych archiwów? Przy numeracji odwrotnej są pliki od ".1" do ".maksimum". Przy Twojej numeracji po kilku miesiącach będą pliki z milionowymi liczbami w nazwie, a są usługi które działają przez lata bez restartu.

MasterBLB napisał(a)

Podsumujmy jeszcze tylko,wg jakich kryteriów ma się plik logu wypełniać i być zamykany
-czasowe,tj o okreśonej godzinie

Tak. W ten sposób można sobie rozdzielić pliki logu według dni.

MasterBLB napisał(a)

-ilością wpisów(wierszy) w pliku

To nie ma zastosowania. Rotowanie po rozmiarze robi się w celu zmniejszenia ryzyka zapchania quoty. Np. ustala się 110MB na logi - 10 plików archiwum po 10MB. Jesli ograniczasz po ilości linii, to nigdy nie wiadomo jakiej długości te linie będą. Wystarczy popatrzeć na logi serwera WWW żeby stwierdzić, że przy próbach ataku te linie mogą być baaaardzo długie.
Kolejny problem to otwarcie już istniejącego pliku logu (np. po restarcie usługi). Musiałbyś przeliczyć wszystkie linie jakie w nim są żeby odpowiednio zainicjować licznik zapisanych już linii. To może być bardzo mało wydajne przy dużych plikach.

MasterBLB napisał(a)

-rozmiarowo,czyli jak plik logu osiągnie zadany rozmiar

Nie "osiągnie". Kiedy "przekroczy". Nie będziesz przecież łamał linii w połowie żeby zmieścić się w rozmiarze pliku. Po zapisaniu każdej linii sprawdzasz czy rozmiar (sumuj długości wpisów, nie odpalaj stat() na pliku za każdym razem) przekroczył zadany i jeśli tak, wykonaj rotację.

MasterBLB napisał(a)

-jakieś jeszcze?

Nic mi już nie przychodzi do głowy.

MasterBLB napisał(a)

A,powiedzcie koledzy czy widzicie potrzebę logowania warningów,debugów i errorów do oddzielnych plików?

Ja nie widze takiej potrzeby. Od tego jest grep ;)

P.S. W razie czego mogę udostępnić moją implementację rotującego file loggera dla GObjectowego systemu rejestracji zdarzeń. Niestety, rotuje tylko po rozmiarze i nie kompresuje (nie było mi to potrzebne).

E kodu nie potrzebuję,jestem na tyle obcykany w temacie programowania C++/Qt że sam dam radę(kłopot będzie dopiero przy obsłudzie wielowątkowości),za to zdecydowanie przydadzą się pomysły na ficzery,jakie porządny logger mieć powinien.Poza tym,ten program to dla mnie ćwiczenie aby pozostać w formie podczas bezrobocia.Niemniej dzięki za ofertę :) - MasterBLB 2011-08-22 23:38

Pozostało 580 znaków

2011-08-24 12:58
0

Zacząłbym od przejrzenia listy ficzerów istniejącego softu:
http://log4qt.sourceforge.net/

U mnie (w moim rozwiązaniu) było najważniejsze:

  • rezygnacja z poziomu logowania na rzecz maski logowania (np. ERROR + INFO)
  • nazwy plików unikalne dla każdego uruchomienia (może niezarządzalne automatycznie, ale nie o to mi chodziło)
  • możliwość podpięcia różnych wymyślnych urządzeń (np. osobnego pliku tylko dla TRACE, poza tym standard: konsola, okienko, plik). urządzenie definiuje formatowanie, obsługiwane typy komunikatów oraz miejsce przechowywania danych
  • łatwość użytkowania - singleton:
    MojLog::addInfo("Teraz jestem tutaj");
  • auto-odcinanie pliku po przekroczeniu progu rozmiaru (przed zapisem linii - jeśli log jest za duży to zmieniana jest jego nazwa)
edytowany 5x, ostatnio: vpiotr, 2011-08-24 13:54

Pozostało 580 znaków

2011-08-25 11:35
Kumashiro
0
vpiotr napisał(a)
  • auto-odcinanie pliku po przekroczeniu progu rozmiaru (przed zapisem linii - jeśli log jest za duży to zmieniana jest jego nazwa)

Ojjjj.... Takie rzeczy powinieneś robić po zapisaniu linii. Zmiana nazwy może się nie udać i/lub może spowodować awarię programu, do której jedyny ślad może się znajdować w tej jednej, opuszczonej linii logu. Złota zasada jest taka: najpierw zapisz, potem mieszaj w plikach.

Trafna uwaga. Ale nie zakładam że rename się nie uda. To dla mnie nierealne - przynajmniej na domowym kompie. - vpiotr 2011-08-26 14:34
No to zdziw się,bo podczas implementacji tego ficzera na desktopie zdażyła mi się parę razy taka sytuacja ;] - MasterBLB 2011-08-27 16:20
No to się dziwię, i to bardzo. Bo rename nie wymaga (zwykle) dodatkowej przestrzeni dyskowej, więc jedyną szansę jaką widzę na jego wywalenie to jak ma złe parametry wejściowe... A u Ciebie co się stało że się wywalił? - vpiotr 2011-08-27 20:27
Żeby to było wiadomo...ale dostaję QIODevice.errorStringa()="Unknown error" :| Podejrzewam,że coś mu się kiełbasi przy ścieżkach dostępu,jutro spróbuję przerobić na pełne i bezwzględne - MasterBLB 2011-08-27 21:27
Polecam pełne ścieżki, bo przy względnych to można ześwirować, zwłaszcza jak się jeszcze zmienia katalog aktualny, czasami odpala z IDE, a czasami z konsoli itd... - vpiotr 2011-08-27 21:47
Ta,to było to.Na ścieżkach względnych wszystko działało dobrze pod warunkiem,że user jako plik logu nie podał czegoś w stylu "Logs/TestLog/TestLog.txt" tylko proste "TestLog.txt" - MasterBLB 2011-08-28 14:35

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0