03. 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 # , ,
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.