아래 예제는 최대한 일반적으로 작성하려고 했지만, 특정한 부분에 있어서는 현재 관리하고 있는 시스템을 기준으로 설명한다.
다수의 웹서버들이 백업한 대량의 로그 데이터가 있다고 가정한다.
웹서버는 Apache 2.2 를 기준으로 한다.
웹서버가 남기는 로그의 설정은 설치시 기본으로 설치되는 옵션으로 한다.
웹서버의 로그는 cronolog를 이용하여 일별로 나누어지는 것을 가정한다. 해당 파일이름의 포멧은 access_log_(YEAR)(MONTH)(DAY) 로 한다.
웹서버는 다수의 서버군으로 나뉘어져 있다.
웹서버의 로그는 주기적으로 백업 서버로 전달되어 저장된다. 저장될때, (서버군 이름)_(웹서버 이름) 의 디렉토리를 생성하고 그 아래 저장된다.
find 는 누구나 알고 있지만, 생각보다 기능이 많은 명령이다. -name 커맨드만을 사용하기는 하지만 그 정도로도 충분히 위력적이다. 거기에 -exec 명령으로 grep과 결합하는 순간, find 조건으로 match 시킨 file에 대해서만 grep 명령을 적용할 수 있다. 그렇지 않은 경우, 100G 가량 되는 텍스트 데이터 전체에 대해 grep 명령을 수행하게 되면 언제 끝날지 모르는 검색의 향연을 만끽할 수 밖에 없다... 자, 시간은 금이고 업무가 빨리 끝나면 노는 시간이 길어지는 것이다!
우리는 401 에러가 난 access_log 를 검색하고자 한다. 단, 2007년 7월에 일어난 에러로 가정한다. 이런 경우 이렇게 검색 시간을 줄일 수 있다.
사실 앞뒤로 공백을 주었음에도 불구하고 원하지 않는 로그도 검출된다. 전송량이 401 byte인 경우도 심심치 않게 발생하는 것 같다. 기본 apache log 설정에 보면 ... \"%r\" %>s ... 이라고 되어 있는 부분을 볼 수 있다. %>s는 요청에 대한 가장 마지막 상태를 나타내는 것이고, %r은 요청의 가장 첫 대목이라고 할 수 있다. 그러니 우리가 원하는 401 Response Code 앞에는 항상 " 문자가 오는 것이다. 그러므로
이라고 할 수도 있겠다. 요컨대 | 로 줄줄이 다른 검색 조건을 붙이면 가능하다. 이럴때는 가장 앞에 들어가는 grep 의 조건으로, 그 수행 결과가 가장 적을 것으로 기대되는 조건이 들어가는 편이 시간상 유리하다. 유의해야 할 것이, url encode 되는 상황이다. 그런 상황은 사용되는 Client에 따라 다르다. (특정 Client를 쓰는지 반드시 확인이 필요하다.) IE 같은 경우 .을 %2E로 encoding 해서 보내는 것으로 알고 있다. 이런 경우 검색 조건은,