03. Nginx 로그 설정 및 로그 절단

11326 단어
Nginx 로그
로 그 는 통계 오류 에 있어 서 매우 유리 하 다. Nginx 로 그 는 주로 두 가지 로 나 뉜 다. accesslog (방문 로그) 와 error로그 (오류 로그), 로그 방문 을 통 해 사용자 의 IP 주소, 브 라 우 저의 정보, 요청 한 처리 시간 등 정 보 를 얻 을 수 있 습 니 다.오류 로 그 는 접근 오류 정 보 를 기록 하여 잘못된 원인 을 찾 는 데 도움 을 줄 수 있 습 니 다.
Access 설정로그 로그
방문 로 그 는 주로 클 라 이언 트 의 요청 을 기록 합 니 다.클 라 이언 트 가 Nginx 서버 에 요청 한 모든 요청 이 여기에 기록 되 어 있 습 니 다.클 라 이언 트 IP, 브 라 우 저 정보, refer, 요청 처리 시간, 요청 URL 등 은 방문 로그 에서 얻 을 수 있 습 니 다.물론 어떤 정 보 를 구체 적 으로 기록 해 야 하 는 지 는 log_format 명령 을 통 해 정의 할 수 있다.
문법
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; #       
access_log off; #       

# path          。
# format        。        combined。
# buffer               。   64k。
# gzip           。       , 1 9         ,          。   1。
# flush          。    flush     ,          。
# if     。          0     ,           。
#   ,        off。       ,                  。

역할 영역
access 적용 가능log 명령 의 역할 영역 은 http, server, location, limit 가 있 습 니 다.except, 즉 이 몇 개의 역할 영역 에서 이 명령 을 사용 하면 Nginx 가 잘못 알 릴 수 있 습 니 다.
기본 용법access_log /usr/local/nginx/logs/b_test/access.log;
이 예 는 로그 의 기록 경 로 를 /usr/local/nginx/logs/b_test/access.log 로 지정 하고 로그 형식 은 기본 combined 을 사용 합 니 다.
log_형식 명령 어
# Nginx      combined    ,                   :
#           ,    log_format   

log_format combined '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent"';

#   :
# log_format name [escape=default|json] string ...;
        
name:               #       , access_log     
string:             #           ,        ,       Nginx  
log_format:         #          combined    ,   apache combined  ,      .
escape:				#              json  default,   default
log_format combined '$remote_addr - $remote_user [$time_local] '
                    ' "$request" $status $body_bytes_sent '
                    ' "$http_referer" "$http_user_agent" ';

#  Nginx       ,squit,nginx      ,web                IP  。
#   $remote_addr          IP  .
#             http    ,    X-Forwarded-For  ,       IP         IP     .      :

log_format porxy '$http_x_forwarded_for - $remote_user [$time_local] '
                 ' "$request" $status $body_bytes_sent '
                 ' "$http_referer" "$http_user_agent" ';
log_format
변량
속뜻
$bytes_sent
클 라 이언 트 에 보 내 는 총 바이트 수
$body_bytes_sent
클 라 이언 트 에 보 내 는 바이트 수 는 응답 헤드 의 크기 를 포함 하지 않 습 니 다.
$connection
연결 시리 얼 번호
$connection_requests
현재 연결 을 통 해 보 내 는 요청 수량
$msec
로그 기록 시간, 단위 초, 정밀도 밀리초
$pipe
http 라인 을 통 해 요청 하면 값 은 "p" 이 고 그렇지 않 으 면 "입 니 다."
$request_length
요청 길이 (요청 줄, 요청 헤더, 요청 체 포함)
$request_time
요청 처리 시간 이 길 고 단 위 는 초 이 며 정밀도 가 밀리초 입 니 다. 클 라 이언 트 의 첫 번 째 바이트 부터 마지막 문 자 를 클 라 이언 트 에 보 내 로 그 를 기록 할 때 까지 입 니 다.
$status
응답 상태 코드
$time_iso8601
표준 형식의 로 컬 시간, 예 를 들 어 "2017 - 05 - 24T 18: 31: 27 + 08: 00"
$time_local
유 니 버 설 로그 형식의 로 컬 시간, 예 를 들 어 "24 / May / 2017: 18: 31: 27 + 0800"
$http_referer
요청 한 referer 주소 입 니 다.
$http_user_agent
클 라 이언 트 브 라 우 저 정보.
$remote_addr
클 라 이언 트 IP
$http_x_forwarded_for
현재 프 록 시 서버 가 있 을 때 웹 노드 가 클 라 이언 트 주 소 를 기록 하 는 설정 을 설정 합 니 다. 이 매개 변 수 는 프 록 시 서버 도 관련 x forward for 설정 을 해 야 합 니 다.
$request
"GET / HTTP / 1.1" 과 같은 원본 요청 줄
$remote_user
클 라 이언 트 사용자 이름, 사용자 인증 사용 요청
$request_uri
"전체 요청 주소, 예:"https://daojia.com/"
Nginx 로그 분석
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '  
 '$status $body_bytes_sent "$http_referer" '  
 '"$http_user_agent" "$http_x_forwarded_for"';  
  
    :  
117.107.143.155 - - [01/Nov/2019:16:29:39 +0800] "GET /favicon.ico HTTP/1.1" 404 555   
"http://39.108.140.0/" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.17 Safari/537.36" "-"  

# Nov, Novemenber(11)      
# Feb February(2)      

error log 설정
오류 로 그 는 Nginx 에서 error log 명령 을 통 해 이 루어 졌 으 며, 이 명령 은 서버 와 요청 처리 과정 에서 의 오류 정 보 를 기록 합 니 다.
문법
error_log file [level];
Default:    
error_log logs/error.log error;

#               。

#             。level   debug, info, notice, warn, error, crit, alert,emerg     。                      。              level             。    error。

기본 용법error_log /var/logs/nginx/nginx-error.log
#       :main, http, mail, stream, server, location   。

#               :/var/logs/nginx/nginx-error.log,         error。

Open_log_file_cache
모든 로그 기록 의 기록 은 파일 을 열 고 기록 을 기록 한 다음 로그 파일 을 닫 습 니 다. 로그 파일 경로 에 변 수 를 사용 했다 면 access_log /var/logs/$host/nginx-access.log 성능 을 향상 시 키 기 위해 open_log_file_cache 명령 을 사용 하여 로그 파일 설명자 의 캐 시 를 설정 할 수 있 습 니 다.
문법
open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];

#         ,        ,     ,           IO   ,       .
#      open_log_file_cache         (   off),         ,          ,    

# max:                ,       ,  LRU(least recently used      )        
# inactive:       ,   10s
# min_uses:    inactive    ,            ,             ,   1 
# valid:       ,  60s
# off:      

#open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;

기본 용법open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;
#       http、server、location    。

#    ,        1000        ,20s                    2 ,        。  1                      

Nginx 로그 윤전
기본 nginx 는 로 그 를 자동 으로 자 르 지 않 습 니 다. 로그 파일 이 점점 커지 면 디스크 공간 을 낭비 하지 않 고 nginx 의 성능 도 떨 어 집 니 다. Linux 의 logrotate 를 사용 하여 이 문 제 를 해결 할 수 있 습 니 다.
logrotate 는 로 그 를 자동 으로 자 르 고 압축 하 며 삭제 할 수 있 습 니 다. 또한 자동화 처 리 는 인위적인 조작 이 필요 없 이 사용 하기에 매우 편리 합 니 다.
rpm -ql nginx |grep log
/etc/logrotate.d/nginx
/var/log/nginx
#      
vim /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 640 nginx adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
#-USR1:  1  

#           
sudo /usr/sbin/logrotate -f /etc/logrotate.d/nginx

logrotate 매개 변수 설명
#   		   #   
daily			#          
weekly			#          
monthly			#          
rotate count	#                ,0      ,5    5    
compress		#   gzip          
nocompress		#   gzip    
create mode owner group	#              , create 0777 nobody nobody
nocreate		#          
delaycompress	#  compress      ,                 
nodelaycompress	#    delaycompress   ,      
missingok		#       ,            
ifempty			#               ,   logrotate     
notifempty		#         ,     
mail address	#               E-mail   
olddir directory #                ,                 
noolddir		#                        
sharedscripts	#   postrotate  ,                    。        ,                 
prerotate		#  logrotate           ,            ;      
postrotate		#  logrotate           ,       (kill -HUP)     !      
dateext			#             
dateformat .%s	#   dateext  ,        ,           ,    dateext  ,    %Y %m %d %s      
size(minsize) log-size	#                 ,log-size   bytes(  ) KB (sizek) MB(sizem),   size 100M

정시 퀘 스 트 추가
sudo crontab -u root -e
# rotate nginx log erery day
0 0 * * * /usr/sbin/logrotate -f /etc/logrotate.d/nginx

#            ,      
contab -r

#           ,              
vim /var/log/cron

#               
#!/bin/bash
base_path='/usr/local/nginx/logs'               #        
log_path=$(date -d yesterday +"%Y%m")           
day=$(date -d yesterday +"%d")                  #          
mkdir -p $base_path/$log_path                   #         
mv $base_path/access.log $base_path/$log_path/access_$day.log
#echo $base_path/$log_path/access_$day.log
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`#     nginx        

# Crontab    
30 02 * * * /cron/nginx/log.sh //  2 30 (   02-04   ,     )

일반적인 로그 분석 명령 사례
# 1.  2019 11 1  pv 
grep '01/Nov/2019' /var/log/nginx/access.log |wc -l
102

# 2.  2019 11 1      10 IP
grep '01/Nov/2019' /var/log/nginx/access.log |awk '{ips[$1]++ } END{for (i in ips){print i,ips[i]}}' |sort -k2 -rn |head -n 10
49.233.69.195 201
190.94.151.52 1
117.107.143.155 1

# 3.  2019 11 1     100  IP
grep '01/Nov/2019' /var/log/nginx/access.log |awk '{ips[$1]++ } END{for(i in ips){if (ips[i]>100) {print i,ips[i]}}}'
49.233.69.195 201

# 4.  2019 11 1      10   
grep '01/Nov/2019' /var/log/nginx/access.log |awk '{urls[$7]++ } END{for(i in urls){print urls[i],i}}'|sort -k1 -rn  |head -n 10
202 /
1 /zhou.html
1 /favicon.ico

# 5.  2019 11 1   URL        ($body_bytes_sent)
grep '01/Nov/2019' /var/log/nginx/access.log |awk '{urls[$7]++; size[$7]+=$10} END{for (i in urls){print urls[i],size[i],i}}' |sort -k1 -rn |head -n10
202 123624 /
1555 /favicon.ico
14 /zhou.html


# 6.  2019 11 1   IP       ($status)
grep '01/Nov/2019' /var/log/nginx/access.log |awk '{ip_code[$1" "$9]++} END{for (i in ip_code){print i,ip_code[i]}}' |sort -k1 -rn |head -n 10
190.94.151.52 200 1
117.107.143.155 404 1
49.233.69.195 200 202

# 7.  2019 11 1  IP      404     ($status)    #        ,     ,     
grep '01/Nov/2019' /var/log/nginx/access.log |awk '{if ($9="404"){ip_code[$1" "$9]++}} END{for(i in ip_code){print i,ip_code[i]}}'
117.107.143.155 404 1
190.94.151.52 404 1
49.233.69.195 404 202

# 8.       pv 
date1=$(date -d '1 minute ago' +%d/%b/%Y:%H:%M); awk -v date=$date1 '$0 ~ date {i++} END{print i}' /var/log/nginx/access.log
100

# 9.               404      
awk '$4>="[01/Nov/2019:16:29:38" && $4<="[01/Nov/2019:17:38:36" {if($9="404"){ip_code[$1" "$9]++}} END{for (i in ip_code){print i,ip_code[i]}}' /var/log/nginx/access.log    # 
117.107.143.155 404 1
190.94.151.52 404 1
47.92.24.137 404 1
80.82.70.187 404 1
49.233.69.195 404 404

# 10.  2019 11 1        
grep '01/Nov/2019' /var/log/nginx/access.log |awk '{code[$9]++} END{for(i in code){print i,code[i]}}'
200 405
404 3

grep '01/Nov/2019' /var/log/nginx/access.log |awk '{code[$9]++;total++} END{for(i in code) {printf i" "; printf code[i]"\t";printf "%.2f",code[i]/total*100;print "%"}}'
200 405    99.26%
404 3    0.74%

# Nginx    
$remote_addr        $1            #      IP
$time_local         $4            #     
$request            $7            # HTTP  (  ,http  ,URL  )
$status             $9            # HTTP   
$body_bytes_sent    $10           #           ,         ,        

좋은 웹페이지 즐겨찾기