Autor Téma: Logování v aplikaci pro debug účely  (Přečteno 716 krát)

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 309
  • Karma: 0
Logování v aplikaci pro debug účely
« kdy: 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.


« Poslední změna: 24-09-2021, 09:00:54 od age.new »

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2972
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Logování v aplikaci pro debug účely
« Odpověď #1 kdy: 24-09-2021, 09:07:23 »
CodeSite (mel by byt v GetIt), nebo ze synopse tam tak neco bylo. Ale treba nekdo poradi lepe
Embarcadero MVP - Czech republic

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1258
  • Karma: 51
    • Verze Delphi: 10.3
Re:Logování v aplikaci pro debug účely
« Odpověď #2 kdy: 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í.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2972
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Logování v aplikaci pro debug účely
« Odpověď #3 kdy: 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)
Embarcadero MVP - Czech republic

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 309
  • Karma: 0
Re:Logování v aplikaci pro debug účely
« Odpověď #4 kdy: 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ě.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3285
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Logování v aplikaci pro debug účely
« Odpověď #5 kdy: 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".

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 309
  • Karma: 0
Re:Logování v aplikaci pro debug účely
« Odpověď #6 kdy: 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.).

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3285
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Logování v aplikaci pro debug účely
« Odpověď #7 kdy: 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.

« Poslední změna: 24-09-2021, 11:04:27 od pf1957 »

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2972
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Logování v aplikaci pro debug účely
« Odpověď #8 kdy: 24-09-2021, 11:19:06 »
Excellent
Rated 1 time
Jinak uplný základ jsem kdysi v roce 2010 popsal 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/
Embarcadero MVP - Czech republic

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 309
  • Karma: 0
Re:Logování v aplikaci pro debug účely
« Odpověď #9 kdy: 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ší.


« Poslední změna: 24-09-2021, 11:29:40 od age.new »

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 309
  • Karma: 0
Re:Logování v aplikaci pro debug účely
« Odpověď #10 kdy: 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ě.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3285
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Logování v aplikaci pro debug účely
« Odpověď #11 kdy: 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.

Offline egroups

  • Nováček
  • *
  • Příspěvků: 44
  • Karma: 0
Re:Logování v aplikaci pro debug účely
« Odpověď #12 kdy: 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.

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 309
  • Karma: 0
Re:Logování v aplikaci pro debug účely
« Odpověď #13 kdy: 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.
« Poslední změna: 24-09-2021, 12:48:52 od age.new »

Offline Daniel_Andrascik

  • Guru
  • *****
  • Příspěvků: 502
  • Karma: 20
    • Verze Delphi: D2007, D10.4
Re:Logování v aplikaci pro debug účely
« Odpověď #14 kdy: 24-09-2021, 18:39:08 »
A to CodeSite, dokaze logovat aj android apku? Pripadne ILogging od Spring4D?