Nginx 개발 입문 부터 정통 까지 - 디 버 깅 (디 버 깅 로그)
7691 단어 Nginx 개발 입문 부터 정통 까지
[디버그 로그]
1. 디 버 깅 로그 열기:
디 버 깅 로 그 를 열 려 면 먼저 Nginx 를 설정 할 때 디 버 깅 기능 을 열 고 컴 파일 해 야 합 니 다.
./configure --with-debug ...
그리고 프로필 에 error 를 설정 합 니 다.log 의 단 계 는:
error_log /path/to/log debug;
Nginx 의 윈도 바 이 너 리 버 전 은 항상 디 버 깅 로 그 를 엽 니 다. 따라서 debug 의 로그 단 계 를 설정 하면 됩 니 다.
2. 로그 단계 분석:
여기 서 우 리 는 Nginx 소스 코드 를 분석 하여 Nginx 가 로 그 를 몇 등급 과 서로 다른 로그 등급 간 의 상호 관 계 를 알 아 보 았 습 니 다.
#define NGX_LOG_STDERR 0
#define NGX_LOG_EMERG 1
#define NGX_LOG_ALERT 2
#define NGX_LOG_CRIT 3
#define NGX_LOG_ERR 4
#define NGX_LOG_WARN 5
#define NGX_LOG_NOTICE 6
#define NGX_LOG_INFO 7
#define NGX_LOG_DEBUG 8
#define NGX_LOG_DEBUG_CORE 0x010
#define NGX_LOG_DEBUG_ALLOC 0x020
#define NGX_LOG_DEBUG_MUTEX 0x040
#define NGX_LOG_DEBUG_EVENT 0x080
#define NGX_LOG_DEBUG_HTTP 0x100
#define NGX_LOG_DEBUG_MAIL 0x200
#define NGX_LOG_DEBUG_MYSQL 0x400
#define NGX_LOG_DEBUG_FIRST NGX_LOG_DEBUG_CORE
#define NGX_LOG_DEBUG_LAST NGX_LOG_DEBUG_MYSQL
#define NGX_LOG_DEBUG_CONNECTION 0x80000000
#define NGX_LOG_DEBUG_ALL 0x7ffffff0
그 중에서 기본적으로 유효한 첫 번 째 단 계 는 "stderr", "emerg", "alert", "crit", "error", "warn", "notice", "info", "debug" 입 니 다.
반면 Ngxlog. h 에 열 거 된 다른 debug 2 단계 로그: "debug core", "debug alloc", "debug mutex", "debug event", "debug http", "debug mail", "debug mysql" 등 은 Nginx 설정 시 디 버 깅 로그 기능 을 시작 해 야 사용 할 수 있 으 며 사용 자 는 Ngx 수정 을 통 해 사용 할 수 있 습 니 다.log. h 및 Ngx로그. c 소스 코드 로 debug 두 번 째 단 계 를 업데이트 합 니 다.
우 리 는 다시 Ngx 를 통과 한다.log. c 의 일부 코드 분석 에서 이 로그 단 계 를 어떻게 사용 할 수 있 는 지:
char *
ngx_log_set_levels(ngx_conf_t *cf, ngx_log_t *log)
{
...
for (n = 1; n <= NGX_LOG_DEBUG; n++) {
if (ngx_strcmp(value[i].data, err_levels[n].data) == 0) {
if (log->log_level != 0) {
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
"duplicate log level \"%V\"",
&value[i]);
return NGX_CONF_ERROR;
}
log->log_level = n;
found = 1;
break;
}
}
for (n = 0, d = NGX_LOG_DEBUG_FIRST; d <= NGX_LOG_DEBUG_LAST; d <<= 1) {
if (ngx_strcmp(value[i].data, debug_levels[n++]) == 0) {
if (log->log_level & ~NGX_LOG_DEBUG_ALL) {
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
"invalid log level \"%V\"",
&value[i]);
return NGX_CONF_ERROR;
}
log->log_level |= d;
found = 1;
break;
}
}
...
if (log->log_level == NGX_LOG_DEBUG) {
log->log_level = NGX_LOG_DEBUG_ALL;
}
...
}
상기 코드 논리 에 따라 우 리 는 다음 과 같은 결론 을 얻 을 수 있다.
1. 첫 번 째 단계 로 그 는 서로 배척 합 니 다. 설정 파일 에 다음 설정 항목 을 추가 하면:
error_log path/logs/error.log warn;
error_log path/logs/error.log info;
그러면 Nginx 를 시작 하면 다음 과 같은 오류 가 발생 합 니 다.
[emerg]: duplicate log level "info" in /path/conf/nginx.conf:XX
그러나 주의해 야 할 것 은 설정 파일 이 다른 block 에 서 는 오류 로 그 를 다시 정의 할 수 있 습 니 다.그러나 사용자 가 오류 로 그 를 다시 정의 할 때 로그 단 계 를 지정 하지 않 으 면 디 버 깅 로 그 는 차 단 됩 니 다.다음 예 에서 server 층 에서 다시 정 의 된 로 그 는 이 가상 호스트 의 디 버 깅 로 그 를 차단 합 니 다.
error_log /path/to/log debug;
http {
server {
error_log /path/to/log;
...
이 문 제 를 피하 기 위해 서 는 로그 의 설정 을 다시 정의 하거나 로그 에 debug 단 계 를 지정 할 수 있 습 니 다.
error_log /path/to/log debug;
http {
server {
error_log /path/to/log debug;
...
2. 두 번 째 단계 로 그 는 다 중 선택 입 니 다. 사용 자 는 프로젝트 에 따라 두 번 째 단계 로 그 를 여러 개 설정 할 수 있 습 니 다.
error_log logs/error.log debug_mysql;
error_log logs/error.log debug_core;
3. 첫 번 째 단계 로그 와 두 번 째 단계 로 그 를 조합 할 때 첫 번 째 단계 로그 가 "debug" 일 때 만 두 번 째 단계 로 그 를 설정 할 수 있 습 니 다. 다른 첫 번 째 단계 로 그 를 지정 한 경우 두 번 째 단계 로 그 를 시작 할 수 없습니다. 예 를 들 어:
error_log logs/error.log error;
error_log logs/error.log debug_core;
Nginx 를 시작 하면 다음 과 같은 오류 정 보 를 얻 을 수 있 습 니 다.
[emerg]: invalid log level “debug_http” in /path/conf/nginx.conf:XX
사용자 가 debug 레벨 로 그 를 열 때 모든 debug 를 출력 합 니 다.시작 디 버 깅 정 보 를 위 에서 debug 조합 할 수 있 습 니 다.core|debug_http 형식 으로 사용자 가 필요 로 하 는 디 버 깅 정 보 를 가 져 옵 니 다.
3. 로그 형식 설정:
사용자 가 Nginx 를 사용 하여 웹 서 비 스 를 제공 할 때 로 그 를 기록 해 야 하 는 장면 이 많 을 수 있 습 니 다. 예 를 들 어 로그, 방문 로그, 데이터 통계 로그, 성능 분석 로그 등 입 니 다.로 그 를 더욱 편리 하 게 분석 하기 위해 서 는 로그 형식 을 설정 하 는 방식 으로 Nginx 에 게 사용자 의 요구 에 따라 로 그 를 보 여 달라 고 요구 할 수 있 습 니 다.
nginx 로그 출력 을 제어 하 는 명령 은 다음 과 같 습 니 다.
log_format customLog "$remote_addr^A$remote_user^A$time_local^A$request_method^A$uri^A$args^A$server_protocol"
"^A$status^A$body_bytes_sent^A$http_referer"
"^A$http_user_agent";
access_log /path/logs/access.log customLog;
위의 예 에서 로그 필드 의 구분자 로 특수 문자 (^ A) 를 사용 합 니 다. 사용 자 는 나중에 sort 와 grep 같은 도 구 를 사용 하여 특정 url 을 분석 할 수 있 습 니 다. 예 를 들 어 각 url 요 구 량 을 통계 하여 50 개 를 거꾸로 배열 할 수 있 습 니 다.
awk -F^A '{print $5}' /path/logs/access.log | sort | uniq -c | sort -nr | head -50
위의 로그 맞 춤 형 설정 과 같이 디 버 깅 로 그 를 디 버 깅 하 는 과정 에서 물고기 가 물 을 얻 는 것 처럼 마음대로 할 수 있 습 니 다.
자세 한 logformat 명령 과 accesslog 명령, 사용 자 는 Nginx 홈 페이지 의 HttpLog 모듈 에 접근 할 수 있 습 니 다.
4. 디 버 깅 로그 의 몇 가지 주의 점:
1. 교정: Nginx Wiki 에서 error log 관련 부분 에 대한 소개 에서 언급
http://wiki.nginx.org/NginxHttpMainModule#error_log
Default values for the error level:
in the main section - error
in the HTTP section - crit
in the server section - crit
그러나 우 리 는 소스 코드 에서 볼 때:
static char *
ngx_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
...
if (cf->args->nelts == 2) {
cf->cycle->new_log.log_level = NGX_LOG_ERR;
return NGX_CONF_OK;
}
...
}
error로그 의 로그 단 계 를 설정 할 때 기본 로그 단 계 는 error 이 고 위 에서 언급 한 세 개의 section 의 차이 가 없습니다.그러므로 특별히 이곳 에서 잘못 을 조사 하 였 다.
2. error 설정로그 오 프 는 로그 기록 을 닫 을 수 없습니다. 로그 정 보 는 파일 이름 이 오 프 인 파일 에 기 록 됩 니 다.로그 기록 을 닫 으 려 면 다음 설정 을 할 수 있 습 니 다.
error_log /dev/null crit;
3. nginx 프로 세 스 가 지정 한 로그 주 소 를 기록 할 수 있 는 권한 이 없다 면 nginx 가 시작 하 는 것 은 오류 입 니 다.
[alert]: could not open error log file: open() "/path/log/nginx/error.log" failed (13: Permission denied)
4. debug 를 통 해connection 설정 항목, 사용 자 는 일부 주소 에 대해 디 버 깅 로 그 를 열 수 있 습 니 다:
error_log /path/to/log;
events {
debug_connection 10.232.10.1;
debug_connection 10.232.10.0/24;
}
참고 문헌:
1. 디버그 로그 http://nginx.org/cn/docs/debugging_log.html
2. nginx error log http://wiki.nginx.org/NginxHttpMainModule#error_log
3. log format http://wiki.nginx.org/HttpLogModule
4. nginx 로그 사용 하기 http://blog.linezing.com/2011/11/%E4%BD%BF%E7%94%A8nginx%E8%AE%B0%E6%97%A5%E5%BF%97
댓 글 을 남 겨 주세요: 100 continue. iteye. com