Skip to Main Content

 

Auswahl  

Oracle Attention.log via Pipelined Table Function auslesen / auswerten 

Oracle
DBA:PL/SQL
RDBMS 21.1:RDBMS 23.1
07.09.23 (MP)
15.11.23(MP)

Passende Schulungen zum Thema

Ab der Version Oracle 21c wird zusätzlich zum alert.log noch eine neue Datei ausgeliefert: das Attention.log. Hier sollen wichtige Information als Zusammenfassung der Alert.log stehen.

Naja, ich hoffe das wird nicht etwas verbessert, aber trotzdem wäre es praktisch die Datei mit einem Select auszulesen. Ich hatte gehofft, jemand hat sich die Arbeit schon gemacht (Google wo bist Du, wenn man Dich braucht…), aber leider habe ich nichts gefunden.

Ok, dann mach ich es halt …

Wir geben die Objekte dem Benuter system, sie können aber natürlich auch einen anderen Benutzer dafür einrichten.

ALTER SESSION SET current_schema=system;
col adir new_value adir
col afile new_value afile
with diag as (select sys_context('userenv','PLATFORM_SLASH') as ps,value from v$diag_info
where name='Attention Log')
select 
substr(value,1,instr(value,ps,-1)-1) as adir,
substr(value,instr(value,ps,-1)+1) as afile
from diag;
CREATE OR REPLACE DIRECTORY attention_dir as '&adir.';
GRANT READ ON DIRECTORY attention_dir to system;

 

CREATE OR REPLACE TYPE attention_type 
AS OBJECT (
   NOTIFICATION    VARCHAR2(4000), 
   ERROR           VARCHAR2(4000),
   URGENCY         VARCHAR2(4000),
   INFO            VARCHAR2(4000),
   CAUSE           VARCHAR2(4000),
   ACTION          VARCHAR2(4000),
   CLASS           VARCHAR2(4000),
   TIME            TIMESTAMP WITH TIME ZONE    
);
/
CREATE OR REPLACE TYPE attention_tab_type AS TABLE OF attention_type;
/
CREATE OR REPLACE FUNCTION read_attention_log 
RETURN attention_tab_type PIPELINED
IS
 f_handle  utl_file.file_type:=utl_file.fopen(
 location=>'ATTENTION_DIR',
 filename=>'&afile.',
 open_mode=>'r',
 max_linesize=>32767);
 text         varchar2(32767);
 v_a_log attention_type:=attention_type(null,null,null,null,null,null,null,null);
 v_i INT:=1;
BEGIN
 LOOP 
     BEGIN
     utl_file.get_line(f_handle,text); -- Neue Zeile lesen
   IF substr(text,1,16)='  "NOTIFICATION"' THEN
       v_a_log.NOTIFICATION:=rtrim(rtrim(substr(text,21),','),'"');
   END IF;
   IF substr(text,1,9)='  "ERROR"' THEN 
       v_a_log.ERROR:=rtrim(rtrim(substr(text,21),','),'"');
   END IF;
   IF substr(text,1,11)='  "URGENCY"' THEN    
       v_a_log.URGENCY:=rtrim(rtrim(substr(text,21),','),'"');
   END IF;
   IF substr(text,1,8)='  "INFO"' THEN    
       v_a_log.INFO:=rtrim(rtrim(substr(text,21),','),'"');
   END IF;  
   IF substr(text,1,9)='  "CAUSE"' THEN
       v_a_log.CAUSE:=rtrim(rtrim(substr(text,21),','),'"');
   END IF;
   IF substr(text,1,10)='  "ACTION"' THEN
       v_a_log.ACTION:=rtrim(rtrim(substr(text,21),','),'"');
   END IF;
    IF substr(text,1,9)='  "CLASS"' THEN
       v_a_log.CLASS:=rtrim(rtrim(substr(text,21),','),'"');
   END IF;
   IF substr(text,1,8)='  "TIME"' THEN
       v_a_log.TIME:=to_timestamp_tz(rtrim(substr(text,21),'"'),'YYYY-MM-DD"T"HH24:MI:SS.FFTZH:TZM');
       PIPE ROW (v_a_log);
       v_a_log :=attention_type(null,null,null,null,null,null,null,null);
   END IF;
     EXCEPTION 
    WHEN NO_DATA_FOUND THEN EXIT; -- Keine Zeile im Attention.log mehr gefunden oder Fehler=> Schleife verlassen
    WHEN OTHERS THEN RAISE;
     END;
 END LOOP; 
 utl_file.fclose(f_handle);
END;
/

Un nun können Sie das attention.log via SQL auslesen …

SELECT * FROM table(read_attention_log);

Weitere Interessante Kurs-Tipps zum Thema