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);