Application Log
Das Application ist ein Framework von SAP, um ein Protokoll lokal während der Laufzeit eines Programms darzustellen oder auch dauerhaft auf der Datenbank abzulegen.
Die Nutzung des Application Logs ist nicht ganz trivial, kann aber aber vor allem sehr nützlich sein, um mit flexibler Laufzeit/Dauer ein Fehler-/Erfolgsprotokoll auf der Datenbank abzulegen und dann komfortabel anzuzeigen und hier auch leicht zwischen Erfolgsmeldungen, Warnungen und Error-Meldungen (ggf. unterschiedlicher Schwere) unterscheiden zu können.
In aller Regel haben die SAP-Kunden eigene Funktionsbausteine oder globale Methoden geschrieben, um die Funktionalität vom Application Log in einer einfachen Schnittstelle zu kapseln und mit dem Verwendungsnachweis sehr schnell Beispielaufrufe anzuzeigen und kopieren zu können für neue Programme.
Funktionsbausteine
- BAL_LOG_CREATE
- BAL_LOG_MSG_ADD
- BAL_DSP_LOG_DISPLAY
Dokumentation in SAP
- Programm = SBAL_DOCUMENTATION
- Transaktion = SBAL_DOCU_DISPLAY
Tabelle BALHDR
- In der Tabelle BALHDR stehen die auf der Datenbank abgespeicherten Application Logs.
- Hier lässt sich auch unkompliziert prüfen welche Application Log Objekte und Unterobjekte genutzt werden.
- In Daten des Logs werden in einem komprimierten Format abgespeichert in der Tabelle BALDAT und lassen sich nicht ohne weiteres verstehen.
Application Log Transaktionen
SLG0 (Objekte und Unterobjekte pflegen)
- In der Transaktion SLG0 werden die Objekte gepflegt. Fast immer werden einem Objekt auch Unterobjekte zugewiesen, um eine feinere Untergliederung eines Objekts zu haben. So könnte man ein Objekt ZSD haben und für jede relevante Anwendung im Bereich SD ein eigenes Subobjekt.
SLG1 (Protokoll anzeigen)
- Transaktion SLG1
SLG2 (Protokoll löschen)
- Transaktion SLG2
SLGD (Protokollanzeige mit Selektionsbild)
- Transaktion SLGD = Report SBAL_DISPLAY_2
SLGN (Pflege Nummernkreise)
- Transaktion SLGN
Testprogramme SBAL_DEMO*
- SAP hat eine Reihe von Testprogrammen entwickelt, um die Möglichkeiten vom Appliation Log näher kennenzulernen.
- Dazu gibt man in SE80/SE38 am besten "SBAL_DEMO*" ein.
Testprogramm SBAL_DEMO_01
Grundlagen
Sobald eine Meldung mit dem Typ E = Error in der Liste steht, wird die Problemklasse rot dargestellt, damit man schon auf den ersten Blick erkennt, dass eine Einzelmeldung Aufmerksamkeit erfordert.
Es können auch Meldungen ausgeblendet werden. Hier wurden die Erfolgsmeldungen ausgeblendet, sodass nur die Warnungen und Fehler verbleiben.
Coding Report SBAL_DEMO_01
report SBAL_DEMO_01 message-id bl. *********************************************************************** *********************************************************************** * REPORT SBAL_DEMO_01 * * This report shows a simple example how the application log function * modules could be used. * For this purpose this reports simulates the check of a flight * (specified by carrier, connection ID and flight date). * A log is created with BAL_LOG_CREATE. * Messages are sent to this log using BAL_LOG_MSG_ADD * (see form msg_add). * Finally the log is displayed with BAL_DSP_LOG_DISPLAY. * Nothing is saved on the database. * *********************************************************************** *********************************************************************** *********************************************************************** ******************** SELECTION SCREEN ********************************* *********************************************************************** selection-screen begin of block b01 with frame title text-001. parameters: p_carrid type bal_carrid default 'SF', p_connid type bal_connid default '0003', p_fldate type bal_fldate default sy-datum. selection-screen end of block b01. *********************************************************************** ******************** CONSTANTS, TYPES, DATA *************************** *********************************************************************** set extended check off. include sbal_constants. set extended check on. data: g_s_log type bal_s_log, g_value type i, g_passenger type bal_custmr, g_everything_ok(1) type c, g_dummy type c. "#EC NEEDED *********************************************************************** ************************ MAIN PROGRAM ********************************* *********************************************************************** end-of-selection. *************************************************************** * create a log where all messages should be added to *************************************************************** * define some header data of this log g_s_log-extnumber = 'Application Log Demo'. "#EC NOTEXT g_s_log-aluser = sy-uname. g_s_log-alprog = sy-repid. * ... see structure BAL_S_LOG for further data ... * ... which can be added to a log header ... * create a log call function 'BAL_LOG_CREATE' exporting i_s_log = g_s_log exceptions others = 1. if sy-subrc <> 0. message id sy-msgid type sy-msgty number sy-msgno with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. endif. *************************************************************** * do something to check if flight is allowed *************************************************************** * ... result is negative: * 305(BL): 'Flight allowance does not exist' message e305 into g_dummy. perform msg_add using probclass_very_high. *************************************************************** * do something to check if weight is OK *************************************************************** * ... result is negative: * 301(BL): 'Maximum weigth is exceeded' message e301(bl) into g_dummy. perform msg_add using probclass_very_high. *************************************************************** * do something to check if there are too many passengers *************************************************************** * ... result is negative: * 302(BL): 'Flight is overbooked' message e302(bl) into g_dummy. perform msg_add using probclass_high. *************************************************************** * do something to check if airplane is available *************************************************************** * ... result is negative: * 303(BL): 'Airplane &1 is not available' message id 'BL' type 'E' number 303 with '747-400' into g_dummy. perform msg_add using probclass_high. *************************************************************** * do something to check if the crew is OK *************************************************************** * ... result is negative .... * 308(BL): 'Stewardess &1 is ill and therefore not available' message e308(bl) with 'JONES' into g_dummy. perform msg_add using probclass_high. *************************************************************** * do something to check if the crew has enough time to sleep *************************************************************** * ... result is negative: * 309(BL): 'Relax phases for the crew are too short' message e309(bl) into g_dummy. perform msg_add using probclass_high. *************************************************************** * check passenger list *************************************************************** do 60 times. * derive passenger number write sy-index to g_passenger left-justified. * assumption: everything is OK for this passenger g_everything_ok = 'X'. *************************************************************** * non-smoker seat available ? *************************************************************** * ... for some passengers a non-smoker seat is not available: if g_passenger = 22 or g_passenger = 34 or g_passenger = 66. * 310(BL): 'Passenger &1 can only be booked on smoker seat' message e310(bl) with g_passenger into g_dummy. perform msg_add using probclass_medium. g_everything_ok = ' '. endif. *************************************************************** * is payment checked ? *************************************************************** * ... for some passengers payment is not yet checked: g_value = sy-index mod 16. if g_value = 0. * 304(BL): 'Payment for passenger &1 is not yet checked' message w304(bl) with g_passenger into g_dummy. perform msg_add using probclass_medium. g_everything_ok = ' '. else. * 306(BL): 'Payment for passenger &1 is done' message s306(bl) with g_passenger into g_dummy. perform msg_add using probclass_medium. endif. *************************************************************** * did passenger cancel his flight ? *************************************************************** * ... some passnegers have cancelled their flight: g_value = sy-index mod 26. if g_value = 0. * 307(BL): 'Flight for passenger &1 was cancelled' message s307(bl) with g_passenger into g_dummy. perform msg_add using probclass_medium. g_everything_ok = ' '. endif. *************************************************************** * Everything is OK *************************************************************** * ... when no errors occured everything is OK for this passenger: if g_everything_ok = 'X'. * 311(BL): 'Booked flight for passenger &1 is checked and OK' message s311(bl) with g_passenger into g_dummy. perform msg_add using probclass_low. endif. enddo. *************************************************************** * display log file *************************************************************** * - we do not specify a display profile I_S_DISPLAY_PROFILE * since we want to use the standard profile * - we also do not specify any filter (I_S_LOG_FILTER, ... * I_T_MSG_HANDLE) since we want to display all messages available call function 'BAL_DSP_LOG_DISPLAY' * EXPORTING * I_S_LOG_FILTER = * I_T_LOG_CONTEXT_FILTER = * I_S_MSG_FILTER = * I_T_MSG_CONTEXT_FILTER = * I_T_LOG_HANDLE = * I_T_MSG_HANDLE = * I_S_DISPLAY_PROFILE = * I_AMODAL = ' ' exceptions others = 1. if sy-subrc <> 0. message id sy-msgid type 'S' number sy-msgno with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. endif. *********************************************************************** ****************** FORMS ********************************************* *********************************************************************** *-------------------------------------------------------------------- * FORM MSG_ADD *-------------------------------------------------------------------- form msg_add using value(i_probclass) type bal_s_msg-probclass. data: l_s_msg type bal_s_msg. * define data of message for Application Log l_s_msg-msgty = sy-msgty. l_s_msg-msgid = sy-msgid. l_s_msg-msgno = sy-msgno. l_s_msg-msgv1 = sy-msgv1. l_s_msg-msgv2 = sy-msgv2. l_s_msg-msgv3 = sy-msgv3. l_s_msg-msgv4 = sy-msgv4. l_s_msg-probclass = i_probclass. * ... see structure BAL_S_LOG or report SBAL_DEMO_02 for ... * ... further data which can be added to a message ... * add this message to log file * we do not specify I_LOG_HANDLE since we want to add this message * to the default log. If it does not exist we do not care * (EXCEPTIONS log_not_found = 0). call function 'BAL_LOG_MSG_ADD' exporting i_s_msg = l_s_msg * I_LOG_HANDLE = exceptions log_not_found = 0 others = 1. if sy-subrc <> 0. message id sy-msgid type sy-msgty number sy-msgno with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. endif. endform.
Ablaufdatum Protokolle
- Es ist verlockend das Application Log in vielen Programmen intensiv zu nutzen. Dabei werden allerdings sehr viele Datensätze auf der Datenbank gespeichert und irgendwann wird es Beschwerden von der Basis über den nötigen Platzverbrauch geben.
- Eine elegante Möglichkeit die Anzahl der benötigten Datensätze zu begrenzen, ist bei der Anlage eines Protokoll ein Ablaufdatum mitzugeben.
- Hier in einem Projektbeispiel wurde das Application Log mit einer einfachen globalen Klasse gekapselt. Im Constructor dieser Klasse wurde nun das Feld "ALDATE_DEL" (Anwendungs-Log: Verfalldatum) 30 Tage in die Zukunft für jedes angelegte Application Log definiert.
- In der Headerstruktur "BAL_S_LOG" sieht man hier dieses Feld "ALDATE_DEL".
- Wenn das Datum vom "AlDATE_DEL" erreicht ist und ein Reorg-Lauf läuft, werden die Datensätze von der Datenbank gelöscht.
- Wenn man selber kein Ablaufdatum eingibt, wird die Basis aus eigenem Antrieb die Daten löschen. In Projekten hörte ich von 90 Tagen bis ein halbes Jahr, ab dem ältere Application Logs automatisch gelöscht werden. In aller Regel ist das auch völlig ausreichend.
- Denkbar wäre es auch die Frist zum Ablaufdatum in Abhängigkeit vom OBJECT+SUBOBJECT zu bringen. Das könnte man hart festlegen im Coding oder über eine Customizingtabelle einlesen. Damit könnte man etwas differenzierter in Abhängigkeit von der betriebswirtschaftlichen Notwendigkeit festlegen wie lange die Protokolle vom Application Log aufzubewahren sind.
- Das physische Löschen von der Datenbank erfolgt mit der Transaktion SLG2.
- "Nur Anzahl ermittelt" ermittelt lediglich die Anzahl der relevanten zu löschenden Protokolle
- "Liste erzeugen" erzeugt eine Liste der Protokolle, die dann in dieser Liste markiert und gelöscht werden können
- "Sofort löschen" würde die relevanten zu löschenden Protokolle sofort löschen
- "HIntergrundjobs einplanen" würde einen Hintergrundjob einplanen. Da ist ein täglicher Job denkbar.
Application Log mit Zusatzfeldern (Kontext)
- Der Application Log kann auch um zusätzliche Felder angereichert werden
- Beispielreport = SBAL_DEMO_02
Siehe Tricktresor: Application Log mit Kontext
Nachrichtenklasse BL für Application Log
- Mehrere Hundert Nachrichten für das Application Log sind in der Nachrichtenklasse BL gesammelt.
YouTube
- Application Log
Web-Links
- https://blogs.sap.com/2012/04/18/create-and-view-log-using-slg0-and-slg1-transaction/
- https://consolut.com/de/supportportal/sap-online-help/sap-dokumentation/ansicht-dokumentation/?article=yc-bal_ch_delete
- https://codezentrale.de/tag/slg1/
Literatur
- ABAP Objects: Das neue umfassende Handbuch zu Konzepten, Sprachelementen und Werkzeugen in ABAP OO, 2016, von Felix Roth, S. 541 ff., 1019