In unserem heutigen Tipp widmen wir uns dem Thema: Auslesen von Logfiles mittels External Tables.
create directory tomcat_log_dir as '/opt/tomcat/latest/logs'
/
grant read on directory tomcat_log_dir to scott
/
-- Format der Log-Datei
-- 127.0.0.1 - - [24/Mar/2020:13:25:47 +0100] "POST /oracle/wwv_flow.ajax HTTP/1.1" 200 560
DROP TABLE tc_error_log;
CREATE TABLE tc_error_log (
ip varchar2(20),
zeitstempel date,
url_text varchar2(200),
server_error varchar2(5),
send_bytes varchar2(20)
)
ORGANIZATION EXTERNAL
(
TYPE oracle_loader
DEFAULT DIRECTORY tomcat_log_dir
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE
nobadfile
nologfile
fields MISSING FIELD VALUES ARE NULL
(
ip char(20) terminated by '- -',
zeitstempel date "DD/MON/YYYY:HH24:MI:SS" terminated by whitespace enclosed by '[' and '+0100]' ,
url_text char(1000) terminated by whitespace enclosed by '"',
server_error char(5) terminated by whitespace,
send_bytes char(20)
)
)
LOCATION ('localhost_access_log.2020-03-24.txt')
)
REJECT LIMIT UNLIMITED PARALLEL;
Anmerkungen:
1. Ärgerlicher Weise bekommt die Log-Datei jeden Tag einen neuen Namen. Sie können aber den Location Parameter jeden Tag ändern. Evtl mit einem Job
Für den aktuellen Tag:
ALTER TABLE tc_error_log LOCATION ('localhost_access_log.2020-03-24.txt');
2. Wenn Sie ein anders Format in der Datei besitzen, ist es am Anfang praktisch sich ein Logfile der External Table anzusehen:
Ersetzen Sie dazu den Parameter nologfile durch
logfile data_pump_dir:'tomcat_ext_table.log'
und optional den Parameter nobadfile durch
badfile data_pump_dir:'tomcat_ext_table.bad'
3. Etwas unschön ist auch der End-Delimter des Datums ('+0100]') , denn da ist die Zeitzone enthalten (im Winter +0100, im Sommer +0200) aber das soll sich ja bald ändern :-)
Es gibt aber noch eine andere Möglichkeit: Sie können das Format des TomCat Loggings beeinflussen durch eine Änderung in der Datei server.xml
Nun können Sie die Log-Datei mittels Select wunderbar durchsuchen:
SELECT * FROM tc_error_log;
oder gib mir alle 404 Fehler der letzten Stunde:
SELECT * FROM tc_error_log
WHERE server_error=404
AND zeitstempel>sysdate + INTERBAL '1' hour;