Apache 2.4 환경변수를 이용한 로그 남기기 – mod_setenvif
Apache 2.4 에서 로그를 남기는 다양한 방법이 있는데, mod_setenvif 모듈을 이용하면 다양한 조건에 부합한 것만 로그를 남길 수 있다.
1 2 3 4 5 |
<VirtualHost 192.168.96.30:80> CustomLog "|/opt/httpd/bin/rotatelogs /opt/httpd/logs/access.%Y-%m-%d.log 86400" combinedio </VirtualHost> |
위 예제는 access.2017-04-13.log 파일에 로깅을 하는데 combinedio 로 정의된 로그 포맷대로 기록하며 86400(1day) 하루에 한번 로그 로테이션을 하도록 설정한 것이다.
그런데, 만일 기록되어지는 로그중에 특정 형식의 URI 로 시작하는 경우에 별도의 로그 파일에 기록하고 싶다면 어떻게 해야할까?
1 |
192.168.96.11 - - [13/Apr/2017:23:43:03 +0900] "POST /wp-admin/admin-ajax.php HTTP/1.1" 200 58 "http://linux.systemv.pe.kr/wp-admin/edit.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.54 Safari/537.36" "-" |
위 처럼 /wp-admin 으로 시작하는 URI 를 별도 파일로 기록하고 싶다면 다음과 같이 하면 된다.
1 2 3 4 5 6 7 8 |
SetEnvIfNoCase Request_URI "^/wp-admin.*" object_is_admin <VirtualHost 192.168.96.30:80> CustomLog "|/opt/httpd/bin/rotatelogs /opt/httpd/logs/access.%Y-%m-%d.log 86400" combinedio CustomLog "|/opt/httpd/bin/rotatelogs /opt/httpd/logs/access_wp_admin.%Y-%m-%d.log 86400" combinedio env=object_is_admin </VirtualHost> |
위와같이 mod_setenvif 모듈이 제공하는 SetEnvIfNoCase 문을 이용해 URI 에 형태를 정규표현식을 이용해 매칭시키고 이것을 변수로 등록한다. 그리고 CustomLog 를 하나 더 추가해 ‘combinedio env=object_is_admin’ 처럼 환경변수를 인식 시켜준다.
위와같이 하면 access_wp_admin.%Y-%m-%d.log 파일에는 /wp-admin 으로 시작하는 URI 에 대해서만 기록하게 된다.
한가지 주의할 것은 기존의 access.%Y-%m-%d.log 파일에도 여전히 /wp-admin 으로 시작하는 URI 도 함께 기록된다는 것이다. 이를 피하기 위해서 다음과 같이 지정해줄 수 있다.
1 2 3 4 5 6 7 8 |
SetEnvIfNoCase Request_URI "^/wp-admin.*" object_is_admin <VirtualHost 192.168.96.30:80> CustomLog "|/opt/httpd/bin/rotatelogs /opt/httpd/logs/access.%Y-%m-%d.log 86400" combinedio env=!object_is_admin CustomLog "|/opt/httpd/bin/rotatelogs /opt/httpd/logs/access_wp_admin.%Y-%m-%d.log 86400" combinedio env=object_is_admin </VirtualHost> |
access.%Y-%m-%d.log 에는 ‘combinedio env=!object_is_admin’ 을 적용함으로써 /wp-admin 으로 시작하는 URI 는 기록하지 못하도록 했다.
그런데, 만일 두가지 환경변수를 함꺼번에 적용하고 싶다면 어떻게 해야 할까?
1 2 |
SetEnvIfNoCase Request_URI "^/wp-admin.*" object_is_admin SetEnvIfNoCase Request_URI "^/favicon.*" object_is_favicon |
두가지의 환경 변수를 정의했을 경우에 이 두가지를 한꺼번에 정의하기 위해서는 env 를 쓸수가 없다. env 는 OR 연산자를 제공하지 않았다. 다음의 경우
1 2 3 4 5 6 7 8 9 |
SetEnvIfNoCase Request_URI "^/wp-admin.*" object_is_admin SetEnvIfNoCase Request_URI "^/favicon.*" object_is_favicon <VirtualHost 192.168.96.30:80> CustomLog "|/opt/httpd/bin/rotatelogs /opt/httpd/logs/access.%Y-%m-%d.log 86400" combinedio env=!object_is_admin|!object_is_favicon CustomLog "|/opt/httpd/bin/rotatelogs /opt/httpd/logs/access_wp_admin.%Y-%m-%d.log 86400" combinedio env=object_is_admin </VirtualHost> |
위와 같이 할 경우에 configtest 는 통과하고 재시작도 아주 잘되지만 적용되지 않는다.
이럴때는 변수 선언을 key=value 형식으로 바꾸고 CustomLog 에는 expr 를 사용해야 한다.
1 2 3 4 5 6 7 8 9 |
SetEnvIfNoCase Request_URI "^/wp-admin.*" object_is_admin=yes SetEnvIfNoCase Request_URI "^/favicon.*" object_is_favicon=yes <VirtualHost 192.168.96.30:80> CustomLog "|/opt/httpd/bin/rotatelogs /opt/httpd/logs/access.%Y-%m-%d.log 86400" combinedio expr=!(reqenv('object_is_admin')=='yes'||reqenv('object_is_favicon')=='yes') CustomLog "|/opt/httpd/bin/rotatelogs /opt/httpd/logs/access_wp_admin.%Y-%m-%d.log 86400" combinedio env=object_is_admin CustomLog "|/opt/httpd/bin/rotatelogs /opt/httpd/logs/access_favicon.%Y-%m-%d.log 86400" combinedio env=object_is_favicon </VirtualHost> |
위와같이 expr 를 사용해 AND, OR 연산을 이용할 수 있다.
참고: How to impose two conditions at once for Apache CustomLog?