Nginx日志配置经验分享

关于Nginx 日志Nginx 日志分为两种 , 一种是错误日志(error log) , 记录 Nginx 运行过程中遇到的异常 , 一种是访问日志(access log) , 记录的是 WEB 服务被用户访问时留下的一些信息 。例如哪些文件被访问过、Nginx 如何响应、用户使用的 IP 地址等等 。
 
1 开启访问日志要开启访问日志 , 在 nginx.conf 文件中的 http 或 server 字段添加以下参数:
access_log log_file log_format;
其中 log_file 为日志要保存的路径 , log_format 为日志记录格式 。记录格式可以采用默认 , 也可以在 http 字段中自定义:
log_format format_name 'set_of_variables_to_define_format';
其中 format_name 表示这个日志格式的名称 , 在引用时需要用到 。set_of_variables_to_define_format 表示此日志格式所记录的信息及顺序 。
访问日志格式详解可见此官方文档 。
小提示:
• server 字段如果未设置访问日志 , 则该 server 访问日志会继承 http 字段中的设置 。
• server 字段中的 location 字段也可单独设置访问日志 。
• 每个字段中都可以设置多个不同格式的日志 。
 
2 开启错误日志要开启错误日志 , 在 nginx.conf 文件中 http 字段添加以下参数:
error_log log_file log_level;
其中 log_file 为日志要保存的路径 , log_level 为要记录的日志级别 , 设置某个级别后 , 该级别及以上级别的错误日志都将被记录 。
错误日志共分为 8 个级别 , 从高到低分别是:
• emerg: 紧急 , 可能导致服务不可用 。
• alert: 告警 , 严重问题告警 。
• crit: 严重 , 需要关注的严重问题 。
• error: 错误 , 发生错误 , 例如某个页面处理错误 。
• warn: 警示 , 可能需要关注的问题 。
• notice: 通知 , 简单的通知日志 , 大多数情况下可以忽略 。
• info: 信息 , 运行中的普通信息 。
• debug: 调试 , 用于分析错误的调试信息 。
 
3 日志按天或按月存放通常配置情况下 , Nginx 所有访问日志存放在同一个 log 文件中 , 时间一长 , 日志文件将变得巨大 , 导致备份、分析都不方便 。因此需要将日志按一定时间间隔分开存放 , 例如每天、每月或其它时间间隔 。要实现这个目的主要由两种方式:
• 一种是在 nginx.conf 配置文件中进行配置
• 一种是使用系统定时任务脚本定期对日志进行分割
3.1 在 nginx.conf 中配置日志存放规则
【Nginx日志配置经验分享】在这里 , 我们需要用到 map 指令 , map 指令是由 ngx_http_map_module 模块提供的 , 默认情况下安装 nginx 都会安装该模块 。map 指令只能位于 nginx.conf 的 http 字段内 。具体代码如下:
http {............#设置日志按日期或月份滚动map $time_iso8601 $year {default 'date';'~^(?<yyyy>d{4})-' $yyyy;}map $time_iso8601 $month {default 'not';'~^d{4}-(?<mm>d{2})-' $mm;}map $time_iso8601 $day {default 'found';'~^d{4}-d{2}-(?<dd>d{2})' $dd;}#日志按年-月-日名称格式存放#map $time_iso8601 $logfile_date {# default 'date-not-found';# '~^(?<year>d{4})-(?<month>d{2})-(?<day>d{2})' $year-$month-$day;#}#日志按年-月名称格式存放map $time_iso8601 $logfile_month {default 'date-not-found';'~^(?<year>d{4})-(?<month>d{2})' $year-$month;}} 
使用 map 定义好变量之后 , 即可在配置访问日志记录时使用该变量:
access_log logs/$logfile_month.access.log;
access_log 指令可以在 http 字段内 , 也可以在 server 字段内 。
配置好后 , 如果遇到日志文件并没有生成的问题 , 则可能是 logs 目录权限导致 , 需要赋予 logs 目录 nginx 启动用户的权限(这是在日志路径中使用变量的一些限制 , 参考官方:Nginx 日志模块说明) 。假设 nginx 以 www 组的 www 用户启动 , 则:
chown -R www:www logs/
最终生成的日志效果如下:

Nginx日志配置经验分享

文章插图
 

Nginx日志配置经验分享

文章插图
 
关于在日志路径中使用变量的限制 , 包括:


推荐阅读