Nginx-2.nginx日志详解

Posted wang-hongwei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx-2.nginx日志详解相关的知识,希望对你有一定的参考价值。

一、 错误日志[默认开启]
nginx记录错误日志的功能属于核心功能模块ngx_core_module,参数名字是error_log,可以放在mian区块中全局配置,也可以放在不同的虚拟主机中单独记录。

语法如下:

error_log	file	level ;

error_log是错误日志关键字,不能修改
file是日志文件,任意指定存放目录
level是错误日志级别
常见级别有[debug|info|notice|warn|error|crit|caert|emerg]级别越高,记录的信息越少,反之就越多,不要设置info等较低级别,会带来巨大的磁盘I/O开销
error_log默认就已经启用,默认级别crit,默认位置logs/error.log,可以放在mian、http、server、location区块内.

推荐写法
推荐将错误日志级别调整为error,写在主区块[main]内.

error_log logs/error.log error;

二、 访问日志[默认开启]
Nginx会把每个用户访问网站的日志信息记录到指定的文件中,供网站方分析用户行为
默认开启,可放在http、server、location、if in location、limit_except中

1.格式和写法
1)日志格式
此功能由日志模块[ngx_http_log_module]负责,共有两个控制参数:

log_format 定义日志记录格式
access_log 指定日志文件路径,使用何种日志格式记录
log_format默认配置入下:

log_format main ‘$remote_addr - $remote_user [$time_local] "$request" ‘
‘$status $body_bytes_sent "$http_referer" ‘
‘"$http_user_agent" "$http_x_forwarded_for"‘;

2)access_log默认写法如下:

access_log logs/access.log main;

可以定义多个log_format,然后access_log中选择指定的日志格式文件即可(上文的mian就是格式名)

若有需要,还可以在日志中增加如下字段

buffer=[size] 存放日志缓冲区
flush=[time] 缓冲区日志刷入磁盘时间
gzip 压缩传输字段可压缩后传输日志

2.nginx日志格式变量解释

$remote_addr	记录访问网站的客户端地址
$remote_user	远程客户端用户名称
$time_local	记录访问时间与时区
$request	用户请求起始行信息
$status	记录请求返回的状态码
$body_bytes_sent	服务器发送给客户端的响应body字节数
$http_referer	记录该请求是从那个链接访问过来的
$http_user_agent	记录客户端类型信息,如手机端,浏览器等
$http_x_forwarded_for 走前端代理服务器获取用户访问信息,前端代理服务器也得开启此功能

3.真实的访问日志示例:

10.0.0.1 - - [16/Nov/2017:00:13:57 +0800] "GET / HTTP/1.1" 200 5 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"

三、访问日志写法
1.常规情况
在http区块中定义日志格式和输出

http {
log_format main ‘$remote_addr - $remote_user [$time_local] "$request" ‘
‘$status $body_bytes_sent "$http_referer" ‘
‘"$http_user_agent" "$http_x_forwarded_for"‘;
access_log /var/log/nginx/access.log main;
......

2.多虚拟服务器区块
较多虚拟服务器时,在http区块中定义日志格式,在每个sever中以虚拟服务器名命名日志,便于查看,示例如下:

http {
log_format main ‘$remote_addr - $remote_user [$time_local] "$request" ‘
‘$status $body_bytes_sent "$http_referer" ‘
‘"$http_user_agent" "$http_x_forwarded_for"‘;
......
server {
listen 80;
server_name www.etiantian.omg;
access_log /var/log/nginx/www_access.log main;
......

3.日志需要远程传输时[了解即可]
可以控制日志缓冲区大小,并压缩日志(gzip压缩后显示乱码,学习过程不要用)

access_log logs/www_access.log main gzip buffer=32k flush=5s;

四、Nginx访问日志轮询切割
默认情况下nginx会将所有访问日志都记录在一个文件中,日志会很大且不利于分析和处理,可以用脚本加定时任务的方式按天切割日志
1.脚本内容如下:

cat >/servers/scripts/cut_nginx_log.sh <<"EOF"
#!bin/sh
cd /application/nginx/logs
/bin/mv www_access.log www_access_$(date +%F -d ‘-1 day‘).log
/application/nginx/sbin/nginx -s reload
EOF

2.定时任务如下:

crontab -l|tail -2
#cut nginx access_log
00 00 * * * /bin/sh /servers/scripts/cut_nginx_log.sh >/dev/null 2>&1

以上是关于Nginx-2.nginx日志详解的主要内容,如果未能解决你的问题,请参考以下文章

argparse 代码片段只打印部分日志

常用python日期日志获取内容循环的代码片段

我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情

(转) Java中的负数及基本类型的转型详解

详解Android WebView加载html片段

WEB服务与NGINX-NGINX的I/O模型