Forum Delphi.cz

Delphi => Obecné => Téma založeno: age.new 24-09-2021, 08:59:02

Název: Logování v aplikaci pro debug účely
Přispěvatel: age.new 24-09-2021, 08:59:02
Vážená skupino,

poradil by mi někdo, v závislosti na svých zkušeností, jaké logování v Delphi aplikaci použít pro dosažení rychlého zaznamenávání textových řetězců?

Rád bych měl prakticky v každé proceduře / funkci detailní logování (jméno procedury / funkce, hodnoty vstupních proměnných atd..). Logování by mělo zvládnout i cykly, tj. vysoký počet záznamů bez ovlivnění výkonu běhu aplikace. Momentálně používám vlastní vláknové ukládání do souboru, tj. plním buffer a v časovém intervalu několika sekund ukládám na disk. Musel jsem ale hodně logování vymazat, protože souborový log narůstal v řádu několika MB za sekundu (v extrémním případě) a mělo to i vliv na výkon samotné aplikace. Zároveň s pádem aplikace padlo i logování.

Napadlo mě pár řešení:

1) OutputDebugString, který jsem využíval při programování Kernel driverů. Nelíbí se mi moc, že sem padají i jiné aplikace a pozdější zpracování výsledného logu by mohlo činit problémy.

2) Se startem aplikace pustit druhou logovací aplikaci, která by sbírala data skrze nějakou vhodnout "inter-processovou" komunikací (například SendMessage, ale i to má své mouchy jako omezená fronta).

Možná ale existuje vhodnější řešení které neznám. Něco super rychlého a nenáročného. Doporučili by jste mi něco?

Děkuji.


Název: Re:Logování v aplikaci pro debug účely
Přispěvatel: Radek Červinka 24-09-2021, 09:07:23
CodeSite (mel by byt v GetIt), nebo ze synopse tam tak neco bylo. Ale treba nekdo poradi lepe
Název: Re:Logování v aplikaci pro debug účely
Přispěvatel: vandrovnik 24-09-2021, 09:20:50
A nechceš mít nějaké nastavení, co logovat a co ne? Na Novellu na to býval příkaz, kterým se trasování různých věcí mohlo jednak centrálně zapnout/vypnout (a nastavit, zda do souboru, nebo na obrazovku), a dále pak desítky přepínačů, které zapínaly/vypínaly logování jednotlivých věcí.
Název: Re:Logování v aplikaci pro debug účely
Přispěvatel: Radek Červinka 24-09-2021, 09:52:38
A nechceš mít nějaké nastavení, co logovat a co ne? Na Novellu na to býval příkaz, kterým se trasování různých věcí mohlo jednak centrálně zapnout/vypnout (a nastavit, zda do souboru, nebo na obrazovku), a dále pak desítky přepínačů, které zapínaly/vypínaly logování jednotlivých věcí.

Takové základní věci, CodeSite je trošku někde jinde https://raize.com/codesite/ (Express verze je v Delphi)
Název: Re:Logování v aplikaci pro debug účely
Přispěvatel: age.new 24-09-2021, 10:12:46
Možnosti logování na nějaké volby moc nepoužívám, protože se většinou chyba stane právě, když máte tu část logu vypnutou a podobně.
Název: Re:Logování v aplikaci pro debug účely
Přispěvatel: pf1957 24-09-2021, 10:41:35
Takové základní věci, CodeSite je trošku někde jinde https://raize.com/codesite/ (Express verze je v Delphi)
Neznam to, ale podle te trosky informaci na webu to vypada na dost vyspely system vcetne hierarchizace... Pro Delphi najdes tezko neco hotoveho a srovnatelneho - pokusy portovat log4j do Delphi byly dost zjednodusene, takze urcite bych se na to podival a nejlepe ho v nejakem realnem projektu pouzil, aby si ho "osahal".
Název: Re:Logování v aplikaci pro debug účely
Přispěvatel: age.new 24-09-2021, 10:45:45
Když bych porovnal SendMessage, které mají ve Windows omezený počet a například pojmenované "PIPE" pro komunikaci mezi dvěma aplikacema? Má smysl stavět logování na posílání zpráv do jiné aplikace?

CodeSite je aplikace třetí strany, resp. z obrázků moc moudrý nejsem. Myslel jsem, že by bylo lepší si udělat vlastní aplikaci na logování a zároveň i na zobrazování (se základmína funkcema pro hledání, vyznačování kritických chyb atd.).
Název: Re:Logování v aplikaci pro debug účely
Přispěvatel: pf1957 24-09-2021, 11:00:22
Možnosti logování na nějaké volby moc nepoužívám, protože se většinou chyba stane právě, když máte tu část logu vypnutou a podobně.
To je obecny problem - vetsinou se to resi tak, ze se prubezne fyzicky neloguje vsechno a pouziva se nejaka varianta post-mortem tj. v bufferu se drzi kus historie trace logu, v pripade exception se na vystup zapise v detailu, co predchazelo, pak vlastni exception vcetne stack-trace a co po ni nasledovalo a velikost tech kusu se da nastavit. Tohle pouzivame pri odesilani chyby emailem.

Ale v produkci jsme se vetsinou ustalili na tom, ze trace logy po zkusebnim provozu nevypiname (i kdyz puvodne byly urceny k vypnuti) a mame jich dokonce nekolik - napr. komunikace s kazdym strojem v samostatnem logu apod. Tech dat byva hodne, takze to predpoklada nejakou archivaci - pouzivame rolling appender na denni bazi, ktery data navic rozdeluje v pripade potreby do nekolika souboru po 256 MB kvuli prohlizeni, dalsi den ty logy automaticky zazipujeme a presune do archivu atd. A obcas nekdo ten server proleze a stare logy smaze.

Ale pak musis mit nejaky nastroj, kterym ty logy efektivne prohlidnes - chce to nejakou hierarchizaci a collapsable/expandable zobrazovani idealne ve spojeni s regexy aj.

S logovanim nebudes nikdy spokojen a vzdy narazis na to, ze by se hodila nejaka dalsi informace :-)

##

Na tvem miste bych zacal s tim CodeSite, co doporucuje Radek, protoze sam si nic srovnatelneho nenapises...




Kdyz se poradne udela ten zapis do FIFO, tak ten overhead je minimalni a co se s tim nasledne s nejakym zpozdenim a zatizenim procesoru dela dodatecne je otazka nejakych asynchronnich appenderu. Z toho pohledu samostatny proces bude mit vetsi overhead nez thready, ktere jsou soucasti procesu.

Název: Re:Logování v aplikaci pro debug účely
Přispěvatel: Radek Červinka 24-09-2021, 11:19:06
Jinak uplný základ jsem kdysi v roce 2010 popsal https://delphi.cz/post/Logovani-za-pomoci-CodeSite-4.aspx (https://delphi.cz/post/Logovani-za-pomoci-CodeSite-4.aspx). Ted jsem se dival a i pro D11 je CodeSite Express dostupne v GetIt.

Nemyslim si, ze jsi za rozumnou dobu napsal neco podobneho.
Jinak jeste z tech veci co se pouzivaji bych zminil logging co je soucasti spring4d, https://bitbucket.org/sglienke/spring4d/src/master/Source/Base/Logging/ (https://bitbucket.org/sglienke/spring4d/src/master/Source/Base/Logging/)
Název: Re:Logování v aplikaci pro debug účely
Přispěvatel: age.new 24-09-2021, 11:21:10
To je obecny problem - vetsinou se to resi tak, ze se prubezne fyzicky neloguje vsechno a pouziva se nejaka varianta post-mortem tj. v bufferu se drzi kus historie trace logu, v pripade exception se na vystup zapise v detailu, co predchazelo, pak vlastni exception vcetne stack-trace a co po ni nasledovalo a velikost tech kusu se da nastavit. Tohle pouzivame pri odesilani chyby emailem.

Přesně tak to mám teď udělané. Ale ukládám to jen pro Try-Except událost. Mnohokrát bych uvítal detailnější logy, ale vždy se pak peru s výkonem samotné aplikace. Proto hledám nějakou možnost jak zpracování logů hodit na jinou aplikaci ležící vedle - ale raději bych vlastní aplikaci, než komerční / free. Když pak narazím na chybu v té aplikaci, tak bývá problém s opravami, aktualizacemi aj.

V aktuálním logu si zaznamenávám vstup a výstup do procedur / funkcí, včetně časů jak dlouho to v té proceduře bylo. Díky tomu mi v logu vznikají značky, které pak mohu dál zpracovávat, napříklat alá tree-view. Takže se tisíce záznamů prostě sbalí dle hierarchie. To mi přijde nejpřehlednější a nejlepší.


Název: Re:Logování v aplikaci pro debug účely
Přispěvatel: age.new 24-09-2021, 11:41:06
Navíc bych rád logoval i například cykly. Proběhnutí cyklu bez logů by trvalo například 100ms a včetně logů by čas cyklu měl být podobný, rozhodně ne například dvojnásobný. Příklad:

Kód: Delphi [Vybrat]
  1. function spocitej(const c, a: integer): integer;
  2. begin
  3.   Loguj('> procedure spocitej [c = %d, a = %d]', c, a);
  4.   result := c + a;
  5.   Loguj('< procedure spocitej [result = %d]', result);
  6. end;
  7.  
  8. c := 0;
  9. for a := 1 to 1000 do
  10.   c := Spocitej(c, a);
  11.  

Je to jen příklad :)

Sice v logu vzniknout tisíce "hloupsotí", ale třeba pak v návaznosti na to se něco někde pokazí a podobně.
Název: Re:Logování v aplikaci pro debug účely
Přispěvatel: pf1957 24-09-2021, 12:10:49
Kód: Delphi [Vybrat]
  1. function spocitej(const c, a: integer): integer;
  2. begin
  3.   Loguj('> procedure spocitej [c = %d, a = %d]', c, a);
  4.   result := c + a;
  5.   Loguj('< procedure spocitej [result = %d]', result);
  6. end;
  7.  

Jenomze v tomhle pripade bude mit nejvetsi overhead to dvoji formatovani stringu - vlastni "pridani" vysledneho stringu do vnitrnich struktur logu bude male (pokud jsou spravne naprogramovany tj. zadne zbytecne realokace apod.). Samozrejme se nabizi moznost logovat jen vysledek a hodnoty argumentu tj. dat logovani jenom na konec, klidne i se zmerenym casem. Logovat zacatky a konce ma smysl jenom tam, kde ten pomer overheadu vuci dobe vykonani uzitecneho kodu je zanedbatelny/akceptovatelny. Totez mereni casu.
Název: Re:Logování v aplikaci pro debug účely
Přispěvatel: egroups 24-09-2021, 12:36:40
Používám ILogger ze Spring4D a pohoda.Jasně,že se musí explicitně určit,co se má logovat,ale pomocí Appenderů můžeš logovat do více věcí,třeba i do toho CodeSite.Mám to teď udělané,že mám hlavní texťák s logem a k tomu ještě extra texťák jen s Errory,abych to rychleji dohledal.Vše jedním příkazem.
Název: Re:Logování v aplikaci pro debug účely
Přispěvatel: age.new 24-09-2021, 12:43:55
Používám ILogger ze Spring4D a pohoda.Jasně,že se musí explicitně určit,co se má logovat,ale pomocí Appenderů můžeš logovat do více věcí,třeba i do toho CodeSite.Mám to teď udělané,že mám hlavní texťák s logem a k tomu ještě extra texťák jen s Errory,abych to rychleji dohledal.Vše jedním příkazem.

Na Ilogger jsem narazil již dřív ale má pro mě moc zbytečností (osobně jsem jej ale nezkoušel). Když jsem pak viděl log oprav, kolik toho je, tak jsem se docela vyděsil :)
Mám sběr logů s ukládání do souboru pomocí vlákna (na x způsobů) na cca 400 řádků kódu (z toho je hromada komentáře). Ten Ilogger je jistě velmi propracovaný, ale právě proto se jej obávám.
Název: Re:Logování v aplikaci pro debug účely
Přispěvatel: Daniel_Andrascik 24-09-2021, 18:39:08
A to CodeSite, dokaze logovat aj android apku? Pripadne ILogging od Spring4D?
Název: Re:Logování v aplikaci pro debug účely
Přispěvatel: egroups 29-09-2021, 07:52:55
Android nedělám.Codesite asi ne,ale ILogger by to měl umět.