Logovanie a ladenie Web API

Beh ABRA API je možné logovať. A to jednak jeho Java časť pomocou konfiguračného súboru APIServer.yaml, ktorý je v koreňovom adresári inštalácie systému ABRA Gen, a potom ďalej na úrovni business logiky pomocou súboru NEXUS.CFG.

Súčasťou oboch logov je tzv rid, generované pomocou hlavičky X-Request-ID, ktoré umožňuje ľahko identifikovať tak serverovú, ako aj BO časť požiadavky v oboch takto vytvorených logoch.

Všeobecnú konfiguráciu nastavenia logovania systému ABRA Gen viď kap. Logovanie chodu aplikácie.

Odporúčaná konfigurácia nastavenia logovania na úrovni v súbore NEXUS.CFG (od verzie 22) je nasledujúca:

[Logs]
LogsDirectory=<lokálna cesta, ideálne SSD>
Level=3

[Log.ExceptionHook]
Enabled=1
Level=6
ExcludedExceptionClasses=EAbort;NxHiddenError;EIdSocketError;EIdConnectTimeout;EIdNotASocket
ExcludedNxErrorCodes=

[Log.SysLog]
Enabled=1
Level=6

[Log.ProfilingSQL]
Enabled=0
Level=6
Threshold=1000
SQLOutputLength=0

[Log.WA~Monitoring]
Enabled=1
Level=6

[Log.WA/RESTApplication]
Enabled=1
Level=6

[Log.WA/RESTApplication/Security]
Enabled=1
Level=6

[Log.WA/RESTApplication/ProfilingRequest]
Enabled=1
Level=6
SQLText=1
SQLPlan=1

[Log.WA/RESTApplication/Pool]
Enabled=0
Level=6

[Log.WA/RESTApplication/Memory]
Enabled=0
Level=6

Log ExceptionHook slúži na logovanie výnimiek, je jediný, ktorý stojí za to mať zapnutý stále. Ostatné logy je z dôvodu výkonu a rýchlo rastúcej veľkosti súboru s logmi potrebné mať počas prevádzky vypnuté a zapnúť ich podľa príkladu až pri potrebe.

Ak je potrebné v logu výnimiek vypísať všetky výnimky (vrátane EAbort atď.), je nutné v sekcii [Log.ExceptionHook] explicitne vyprázdniť zoznamy vylúčených tried a chybových kódov (inak sa použijú interné prednastavené hodnoty):

ExcludedNxErrorCodes=
ExcludedExceptionClasses=

Ak je potrebné obmedziť celé logovanie iba na procesy vykonávajúce API dopyty, doplňte do hlavnej sekcie [Logs] parameter AllowedApps:

AllowedApps=java.

Log SysLog loguje informácie zo štartu aplikácie (tj. s akými parametrami bol program spustený, nastavenie niektorých interných premenných a pod.).

Log Profilingsql na aplikačnom serveri loguje SQL dotazy, ktoré prekročia nastavený čas. Použitím tohto logu sa dá zistiť, či za prípadnou pomalosťou API dopytov nestojí databáza. Threshold je čas v ms, pri ktorého prekročení sa dotaz zaloguje. SQLOutputLength je dĺžka SQL dotazu, ktorá sa zaloguje, 0 znamená celý dotaz.

Log WA/RESTApplication/ProfilingRequest je najdôležitejší. Je v ňom zahrnutý buď obsah požiadavky aj odpoveď (Level=6) alebo len základné informácie bez tela požiadavky a odpovede (Level=5). V prípade, že vykonávanie požiadavky zamrzne, loguje sa tu callstack threadu, ktorý požiadavku vykonáva a môže napovedať, kde je problém. Od verzie 24.1 je log WA/RESTApplication/ProfilingRequest upravený tak, že logovanie SQL generovaného API sa vykonáva explicitným zapnutím prepínača SQLText=1 a nanovo je možné zalogovať aj SQL plán pomocou SQLPlan=1. Oboje funguje iba pri nastavení Level=6. SQL plán sa neberie priamo z vykonávaného dopytu, ale požiada sa oň databázový engine v separátnom dopyte (implementovanie na základe informácie z AbraBI). Pri ladení problémov s rýchlosťou SQL je odporúčané logovanie zapnúť a vyhodnotiť, viď príklady nižšie.

Log WA/RESTApplication/Security umožňuje zistiť, ktoré chránené objekty boli použité na získanie dát požiadavky a teda sa hodí použiť na riešenie problému s právami k objektom.

Príklad volania metódy GET pre doklad faktúry vydanej: GET http://localhost/develop/issuedinvoices, používateľ nemá správne nastavené práva k chráneným objektom

26.03.2025 11:57:42.847 [5] 00005CF0 (WAProfilingRequest) Začiatok požiadavky(rid:API_b144e5342e5d46fe9049cb1494728cb2): GET http://localhost/develop/issuedinvoices
  
  X-Request-ID=API_b144e5342e5d46fe9049cb1494728cb2
  User-Agent=PostmanRuntime/7.43.2
  Host=localhost
  Connection=keep-alive
  Accept=*/*
  Accept-Encoding=gzip, deflate, br
  Postman-Token=20da25f8-eaa4-40ea-b696-f7150f496ce7
  
  
  
26.03.2025 11:57:42.875 [5] 00005CF0 (WASecurity) Pridať bezpečnostnú podmienku: Pole IssuedInvoices.DocQueue_ID(Zdrojový rad)
  Povolené ID: 5600000101,
  
26.03.2025 11:57:42.877 [5] 00005CF0 (WASecurity) Pridať bezpečnostnú podmienku: Pole IssuedInvoices.AccDocQueue_ID(Účtovný rad)
  Povolené ID: Žiadne ID nie je povolené !!!
  
26.03.2025 11:57:42.879 [5] 00005CF0 (WASecurity) Pridať bezpečnostnú podmienku: Pole IssuedInvoices.BankAccount_ID(Vlastný účet)
  Povolené ID: 2200000101,
  
26.03.2025 11:57:42.881 [5] 00005CF0 (WASecurity) Pridať bezpečnostnú podmienku: Pole Rows.Division_ID(Stredisko)
  Povolené ID: 2100000101,1200000101,2200000101,1300000101,1400000101,2400000101,3400000101,
  
26.03.2025 11:57:42.884 [5] 00005CF0 (WASecurity) Pridať bezpečnostnú podmienku: Pole Rows.Store_ID(Sklad)
  Povolené ID: 2100000101,1500000101,2500000101,3500000101,
  
26.03.2025 11:57:42.886 [6] 00005CF0 (WAProfilingRequest) 
  Spustiť čítanie sql - Vstupné parametre: @{SelDocQueue_ID1Frag}=('5600000101');@{SelBankAccount_ID3Frag}=('2200000101');@{SelRowsDivision_ID4Frag}=('1300000101','1400000101','3400000101','2400000101','2200000101','1200000101','2100000101');@{SelRowsStore_ID5Frag}=('1500000101','2500000101','3500000101','2100000101');@{$IndexAndWhere}=;
  select T_1.AccDocQueue_ID as F_1$REFERENCE, T_1.AccPresetDef_ID as F_2$REFERENCE, T_1.Address_ID as F_3$REFERENCE, T_1.BankAccount_ID as F_4$REFERENCE, T_1.ClosingPeriod_ID as F_5$REFERENCE, T_1.ConstSymbol_ID as F_6$REFERENCE, T_1.CorrectedBy_ID as F_7$REFERENCE, T_1.Country_ID as F_8$REFERENCE, T_1.CreatedBy_ID as F_9$REFERENCE, T_1.Currency_ID as F_10$REFERENCE, T_1.DealerCategory_ID as F_11$REFERENCE, T_1.DeliveryAddress_ID as F_12$REFERENCE, T_1.DeliveryFirm_ID as F_13$REFERENCE, T_1.DeliveryFirmOffice_ID as F_14$REFERENCE, T_1.DeliveryTerms_ID as F_15$REFERENCE, T_1.DocQueue_ID as F_16$REFERENCE, T_1.Firm_ID as F_17$REFERENCE, T_1.FirmOffice_ID as F_18$REFERENCE, T_1.ID as ID, T_1.IEState_ID as F_19$REFERENCE, T_1.IntrastatDeliveryTerm_ID as F_20$REFERENCE, T_1.IntrastatTransactionType_ID as F_21$REFERENCE, T_1.IntrastatTransportationType_ID as F_22$REFERENCE, T_1.LastPaymentPeriod_ID as F_23$REFERENCE, T_1.LocalZone_ID as F_24$REFERENCE, T_1.ObjVersion as ObjVersion, T_1.PaymentType_ID as F_25$REFERENCE, T_1.Period_ID as F_26$REFERENCE, T_1.Person_ID as F_27$REFERENCE, T_1.PostAddress_ID as F_28$REFERENCE, T_1.PostFirm_ID as F_29$REFERENCE, T_1.PostFirmOffice_ID as F_30$REFERENCE, T_1.TransportationType_ID as F_31$REFERENCE, T_1.VATCountry_ID as F_32$REFERENCE, T_1.Zone_ID as F_33$REFERENCE
  from IssuedInvoices T_1
  where ((T_1.DocQueue_ID IN {SelDocQueue_ID1Frag})) and (((T_1.AccDocQueue_ID IS NULL) OR (T_1.AccDocQueue_ID = '0000000000') OR (T_1.AccDocQueue_ID = ' '))) and ((T_1.BankAccount_ID IN {SelBankAccount_ID3Frag})) and ((EXISTS(SELECT 1 FROM IssuedInvoices2 T_2 WHERE  T_2.Parent_ID =T_1.ID AND ((Division_ID IS NULL) OR (Division_ID = '0000000000') OR (Division_ID = ' ') OR (Division_ID IN {SelRowsDivision_ID4Frag})) AND ((Store_ID IS NULL) OR (Store_ID = '0000000000') OR (Store_ID = ' ') OR (Store_ID IN {SelRowsStore_ID5Frag}))) OR Not EXISTS(SELECT 1 FROM IssuedInvoices2 T_2 WHERE  T_2.Parent_ID =T_1.ID)))
  
26.03.2025 11:57:42.892 [6] 00005CF0 (WAProfilingRequest) Zastaviť čítanie sql trvanie: 16 ms
26.03.2025 11:57:42.893 [5] 00005CF0 (WAProfilingRequest) Zastavenie požiadavky(rid:API_b144e5342e5d46fe9049cb1494728cb2): stav 200  čas: 0 ms
  
  Link=http://localhost:80/develop/api-docs/swagger.json#; rel="describedBy"
  Content-Type=application/json
  Access-Control-Allow-Credentials=true
  Access-Control-Allow-Origin=*
  Access-Control-Allow-Headers=Origin, X-Requested-With, Content-Type, Accept, Authorization, Cache-Control
  Access-Control-Allow-Methods=GET,PUT,POST,DELETE
  
  []

Logy WA/RESTApplication/Pool a WA/RESTApplication/Memory sú nízkoúrovňové a ich zapnutie má zmysel len pri riešení špecifických problémov.