13.12.2024
Sergejus Kornejevas

LOG-MANAGER ir Logger Framework: „logging“ Progress OpenEdge

Kuriant programas Progress OpenEdge aplinkoje, „logging“ yra esminis dalykas, padedantis stebėti vykdymo metu vykstančius procesus, derinti kodą ir generuoti ataskaitas. LOG-MANAGER sistemos rankenėlė ir OpenEdge Logger Framework yra du galingi įrankiai, skirti „logging“ OpenEdge programose valdyti.

Šis blogo įrašas apžvelgia „logging“ įgyvendinimo OpenEdge aplinkoje metodus, daugiausia dėmesio skiriant LOG-MANAGER sistemos rankenėlei ir OpenEdge Logger Framework karkasui, palygina jų funkcijas ir pateikia praktinius naudojimo pavyzdžius.

LOG-MANAGER sistemos rankenėlės pažinimas

LOG-MANAGER sistemos rankenėlė valdo „logging“ nustatymus tiek OpenEdge kliento, tiek DataServer kliento kontekstuose. Ji suteikia lankstumo valdant žurnalizuojamos informacijos tipą ir kiekį, derinant „log entry“ tipus ir „logging“ lygius. Tai leidžia programuotojams programiniu būdu valdyti „logging“ ABL (Advanced Business Language) programos vykdymo metu arba komponentuose Progress Application Server (PAS) for OpenEdge aplinkoje.

Pagrindiniai atributai ir metodai

  • LOG-ENTRY-TYPES: šis atributas apibrėžia informacijos tipus, kurie gali būti rašomi į "log" failą. Tai kableliais atskirtas galiojančių "log entry" tipų sąrašas, pvz., "4GLMessages:2,4GLTrace:3", kur kiekvienas įrašo tipas atitinka tam tikrą "log" informacijos kategoriją.
  • LOGGING-LEVEL: atspindi "logging" informacijos kiekį, rašomą į "log" failą. "Logging" lygiai svyruoja nuo minimalaus (0 lygis) iki išsamios trasavimo informacijos (aukštesni lygiai). Pavyzdžiui:
LOG-MANAGER:LOGGING-LEVEL = 3.
LOG-MANAGER:LOG-ENTRY-TYPES = "4GLMessages:2,4GLTrace:3,4GLTrans:2".
  • LOGFILE-NAME: nurodo "log" failo pavadinimą, kuriame Progress OpenEdge rašo "log" pranešimus ir ABL steko (stack) trasavimo informaciją.
  • NUM-LOG-FILES: apibrėžia, kiek pasenusių (rolled-over) "log" failų laikyti diske. Numatytoji reikšmė yra 3, tačiau ją galima keisti naudojant -numlogfiles paleidimo parametrą.
  • LOG-THRESHOLD: apibrėžia "log" failų dydžio ribą. Pasiekus šią ribą, sukuriamas naujas "log" failas. Tai galima nustatyti per -logthreshold paleidimo parametrą.
  • CLEAR-LOG() ir CLOSE-LOG(): šie metodai leidžia atitinkamai išvalyti arba uždaryti "log" failą. CLOSE-LOG() metodas įrašo pranešimą, nurodantį, kad "log" failas buvo uždarytas sąmoningai.

LOG-MANAGER įgyvendinimas

Norėdami iliustruoti praktinį LOG-MANAGER taikymą, panagrinėkime bazinį įgyvendinimą, kuris nustato "logging" parametrus, įrašo įvairius pranešimus į "log" ir tuomet uždaro "log" failą.

LOG-MANAGER:LOGFILE-NAME = "managerLogs.log". 
LOG-MANAGER:LOGGING-LEVEL = 3. 
LOG-MANAGER:LOG-ENTRY-TYPES = "4GLMessages,4GLTrace,4GLTrans".

LOG-MANAGER:WRITE-MESSAGE("Application logging initialized with file: " + LOG-MANAGER:LOGFILE-NAME). 

LOG-MANAGER:WRITE-MESSAGE(LOG-MANAGER:ENTRY-TYPES-LIST). 
LOG-MANAGER:WRITE-MESSAGE(STRING(LOG-MANAGER:LOG-THRESHOLD), "CUSTOM"). 
LOG-MANAGER:WRITE-MESSAGE(STRING(LOG-MANAGER:NUM-LOG-FILES), "CUSTOM-2"). 
LOG-MANAGER:CLOSE-LOG().

Išvestis, įrašyta į managerLogs.log:

[24/12/06@13:19:55.080+0100] P-010008 T-014460 1 4GL -- Logging level set to = 2
[24/12/06@13:19:55.082+0100] P-010008 T-014460 1 4GL -- No entry types are activated
[24/12/06@13:19:55.082+0100] P-010008 T-014460 1 4GL -- Logging level set to = 3
[24/12/06@13:19:55.082+0100] P-010008 T-014460 1 4GL -- Log entry types activated: 4GLMessages,4GLTrace,4GLTrans
[24/12/06@13:19:55.082+0100] P-010008 T-014460 1 4GL APPL           Application logging initialized with file: managerLogs.log
[24/12/06@13:19:55.082+0100] P-010008 T-014460 1 4GL APPL           4GLMessages,4GLTrace,4GLTrans,Actional,ASK,DB.Connects,DB.Encryption,DS.Cursor,DS.QryInfo,DS.Performance,DynObjects.Class,DynObjects.DB,DynObjects.Other,DynObjects.UI,DynObjects.XML,FileID,IgnoredOps,MSASAdmin,MSASCRTInterposed,MSASSessions,MSASSignals,MSASSockets,MSASWebSocket,MSASDebugger,ProEvents.UI.Char,ProEvents.UI.Command,ProEvents.Other,QryInfo,SAX,Temp-Tables,TTStats,WSO
[24/12/06@13:19:55.082+0100] P-010008 T-014460 1 4GL CUSTOM         0
[24/12/06@13:19:55.082+0100] P-010008 T-014460 1 4GL CUSTOM-2       3
[24/12/06@13:19:55.082+0100] P-010008 T-014460 1 4GL ----------     Log file closed at user's request 

Iššūkiai ir pastebėjimai

  • Ribotas pritaikomumas: LOG-MANAGER sistemos rankenėlė neleidžia tiesiogiai pritaikyti "log" pranešimų formatų. Pažangesniam formatavimui programuotojams gali tekti naudoti apėjimo sprendimus, pvz., OpenEdge Logger Framework.
  • Įrašų tipai: tam tikri įrašų tipai, pvz., QryInfo, skirti registruoti užklausų informaciją. Tačiau jie neapima paprastų užklausų, tokių kaip FIND ar FOR EACH sakiniai.
  • Failų tvarkymas: nurodžius "log" failą naudojant -clientlog paleidimo parametrą ir priskyrus failo pavadinimą kode su LOG-MANAGER sistemos rankenėle, OpenEdge rašys "log" į failą, nurodytą LOGFILE-NAME atributu.
  • "Logging" lygio valdymas: norint visiškai išjungti "logging", nustatykite LOGGING-LEVEL į 0. Tai išjungia "logging", nekeičiant kitų nustatymų.

Įvertinimas

LOG-MANAGER sistemos rankenėlė yra efektyvi standartiniam "logging" ir vykdymo metu vykstančių veiksmų ataskaitų teikimui. Ji naudinga baziniam "logging", trasavimui ir derinimui, tačiau jai trūksta lankstumo pažangesnėms "logging" konfigūracijoms.

OpenEdge Logger Framework pažinimas

OpenEdge Logger Framework siūlo lankstesnį ir labiau konfigūruojamą „logging“ sprendimą Progress OpenEdge programoms. Jis leidžia programuotojams apibrėžti pasirinktinius „log“ pranešimus skirtingais svarbos lygiais, juos formatuoti ir saugoti „log“ failuose pagal konfigūracijos nustatymus. Šis karkasas leidžia valdyti „logging“ elgseną, nekeičiant programos kodo.

Karkaso komponentai

  • ILogWriter sąsaja (Interface): pagrindinė "logging" sąsaja. Ji suteikia metodus, tokius kaip Error(), Info(), Debug() ir t.t., skirtus apibrėžti "log" pranešimus skirtingais svarbos lygiais.
  • Logger klasė: ši klasė apdoroja "log" įvykius pagal logging.config faile apibrėžtas konfigūracijas
  • LoggerBuilder: gamyklinė (factory) klasė, sukurianti Logger klasės egzempliorių su atitinkamomis konfigūracijomis.
  • LogEvent: kiekvienas "log" pranešimas sugeneruoja LogEvent objektą, kuriame yra tokios detalės kaip "log" pranešimas, laiko žyma ir svarbos lygis.
  • Filtrai (Filters): Logger karkasas palaiko pasirinktinius filtrus "log" įvykiams apdoroti, formatuoti ir įrašyti. Šiuos filtrus galima pritaikyti pagal konkrečius poreikius.
  • LogLevelEnum: šis elementas apibrėžia "logging" lygius (OFF, FATAL, ERROR, WARN, INFO, DEBUG, TRACE), kurie atitinka metodus ILogWriter sąsajoje.

Bazinio "logging" įgyvendinimas

Norėdami pradėti dirbti su OpenEdge Logger Framework, atlikite šiuos žingsnius:

1. Sukurkite logging.config failą

logging.config failas turi "logging" konfigūracijas JSON formatu. Jis turi būti patalpintas programos PROPATH kataloge. Kiekviena konfigūracija apibrėžia „logging“ lygius ir filtrus konkrečioms ABL klasėms.

Bazinio logging.config failo pavyzdys:

{ 
  "logger": { 
    "com.example.myapp": { 
      "logLevel": "DEBUG", 
      "filters": ["json", "file"] 
    } 
  } 
} 

2. Apibrėžkite log pranešimus savo ABL kode

Norėdami naudoti Progress OpenEdge Logger karkasą savo ABL kode:

  • Įsitikinkite, kad OpenEdge.Logging paketas įtrauktas į PROPATH;
  • Importuokite reikalingas klases: ILogWriter ir LoggerBuilder;
  • Sukurkite Logger egzempliorių naudodami LoggerBuilder:GetLogger() metodą;
  • Rašykite log pranešimus naudodami tokius metodus kaip logger:Info(), logger:Error(), logger:Debug() ir t.t.

Pavyzdys:

DEFINE VARIABLE logger AS ILogWriter NO-UNDO. 
logger = LoggerBuilder:GetLogger("com.example.myapp").

logger:Info("This is an informational message").
logger:Error("An error occurred"). 

"Logging" filtrai

"Logging" filtrai OpenEdge Logger Framework karkase yra esminiai, palaikant saugias ir efektyvias "logging" praktikas, ypač dirbant su jautria informacija. Filtrai leidžia programuotojams pašalinti, maskuoti ar modifikuoti duomenis "log" įrašuose, užtikrinant atitiktį saugumo standartams ir apsaugant naudotojų privatumą. Galite pritaikyti pasirinktines taisykles, dinamiškai modifikuojančias "log" išvestį, konfigūruodami Filter savybę savo logger apibrėžime.

Konfigūracija

Norėdami sukonfigūruoti "logging" filtrą, turėsite jį apibrėžti savo "logging" konfigūracijos faile. Štai konfigūracijos fragmento pavyzdys:

{ 

  "logger": { 
    "myLog": { 
      "logLevel": "INFO", 
      "filters": [ 
        "MDC_FORMAT", 
        { 
          "name": "ANON_FORMAT", 
          "hashAlgo": "SHA-512", 
          "tokensToAnon": "mdc.custId" 
        }, 
        "REPLACE_TOKENS_FORMAT", 
        "FULL_TEXT_FORMAT", 
        { 
          "name": "NAMED_FILE_WRITER", 
          "fileName": "${session.temp-dir}/test.log", 
          "appendTo": false 
        } 
      ] 
    } 
  } 
} 

Kodo pavyzdys

Štai pavyzdinis pasirinktinio "logging" filtro įgyvendinimas, kuris maskuoja kliento ID:

DEFINE VARIABLE oLogger AS ILogWriter NO-UNDO. 

oLogger = LoggerBuilder:GetLogger('myLog'). 

oLogger:Info("Log Message without Sensitive Info."). 

FIND FIRST Customer NO-LOCK NO-ERROR. 
IF AVAILABLE Customer THEN 
DO: 
    OpenEdge.Logging.MDC:Put("custId", STRING(Customer.CustNum)). 
    oLogger:Info("Customer found. Customer ID: $~{mdc.custId}"). 
END. 
ELSE oLogger:Error("Customer not found!"). 

Išvestis

Pritaikius filtrą, "log" pranešimai, turintys jautrius duomenis, bus maišomi (hashed). Pavyzdžiui:

[2024-12-06T13:48:48.029+02:00] myLog INFO: Log Message without Sensitive Info. 
[2024-12-06T13:48:48.035+02:00] myLog INFO: Customer found. Customer ID: $6$3RKhDX5uMJ7PFFeLeOhJ0A$89ER86Klq8W8yTUDio9Nsvz6M7vxyXIOi4QD7OM0ybnH1n/MA+3lsZtIabcdSPU4qnT7ucLvLX1isN1m2wI8NQ== 

Iššūkiai ir pastebėjimai

  • Priklausomybė nuo versijos: Logger karkasas pasiekiamas nuo OpenEdge 11.6.0 versijos. Kai kurios pažangesnės funkcijos, tokios kaip galimybė ištraukti JSON duomenis iš log įvykių, pasiekiamos tik nuo OpenEdge 12.7 versijos.
  • Klaidų tvarkymas: jei Logger nesuranda atitinkamos konfigūracijos logging.config faile, jis sukurs arba tuščią (void) logger’į (kuris atmeta "log" įvykius), arba pagal numatytuosius nustatymus naudos LOG-MANAGER sistemos rankenėlę.
  • Filtrų grandinės: jei viena grandinės filtravimo dalis nepavyksta, visa grandinė nutrūksta, sustabdydama tolesnį "logging".

Apibendrinimas

OpenEdge Logger Framework siūlo tvirtą ir lankstų "logging" sprendimą, leidžiantį detalų konfigūravimą ir pritaikytą "log" tvarkymą. Jis idealiai tinka programoms, kurioms reikia pažangaus "logging", pvz., skirtingų "log" lygių valdymo, pranešimų filtravimo ir "log" rūpesčių atskyrimo tarp kūrimo ir eksploatacijos.

Tiek LOG-MANAGER sistemos rankenėlė, tiek OpenEdge Logger Framework siūlo vertingas "logging" galimybes Progress OpenEdge programoms. LOG-MANAGER sistemos rankenėlė yra paprasta ir efektyvi baziniams "logging" poreikiams, o OpenEdge Logger Framework suteikia lankstesnį, konfigūruojamą "logging" metodą, leidžiantį pažangų filtravimą, pranešimų formatavimą ir didesnę "log" elgsenos kontrolę.

Daugumai scenarijų, reikalaujančių detalaus ir pritaikomo "logging", OpenEdge Logger Framework yra rekomenduojamas pasirinkimas. Tačiau LOG-MANAGER sistemos rankenėlės gali pakakti paprastoms "logging" užduotims arba dirbant su senomis (legacy) sistemomis. Suprasdami abiejų variantų stipriąsias puses ir apribojimus, galite pasirinkti geriausią metodą savo OpenEdge programos "logging" poreikiams.

Ieškote pagalbos Progress OpenEdge kūrime? Drąsiai kreipkitės į „Baltic Amadeus“.

Dažniausiai užduodami klausimai

Kuo skiriasi LOG-MANAGER ir OpenEdge Logger Framework?

LOG-MANAGER yra integruota sistemos rankenėlė, tinkanti baziniam "logging" ir vykdymo metu vykstančių procesų stebėjimui, tačiau turinti ribotą pritaikomumą. Logger Framework siūlo lankstesnį, konfigūruojamą metodą su pažangiu filtravimu, pranešimų formatavimu ir didesne kontrole, nekeičiant programos kodo.

Nuo kurios OpenEdge versijos galima naudoti Logger Framework?

Logger Framework pasiekiamas nuo OpenEdge 11.6.0 versijos. Kai kurios pažangesnės funkcijos, tokios kaip JSON duomenų ištraukimas iš "log" įvykių, prieinamos tik nuo OpenEdge 12.7 versijos.

Kaip logging filtrai padeda apsaugoti jautrius duomenis?

Filtrai leidžia pašalinti, maskuoti ar modifikuoti duomenis "log" įrašuose prieš juos įrašant. Pavyzdžiui, ANON_FORMAT filtras gali maišyti (hash) jautrius laukus, tokius kaip kliento ID, naudojant algoritmus kaip SHA-512, taip užtikrinant atitiktį saugumo standartams.

Kada verta rinktis LOG-MANAGER, o ne Logger Framework?

LOG-MANAGER tinka, kai reikia paprasto, bazinio "logging" arba dirbant su senomis (legacy) sistemomis. Sudėtingesniems poreikiams – tokiems kaip pažangus filtravimas, pasirinktinis formatavimas ar "log" lygių valdymas pagal konkrečias klases – rekomenduojamas Logger Framework.

Pasikalbėkime apie jūsų projektą

Pradedate projektą arba norite sustiprinti jau vykdomą? Susisiekite ir atsakysime jums per vieną darbo dieną.

Parašykite mums

Ačiū! Jūsų pateikimas gautas!
Oi! Pateikiant formą kažkas nutiko.