Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Kako se implementira funkcija za logove?

[es] :: Art of Programming :: Kako se implementira funkcija za logove?

[ Pregleda: 2619 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

lermi
Freelancer

Član broj: 230692
Poruke: 62
*.crnagora.net.



+5 Profil

icon Kako se implementira funkcija za logove?20.08.2010. u 19:13 - pre 166 meseci
Jedno stilsko pitanje: kako je najbolje napisati finkciju koja pravi logove o radu programa? Pitam jer kod programa trenutno izleda vrlo šareno zbog silnih self.log('Učitavanje fajla... OK') poziva. Ima li neki bolji/čitkiji način?
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Kako se implementira funkcija za logove?20.08.2010. u 19:40 - pre 166 meseci
Navedi primer čitkijeg. Ovo je meni okej. Važnija je funkcionalnost. Ja imam klasu za logovanje, i svako logovanje ima i parametar koji je "ozbiljnost" poruke (debug, info, warning, error), mogućnost promenljivog broja parametara (kao printf), i logovanje je zaštićeno muteksom tako da i različiti procesi (a ne samo razne niti u jednom procesu) mogu da upisuju u isti log fajl. Klasa ima opcije za format loga (UTF-16, UTF-8, kodna stranica), radi sa UNICODE makroom, ima maksimalnu veličinu log fajla, kao i opciju trajanja jednog log fajla (dnevno, mesečno, novi fajl svaki put). A pošto je u pitanju klasa onda imam mogućnost i da imam više log fajlova istovremeno (mada mi to do sada nije trebalo). Za svu tu funkcionalnost rado ću platiti sa malo više slova po jednoj C++ funkciji.
 
Odgovor na temu

Goran Rakić
Beograd

Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: Kako se implementira funkcija za logove?20.08.2010. u 20:03 - pre 166 meseci
Ako se osloniš na neki eksterni predprocesor koda pre kompiliranja možeš da automatski ubaciš ovakve linije, a da na jednom mestu definišeš preseke gde želiš da se pozivi nađu. Takav koncept je osnova za AOP, tada je logovanje jedan aspekt, preseci se definišu oko poziva metoda, funkcija, konstruktora kao tačke preseka (engl. pointcut), a obrada pre kompiliranja čini proces tkanja (engl. weaver). Dinamički jezici uglavnom dozvoljavaju da se tkanje izvodi tokom izvršavanja, kod jezika koji se kompiliraju ovo se izvodi upisivanjem odgovarajućih pozivnih linija u međukod.
http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+711 Profil

icon Re: Kako se implementira funkcija za logove?20.08.2010. u 20:09 - pre 166 meseci
Obično za sve popularnije jezike postoje već gotove biblioteke za logovanje, ja koristim log4r koji je pisan po uzoru na log4j. Pozivi upravo liče na to što si ti naveo, tipa

Code:

logger.debug "foo"
logger.warn "bar"


itd, i ne vidim zašto bi to bilo nešto loše. Samo ti znaš gde treba da budu smešteni pozivi za logovanje, kao i šta želiš da preneseš kao poruku.
 
Odgovor na temu

Goran Rakić
Beograd

Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: Kako se implementira funkcija za logove?20.08.2010. u 20:15 - pre 166 meseci
Problem prvi: teško je na jednom mestu pregledati šta se sve beleži

Problem drugi: lako je preskočiti neko beleženje

Problem treći: razbija čitljivost koda
http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+711 Profil

icon Re: Kako se implementira funkcija za logove?20.08.2010. u 20:46 - pre 166 meseci
Ne kontam prva dva, sa trećim se slažem. Jesi li siguran da pričamo o istoj stvari, tj. o logovanju, a ne o trejsovanju?
 
Odgovor na temu

lermi
Freelancer

Član broj: 230692
Poruke: 62
*.crnagora.net.



+5 Profil

icon Re: Kako se implementira funkcija za logove?20.08.2010. u 21:26 - pre 166 meseci
Valjda je ovo logovanje...? Evo primjer, pa može i komentar kako ovo bolje da se uradi, ako ste raspoloženi.

http://pastebin.com/i6AFxsjd

 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Kako se implementira funkcija za logove?20.08.2010. u 22:09 - pre 166 meseci
Ubijaš performanse time što otvaraš fajl svaki put, i još ga i flushuješ. Nema potrebe, nek ostane fajl otvoren sve vreme. Možeš eventualno da zadržiš kod sa flushovanjem za slučaj da ti aplikacija puca na takav način da se kritični delovi loga ne upisuju, ali da to uključuješ samo po potrebi.

Uzgred, UTF-16 nije baš preko potrebna opcija za log fajl, UTF-8 je sasvim dovoljno. U mom slučaju nije koštalo ništa da se ubaci, jer se deo koda onda prosto ne izvršava, ali nema potrebe da se ti trudiš oko te opcije. Nemam mnogo iskustva s Pythonom, ail čini mi se da pišeš u log fajl dok još pokušavaš da ga otvoriš i utvrdiš encoding, čak radiš logovanje u nečemu što podseća na exception handler. To baš i neće da može.
 
Odgovor na temu

Goran Rakić
Beograd

Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: Kako se implementira funkcija za logove?20.08.2010. u 22:23 - pre 166 meseci
Prvi problem je kada želiš da iskoristiš log datoteku i hoćeš da pogledaš odakle je to. Koristiš pretragu, ali možda postoje dva zapisa sa istom porukom. Kada bi svi pozivi bili u okviru jednog aspekta, lakše je baciti oko.

Drugi problem je kada programer zaboravi da doda log.warn(...) poziv u nekom novom kodu. Opet, kada bi svi pozivi za logovanje bili grupisani na jednom mestu, lakše se proveri da li je sve pokriveno. Na primer želiš da loguješ kontekst u kome se kreira neki objekat jer je to važno za tvoju aplikaciju, što naravno ne možeš iz konstruktora objekta zbog vidljivosti. Zato u coding style pravila se dodaje i ovo oko loga, ali programer može to da zaboravi. Sa aspektom, to je samo jedan pointcut (naravno, opet zavisi od implementacije da li je dopuštena vidljivost konteksta ili ne, ovo je samo ideja) koji će pokriti svaki postojeći i budući poziv...

Moguće da ne mislimo na isto, zar ne bi sistem za logovanje trebalo da se ponaša baš kao čitljiv trejs programa sa manjom granulacijom (tj. trejs samo u "bitnim tačkama koje smo unapred definisali i opisali")? Idealno nekim spoljnim parametrom uvećava se broj ovakvih tačaka (--verbose parametar).
http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

lermi
Freelancer

Član broj: 230692
Poruke: 62
*.crnagora.net.



+5 Profil

icon Re: Kako se implementira funkcija za logove?20.08.2010. u 22:49 - pre 166 meseci
@jablan
Upravo sam pogledao Pythonovu biblioteku, vidio sam da ima neki logging paket.

@Mihajlo
Tu su samo dvije metode iz veće klase, pa je skroz van konteksta. log() koristim za upis u fajl, a get_encoding() je tu kao primjer za prenatrpan kod (sa čim ja inače imam problem). U pravu si za flush(): nakon što se klasa pozove iz Tkinter GUI-ja i pokrene, dio zapisa se ne vidi dok se fajl ne zatvori (jer i GUI koristi log()) - pa sam stoga morao ubaciti flush().

@Goran
Mnogo koncepata i nisu mi baš jasni. Ali, pogledaću...
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+711 Profil

icon Re: Kako se implementira funkcija za logove?24.08.2010. u 16:20 - pre 166 meseci
Citat:
Goran Rakić: Sa aspektom, to je samo jedan pointcut (naravno, opet zavisi od implementacije da li je dopuštena vidljivost konteksta ili ne, ovo je samo ideja) koji će pokriti svaki postojeći i budući poziv...

Otprilike kapiram suštinu AOP u ovom kontekstu, ali koliko ja razumem celu priču, ti tu imaš mogućnost da eksterno specificiraš tačke za log samo na određenim mestima - tipa "obavij (wrap) mi tu-i-tu metodu pozivom logovanja" ili "loguj instanciranje objekta te-i-te klase", ali nisam siguran da bi to pokrilo uobičajene potrebe za logovanjem (npr. loguj mi rezultat poziva neke metode, ali samo u toj-i-toj liniji mog koda). Ili grešim?
 
Odgovor na temu

Goran Rakić
Beograd

Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: Kako se implementira funkcija za logove?24.08.2010. u 16:54 - pre 166 meseci
Zavisi kakav weaver imaš za apliciranje aspekta. Neki imaju tagove koje i sam možeš da definišeš, tada to bude baš ovu metodu ili baš ovu liniju koda. Nisam još video runtime weaver kojim to možeš da izvedeš.
http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+711 Profil

icon Re: Kako se implementira funkcija za logove?24.08.2010. u 21:27 - pre 166 meseci
Nemam predstavu kako to konkretno izgleda (valjalo bi da okačiš neki primer ili link), ali kontam da bi vezivanje za konkretnu liniju ili zahtevalo da se broj linije pamti u fajlu u kome definišeš aspekte - što bi značilo da taj fajl moraš, ručno ili automatski, da ažuriraš kadgod menjaš sors, ili da se "tagom" označi sama linija, nekim komentarom ili nečim sličnim - čime se opet gubi prednost odvajanja aspekata od koda.
 
Odgovor na temu

Goran Rakić
Beograd

Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: Kako se implementira funkcija za logove?24.08.2010. u 22:21 - pre 166 meseci
Ja sam AOP koristio samo u PHP-u sa dinamičkim weaverom, tamo da imam samo ograničenu kolekciju mogućih preseka. Mogu da definišem tačku preseka nad nazivom metode ili funkcije ili nad instancom klase ako definišem presek dok je objekat vidljiv. Koristi se runkit da redefiniše metodu u tački spajanja (pogođene presekom).

Kada je kod lepo razdvojen u sitne funkcije to eliminiše skoro sve pozive koji prljaju kod. Dakle mogu da uhvatim neki rezultat ili ulazni parametar iz saveta (engl. advice) i logujem gde već treba.

AspectJ ima široku paletu tačaka preseka i jezik za opis novih, ali bolje primer da da neko ko to i živo koristi.
http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

lermi
Freelancer

Član broj: 230692
Poruke: 62
*.crnagora.net.



+5 Profil

icon Re: Kako se implementira funkcija za logove?29.10.2010. u 10:54 - pre 164 meseci
Ja pogledao logging modul :)) Koristan je jer se može ubaciti svugdje u programu, i što se lako može uključiti/isključiti nivo "loginga". Što se tiče AOP-a, presjeka i sličnoga - bojim se da mi to nije previše jasno.

http://docs.python.org/library/logging.html

Code:

import logging
import sys

LEVELS = {'debug': logging.DEBUG,
          'info': logging.INFO,
          'warning': logging.WARNING,
          'error': logging.ERROR,
          'critical': logging.CRITICAL}

if len(sys.argv) > 1:
    level_name = sys.argv[1]
    level = LEVELS.get(level_name, logging.NOTSET)
    logging.basicConfig(level=level)

logging.debug('This is a debug message')
logging.info('This is an info message')
logging.warning('This is a warning message')
logging.error('This is an error message')
logging.critical('This is a critical error message')

 
Odgovor na temu

[es] :: Art of Programming :: Kako se implementira funkcija za logove?

[ Pregleda: 2619 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.