Logování Web API
Běh ABRA API je možné logovat. A to jednak jeho Java část pomocí konfiguračního souboru APIServer.yaml, který je v kořenovém adresáři instalace systému ABRA Gen, a pak dále na úrovni business logiky pomocí souboru NEXUS.CFG.
Součástí obou logů je tzv rid, generované pomocí hlavičky X-Request-ID, které umožňuje snadno identifikovat jak serverovou, tak BO část požadavku v obou takto vytvořených lozích.
Obecná konfigurace nastavení logování systému ABRA Gen viz kap. Logování běhu aplikace.
Doporučená konfigurace nastavení logování na úrovni v souboru NEXUS.CFG je následující:
[Logs]
LogsDirectory=<lokální cesta, ideálně SSD>
Level=3
[Log.ExceptionHook]
Enabled=1
[Log.SysLog]
Enabled=1
Level=6
[Log.WA~Monitoring]
Enabled=1
Level=6
[Log.WA/RESTApplication]
Enabled=1
Level=6
[Log.WA/RESTApplication/Pool]
Enabled=0
[Log.WA/RESTApplication/Memory]
Enabled=0
[Log.WA/RESTApplication/ProfilingRequest]
Enabled=1
Parametr Log ProfilingRequest je nejdůležitěšjí. Je v něm zahrnut buď obsah požadavku i odpověď (Level=6) nebo jen základní informace bez těla požadavku a odpovědi (Level=5). V případě, že provádění požadavku zamrzne, loguje se zde callstack threadu, který požadavek provádí a může napovědět, kde je problém.
Při zapnutí parametru ProfilingRequest je třeba nastavit na enabled i nadřízený log [Log.WA~Monitoring]:
[Log.WA~Monitoring]
Enabled=1
Level=6
[Log.WA/RESTApplication/ProfilingRequest]
Enabled=1
Log SysLog loguje informace ze startu aplikace (tj. s jakými parametry byl program spuštěný, nastavení některých interních proměnný a pod.).
Logy Pool a Memory jsou nízkoúrovňové a jejich zapnutí má smysl jen při řešení specifických problémů.
Pokud je třeba omezit logování jen za program, který provádí API dotazy, je třeba doplnit do sekce Logs:
AllowedApps=java.
Pokud je třeba v logu výjimek vypsat všechny výjimky, je třeba doplnit do sekce Log.ExceptionHook vyloučené třídy a nastavit je na nic, jinak se přebírají přednastavené:
ExcludedNxErrorCodes=
ExcludedExceptionClasses=
Threshold je čas v ms, při jehož překročení se dotaz zaloguje. SQLOutputLength je délka SQL dotazu, která se zaloguje, 0 znamená celý dotaz.
Existuje zajímavý log, který na aplikačním serveru loguje SQL dotazy, které překročí nastavený čas. Použitím tohoto logu se dá zjistit, jestli za případnou pomalostí API dotazů nestojí databáze:
[Log.ProfilingSQL]
Enabled=0
Level=6
Threshold=1000
SQLOutputLength=0
Od verze 24.1 je Log.WA/RESTApplication/ProfilingRequest upraven tak, že logování SQL generovaného api se provádí zapnutím přepínače SQLText a nově je možné zalogovat i SQL plán pomocí SQLPlan. SQL plán se nebere přímo z prováděného dotazu, ale požádá se o něj databázový engine v separátním dotazu (implementování na základě informace z AbraBI). Při ladění problémů s rychlostí SQL je doporučeno logování zapnout a vyhodnotit
[Log.WA/RESTApplication/ProfilingRequest]
Enabled=1
Level=6
SQLText=1
SQLPlan=1
Start read sql - InputParams: @{SelDivision_IDFrag}=('1300000101','1400000101','3400000101','2400000101','2200000101','1200000101','2100000101');@{SelStore_IDFrag}=('1300000101','2600000101','3400000101','1600000101','3200000101','4400000101','1500000101','2500000101','3500000101','2300000101','3300000101','2100000101');@{$IndexAndWhere}=;
select T_1.StoreCard_ID as F_1$REFERENCE, T_1.Store_ID as F_2$REFERENCE, sum(T_1.Quantity) as F_3, sum(T_1.DeliveredQuantity) as F_4, T_1.StoreCard_ID as F_5, T_1.Store_ID as F_6
from ReceivedOrders2 T_1
left join ReceivedOrders T_2 on T_2.ID = T_1.Parent_ID
where (T_1.Store_ID in ('2100000101', '2200000101') and T_1.RowType = 3 and T_2.Confirmed = 'A' and T_2.Closed = 'N' and T_1.Quantity > T_1.DeliveredQuantity) and (((T_1.Division_ID IS NULL) OR (T_1.Division_ID = '0000000000') OR (T_1.Division_ID = ' ') OR (T_1.Division_ID IN {SelDivision_IDFrag}))) and (((T_1.Store_ID IS NULL) OR (T_1.Store_ID = '0000000000') OR (T_1.Store_ID = ' ') OR (T_1.Store_ID IN {SelStore_IDFrag})))
group by F_5, F_6
SQL plan: PLAN JOIN (T_1 ORDER RECEIVEDORDERS2_SCARD INDEX (RECEIVEDORDERS2STOREFK, RECEIVEDORDERS2STOREFK), T_2 INDEX (RECEIVEDORDERSPK))