2017-12-15 9 views
0

키 - 값 쌍의 복잡한 sqlldr 구문 분석에 대한 필자 검색이 씬하지 않았습니다. 그래서 당신이 적응할 수 있을지도 모르는 나의 필요를 위해 일한 모범을 게시하십시오.Apache 공통 로그를 구문 분석하기위한 sqlldr의 예제

문제 : 수백만 라인의 Tomcat 액세스 로그.

time='[01/Jan/2001:00:00:03 +0000]' srcip='192.168.0.1' localip='10.0.0.1' referer='-' url='/limsM/SamplesGet-SampleMaster?samplefilters=%5B%22parent_sample%20%3D%208504571%22%2C%22status%20%3D%20'D'%22%5D&depthfilters=%5B%22scale_id%20%3D%2011311%22%5D' servername='yo.yo.dyne.org' rspms='218' rspbytes='2198' 

은 선택한 매개 변수 분석의 편의를 위해이 Oracle 테이블로 구문 분석됩니다.

create table transfer.loganal (
    time date 
, timestr varchar2(30) 
, srcip varchar2(75) 
, localip varchar2(15) 
, referer clob 
, uri clob 
, servername varchar2(50) 
, rspms number 
, rspbytes number 
, logsource varchar2(50) 
); 

이 작업을 수행하는 sqlldr 제어 스크립트의 모양은 무엇입니까?

답변

1

이것이 제 첫 번째 해결책입니다. 상세 검색, 제안, 개선은 언제나 환영합니다.

예를 들어, 디렉토리에 Tomcat 액세스 로그가 있습니다. yoyotomcat의 형제

-- Load an Apache common log format 
-- essentially key-value pairs 
-- example line of source data 
-- time='[01/Jan/2001:00:00:03 +0000]' srcip='192.168.0.1' localip='10.0.0.1' referer='-' url='/limsM/SamplesGet-SampleMaster?samplefilters=%5B%22parent_sample%20%3D%208504571%22%2C%22status%20%3D%20'D'%22%5D&depthfilters=%5B%22scale_id%20%3D%2011311%22%5D' servername='yo.yo.dyne.org' rspms='218' rspbytes='2198' 
-- 
LOAD DATA 
INFILE 'yoyodyne/combined.2001*' "STR '\n'" 
TRUNCATE INTO TABLE transfer.loganal 
TRAILING NULLCOLS 
(
    time enclosed by "time='[" and "+0000]' " "to_date(:time, 'dd/Mon/yyyy:hh24:mi:ss')" 
    , srcip enclosed by "srcip='" and "' " 
    , localip enclosed by "localip='" and "' " 
    , referer char(10000) enclosed by "referer='" and "' " 
    , uri char(10000) enclosed by "url='" and "' " 
    , servername enclosed by "servername='" and "' " 
    , rspms enclosed by "rspms='" and "' " "decode(:rspms, '-', null, to_number(:rspms))" 
    , rspbytes enclosed by "rspbytes='" and "'" "decode(:rspbytes, '-', null, to_number(:rspbytes))" 
    , logsource "'munchausen'" 
) 

로드 귀하의 마일리지가 다를 수 있습니다

sqlldr [email protected] direct=true control=combined.ctl 

프롬프트 명령에서이 프로그램을 실행하여 가상의 예를 내용으로 combined.ctl로 저장

yoyotomcat/ 
    combined.20010101 
    combined.20010102 
    ... 

이 파일. 필자는 오라클 12를 사용 중입니다. 여기에 사용 된 기능이 비교적 새로운 기능이있을 수 있습니다. 확실하지 않다.

조명

  • 이 변형 기능은 키 - 값 쌍을 위해 잘 작동 "에 의해 둘러싸인." 그것의 정규식이 아니지만 performant입니다.

  • 열 이름을 바인드 변수로 처리하고 사용 가능한 SQL 함수를 적용하면 훨씬 더 많은 유연성을 사용할 수 있습니다.

  • GET이 길기 때문에 부당하게 긴 문자열 값을 지정하십시오. 기본값으로 255는 충분하지 않았습니다.

  • Rspms 및 rspbytes에 '-'가있는 경우가 있습니다. 사용 된 SQL은 빈번한 "숫자가 아닌"오류를 해결합니다.

  • 작성된 제어 파일은 모든 필드가 존재한다고 가정합니다. 시간이 지나면 좋은 가정이 아닙니다. 인클로저가 일치하지 않을 때 null 열을 허용하도록 config를 찾고 있습니다.

환호.