Salta ai contenuti

Business Application Log: persistenza e confini LUW

Come modellare, salvare e rileggere log applicativi ABAP senza confondere diagnostica, transazione e retention.

Il Business Application Log non è una semplice destinazione per stringhe. Un log appartiene a un oggetto e, facoltativamente, a un suboggetto definiti a design time; possiede un identificatore esterno, un handle stabile e item tipizzati. La decisione più importante arriva al salvataggio: il log può partecipare alla Logical Unit of Work del chiamante oppure essere persistito e committato su una connessione separata. Le API CL_BALI_* rendono esplicita questa scelta; il modulo XCO BAL offre un’astrazione diversa e non va trattato come un alias (Runtime API).

L’oggetto repository APLO stabilisce il dominio del log; il suboggetto lo suddivide per processo. L’external_id correla il log a un’esecuzione o documento applicativo, mentre l’handle identifica quella specifica istanza. Header e item hanno responsabilità diverse:

Parte Contenuto utile Vincolo operativo
Header object, subobject, external ID, scadenza, contesto Va impostato prima di una persistenza utile
Item message T100, testo libero o eccezione, severity, detail level Dopo l’aggiunta, la copia nel log non segue ulteriori modifiche al setter
Handle UUID del log Permette una rilettura puntuale senza ricerca testuale

La scadenza guida i programmi standard di pulizia. keep_until_expiry impedisce loro di cancellare prima della data, ma non impedisce all’applicazione proprietaria di farlo. External ID, contesto e testi devono contenere soltanto dati necessari: sono superfici diagnostiche, non depositi per segreti o payload completi.

Con CL_BALI_LOG_DB, SAVE_LOG usa la connessione predefinita: il dato diventa definitivo soltanto con il COMMIT WORK della LUW e può scomparire dopo un rollback. SAVE_LOG_2ND_DB_CONNECTION usa invece una service connection e committa subito. È adatto quando la diagnosi deve sopravvivere al fallimento applicativo, ma rompe deliberatamente l’atomicità con i dati di business (Writing Application Logs to the Database).

API Quando persiste Effetto di un rollback successivo
SAVE_LOG Al commit della LUW principale Può annullare anche il log
SAVE_LOG_2ND_DB_CONNECTION Subito, sulla connessione di servizio Il log resta
XCO BAL for->memory( ) Mai nel database Il log resta solo in memoria
XCO BAL for->database( ) A ogni messaggio o eccezione Ogni aggiunta esegue un commit separato

L’ultimo comportamento appartiene al modulo XCO BAL e al suo modello di persistence/profile; non va combinato implicitamente con il ciclo crea-aggiungi-salva di CL_BALI_* (XCO Business Application Log).

Questo frammento sceglie consapevolmente la seconda connessione affinché la diagnosi sopravviva a un rollback. I nomi sono dimostrativi e l’oggetto APLO deve esistere nel sistema target.

DATA(log) = cl_bali_log=>create_with_header(
header = cl_bali_header_setter=>create(
object = 'ZDEMO_LOG'
subobject = 'IMPORT'
external_id = 'RUN-000042' ) ).
log->add_item( item = cl_bali_free_text_setter=>create(
severity = if_bali_constants=>c_severity_information
text = 'Elaborazione completata' ) ).
cl_bali_log_db=>get_instance( )->save_log_2nd_db_connection(
log = log
assign_to_current_appl_job = abap_true ).

assign_to_current_appl_job crea il collegamento solo quando il codice gira dentro un application job. Non certifica che il job sia riuscito: rende il log raggiungibile dalla sua vista operativa.

Una ricerca dovrebbe restringere almeno object e subobject, poi aggiungere intervallo temporale e massimo numero di risultati. LOAD_LOGS_VIA_FILTER può caricare soltanto gli header; gli item completi vanno richiesti quando servono. La lettura verifica S_APPL_LOG con attività 03, la cancellazione con attività 06; i log non autorizzati possono essere esclusi dal risultato (Read Application Logs from the Database).

Se più processi aggiornano la stessa istanza, ENQUEUE e DEQUEUE evitano che un salvataggio sovrascriva l’altro. Anche l’header restituito è uno snapshot: dopo nuovi item va richiesto di nuovo per ottenere contatori aggiornati.

Disponibilità e stato di rilascio delle API cambiano tra ABAP Platform, SAP BTP ABAP environment e release. Gli esempi non definiscono autorizzazioni, retention o classificazione dei dati per un sistema reale. Le eccezioni con messaggio T100 possono essere convertite internamente in message item. Prima dell’uso occorre quindi verificare firme, oggetto APLO, strategia di commit, lock, volume e accessi nel target.