[server] Apache 가상 호스트를 통한“Catch-All”액세스 로그?

웹 서버에 많은 가상 호스트가 설정되어 있으며 각 호스트마다 자체 오류 및 액세스 로그가 있습니다. 관련 라인 httpd.conf은 다음과 같습니다.

ErrorLog /var/log/httpd-error.log
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog /var/log/httpd-access.log combined

NameVirtualHost *:80

<VirtualHost *:80>
    ServerName myhost.com
    ServerAlias www.myhost.com
    DocumentRoot /var/www/myhost.com/htdocs
    ErrorLog /var/www/myhost.com/log/error.log
    CustomLog /var/www/myhost.com/log/access.log combined
</VirtualHost>

# ... many more VirtualHosts

현재 /var/log/httpd-error.log에 임의의 오류가 발생하지만 /var/log/httpd-access.log에 아무것도 표시되지 않습니다. 모든 액세스 및 오류를 공유 로그 파일에 복제 할 수 있습니까? 모든 단일 VirtualHost에 새 항목을 추가하지 않고도이 작업을 수행 할 수 있습니까?



답변

http://httpd.apache.org/docs/2.2/logs.html#virtualhost를 참조하십시오 .

CustomLog 또는 ErrorLog 지시문이 섹션 내에 배치되면 해당 가상 호스트에 대한 모든 요청 또는 오류가 지정된 파일에만 기록됩니다. 로깅 지시문이없는 가상 호스트는 여전히 주 서버 로그로 요청을 보냅니다.

즉, VirtualHost 섹션 내에 로깅 지정 문을 배치하면 기본 서버 구성 내의 로깅 지정 문이 대체됩니다. 단일 로그 파일에 로그하려면 VirtualHost 섹션에서 로그 구성을 제거하십시오.

간단히하기 위해 모든 Access 데이터를 단일 로그 파일에 기록하는 것을 선호합니다. 나중에 로그를 처리하고 로그 파일을 가상 호스트의 로그 파일로 분할 할 수 있습니다. 또한 단일 로그 파일에 쓰는 것이 컴퓨터 리소스를보다 효율적으로 사용하는 것보다 한 번에 30 개의 로그 파일에 쓰는 것입니다. LogFormat에 가상 호스트 이름을 기록하는 ‘% v’가 포함되어 있는지 확인하십시오.

모든 액세스 및 오류를 공유 로그 파일에 복제 할 수 있습니까?

모든 오류를 기록하고 공유 로그 파일에 액세스 할 수 있지만 로그 파일이보기 흉합니다. 먼저 Apache 로그 데이터를 syslog로 전송 한 다음 syslog를 사용하여 로컬 파일 또는 원격 로그 서버로 전송하십시오.

# Send access logs to syslog
LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog "|/usr/bin/logger -t httpd -i -p local7.notice" combined
# Send error logs to syslog
ErrorLog syslog:local7

그런 다음 /etc/syslog.conf에서

# Send all HTTP log data to this file
local7.*        /var/log/http-all.log


답변

내가 한 것은 VirtualHost 섹션에 두 번째 CustomLog 줄을 추가하는 것이 었습니다. 그러나 모든 단일 vhost conf 파일에 대해이 작업을 수행해야했습니다. 작동하고 이제 내 템플릿에 있으므로 새로운 가상 호스트가 사용됩니다.

내 아파치 2는 이제 두 위치에 적중을 기록합니다.

  1. 해당 호스트의 디렉토리에있는 호스트의 세부 사항 및
  2. /var/log/apache2모든 가상 호스트에 대한 결합 된 파일입니다.

물론 두 로그 각각에 다른 LogFormat을 적용하여 각각 수용 할 수 있습니다. /var/log/apache2로그 펄 구문 분석, 분석 및보고를위한 고도로 정규화 된 MySQL의 구조로 흡입된다. Logrotate는 일주일에 한 번 청소합니다.


답변

모든 가상 호스트에 대해 한 곳에서 라이브 로그를 보려면 다음을 입력하십시오.

tail -f /var/www/*/access.log

grep을 가진 고양이에도 동일한 규칙이 적용됩니다.

 cat /var/www/*/access.log | grep "something"

또는 로그 회전이 파일을 이미 압축 한 경우 :

gzip -d /var/www/*/access.log.2.gz

예제는 데비안 / 우분투에서 테스트됩니다


답변

나는 이것이 가능하지 않다고 생각합니다. 적어도 문서 에는 그러한 내용이 언급 되어 있지 않습니다.

이러한 종류의 동작을 시뮬레이션하는 가장 좋은 방법은 % v 태그를 형식으로 정의하고 로그 회전시 로그 파일의 복사본을 가상 호스트 별 파일로 분할하는 것입니다.


답변

로그 파일 위치가 가상 호스트에서 어떤 종류의 패턴을 따르는 지 모르겠지만, 아파치가 중복 로그를 생성하고 필요할 때 로그를 생성하는 것을 잊어 버릴 것입니다.

cat /var/www/*/log/access.log > /var/www/logs/access.log


답변

이 질문에 대한 답변도 찾고 있습니다. 지금까지 두 가지 해결책이 있습니다.

  1. 고양이 언급 한 솔루션 joebert
  2. 내 자신의 꼬리 솔루션 : tail -f /var/log/httpd/*access_log

tail -f호스트의 모든 웹 서버 활동에 대한 일종의 견해 를보고 싶습니다 . 그러나 tail이 여러 파일을 처리하는 방식이 실제로 마음에 들지 않기 때문에 하나의 파일 만 꼬리를 달 수 있습니다.


답변

ErrorLog 지시문을 사용하는 두 가지 가능성이 있습니다 http://httpd.apache.org/docs/2.2/mod/core.html#errorlog

1) syslog를 사용하고 [r] syslog.conf에서 중복을 처리하십시오.

2) 파이프를 사용하여 로그 항목을 애플리케이션 / 스크립트로 전송 한 후 해당 애플리케이션 / 스크립트에서 중복을 처리하십시오.