Nginx 개발 입문 부터 정통 까지 - 디 버 깅 (디 버 깅 로그)

사용자 가 Nginx 를 사용 하 는 과정 에서 요청 한 자원 이 정확 하지 않 고 Nginx Core Dump, 세그먼트 오류 등 이상 상황 을 만 날 수 있 습 니 다. 이 때 는 해당 하 는 메커니즘 으로 디 버 깅 과 문제 포 지 셔 닝 을 해 야 합 니 다. 특히 대량의 로그 정보 에 직면 하여 합 리 적 인 디 버 깅 처리 체 제 는 사용자 에 게 매우 중요 한 일 입 니 다.다음은 디 버 깅 로 그 를 소개 하 는 데 중심 을 두 겠 습 니 다.
 
[디버그 로그]
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

좋은 웹페이지 즐겨찾기