Nginx 의 로그 모듈 및 로그 기본 초기 화 및 필터 설정 분석

5614 단어
어떤 항목 에서 든 로 그 는 매우 중요 한 모듈 로 문제 의 포 지 셔 닝 이 든 일상적인 정보 관리 든 그 를 떠 날 수 없다.
nginx 에서 ngxerrlog_module 모듈 은 nginx 로그 정 보 를 처리 하 는 데 사 용 됩 니 다. nginx 의 core 모듈 중 하나 입 니 다.
main 함수 에서 시간 초기 화가 끝나 면 바로 로그 모듈 초기 화 입 니 다.
로그 구조: 로그 모듈 의 초기 화 는 주로 전역 변 수 를 초기 화 하 는 것 입 니 다 ngxlog, errlog 파일 만 들 기
ngx_log_s 구조 ngxlog 변 수 는 ngxlog_s 구조 체, 코어 / ngx 에 정의log. h 파일 의 구 조 는 다음 과 같 습 니 다.

// struct ngx_log_s
//      {{{
struct ngx_log_s {
 ngx_uint_t   log_level;  //     
 ngx_open_file_t  *file;   //       
 ngx_atomic_uint_t connection; //            
 ngx_log_handler_pt handler;  //               
 void    *data;   //           
 ngx_log_writer_pt writer;
 void    *wdata;
 /*
  * we declare "action" as "char *" because the actions are usually
  * the static strings and in the "u_char *" case we have to override
  * their types all the time
  */
 char    *action;  //      ,           
 ngx_log_t   *next;   //         
}; // }}}


로그 단계 nginx 에서 로 그 는 모두 9 단계 로 나 뉜 다.

#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

  ngx_open_file_s 구조 에서 로그 의 파일 설명 구 조 는 다음 과 같 습 니 다.

// struct ngx_open_file_s
//        {{{
struct ngx_open_file_s {
 ngx_fd_t    fd;
 ngx_str_t    name;
 void    (*flush)(ngx_open_file_t *file, ngx_log_t *log);
   //           
 void     *data; //          
}; // }}}

모든 파일 과 관련 된 데이터 구조 와 작업 은 core / ngx 에 있 습 니 다.conf_file. h 와 core / ngxconf_file. c 파일 중
로그 초기 화 프로 세 스 로그 와 관련 된 초기 화 작업 은 모두 core / ngx 에 있 습 니 다.log. c 파일 에서 현재 우리 가 호출 하 는 것 은 초기 화 함수 입 니 다.

// ngx_log_t *ngx_log_init(u_char *prefix);
//     ngx_log   ,   errlog    {{{
ngx_log_t *
ngx_log_init(u_char *prefix)
{
 u_char *p, *name;
 size_t nlen, plen;

 ngx_log.file = &ngx_log_file;
 ngx_log.log_level = NGX_LOG_NOTICE;

 name = (u_char *) NGX_ERROR_LOG_PATH;

 /*
  * we use ngx_strlen() here since BCC warns about
  * condition is always false and unreachable code
  */

 nlen = ngx_strlen(name);

 if (nlen == 0) {
  ngx_log_file.fd = ngx_stderr;
  return &ngx_log;
 }

 p = NULL;

 //          
#if (NGX_WIN32)
 if (name[1] != ':') {
#else
 if (name[0] != '/') {
#endif

  if (prefix) {
   plen = ngx_strlen(prefix);

  } else {
#ifdef NGX_PREFIX
   prefix = (u_char *) NGX_PREFIX;
   plen = ngx_strlen(prefix);
#else
   plen = 0;
#endif
  }

  if (plen) {
   name = malloc(plen + nlen + 2);
   if (name == NULL) {
    return NULL;
   }

   p = ngx_cpymem(name, prefix, plen);

   if (!ngx_path_separator(*(p - 1))) {
    *p++ = '/';
   }

   ngx_cpystrn(p, (u_char *) NGX_ERROR_LOG_PATH, nlen + 1);

   p = name;
  }
 }

 ngx_log_file.fd = ngx_open_file(name, NGX_FILE_APPEND,
         NGX_FILE_CREATE_OR_OPEN,
         NGX_FILE_DEFAULT_ACCESS);

 if (ngx_log_file.fd == NGX_INVALID_FILE) {
  ngx_log_stderr(ngx_errno,
      "[alert] could not open error log file: "
      ngx_open_file_n " \"%s\" failed", name);
#if (NGX_WIN32)
  ngx_event_log(ngx_errno,
      "could not open error log file: "
      ngx_open_file_n " \"%s\" failed", name);
#endif

  ngx_log_file.fd = ngx_stderr;
 }

 if (p) {
  ngx_free(p);
 }

 return &ngx_log;
}
// }}}


이 초기 화 과정 은 이해 하기 쉽 습 니 다. 그 후에 다른 로그 작업 도 이 파일 에 있 습 니 다. 우 리 는 만난 후에 상세 하 게 설명 하 겠 습 니 다.
함수 실행 후, ngx 로 돌아 가기log 구조의 주소
ngx_log 구조 추출 값 은 다음 과 같 습 니 다.

{
 log_level = 6, 
 file = 0x80e3000 , 
 connection = 0, 
 handler = 0x0, 
 data = 0x0, 
 writer = 0x0, 
 wdata = 0x0, 
 action = 0x0, 
 next = 0x0
}

file 필드 추출 값:

{
 fd = 3, 
 name = {
 len = 0, 
 data = 0x0
 }, 
 flush = 0x0, 
 data = 0x0
}

사용 ngxlog_if 특정 로 그 를 기록 하지 않 는 첫 번 째 단계: Github 에서 ngx 다운로드log_주소https://github.com/cfsego/ngx_log_if / 두 번 째 단계: Nginx 에 제3자 모듈 을 설치 합 니 다.제3자 모듈 의 설 치 는 참고 할 수 있다.http://wiki.nginx.org/3rdPartyModules 사용 -- add - module 압축 해제 후의 ngx 추가log_다음 과 같다 면

./configure --add-module=/var/local/ngx_log_if-master

그리고 Nginx 를 컴 파일 해서 설치 하면 됩 니 다.STEP 3: access 설정log_bypass_if nginx. conf 설정 파일 에

server {
 location / {
  access_log_bypass_if ($status = 404); #   404         
  access_log_bypass_if ($uri ~* 'images'); #   uri   images          
  access_log_bypass_if ($uri = '/index.html'); #   uri /index.html     
 access_log_bypass_if ($host ~* 'tonv.cc'); #   host tonv.cc       
 }
}

Nginx 를 다시 시작 하면 특정한 로 그 를 표시 하지 않 고 걸 러 낼 수 있 습 니 다.

좋은 웹페이지 즐겨찾기