一  日志

①  nginx与日志相关的指令

access_log   log_format   error_log  rewrite_log  log_subrequest  debug_connection

rewrite_log  limit_conn_log_level  limit_req_log_level  log_not_found  open_log_file_cache

uninitialized_variable_warn  log_not_found

②  关注点

1) 根据'需求',合理配置'日志格式'

2) 注意'默认'日志格式、日志级别

3) 日志能分析'哪些问题'、组成日志格式的'变量信息源是哪些模块提供的'

4) 日志转储、日志防爆、日志切割  --> "尤其证书加密的场景"

③  error_log 

1) 为精确定位nginx'错误'日志,使用自带的'error_log'指令定义错误日志目录及记录错误日志的等级

2) nginx错误日志'平时'不用太关注,但是一旦出了问题,就需要借助错误日志来'判断问题'所在

3) 注意:'无法'自定义错误日志格式;可以调整'日志级别'记录不同的错误信息;调整粗错误日志存储位置

4) 需要观察nginx的'13'个阶段,需要'debug' --> nginx -V校验'/configure --with-debug'

5) 不推荐'同一个配置段里'定义了多个error_log会产生冲突

6) 错误日志格式'不支持自定义'日志格式

nginx日志文件不显示中文 nginx日志乱码_access_log

nginx默认错误日志配置的信息解读   error_log /dev/null和error_log off区别

nginx日志文件不显示中文 nginx日志乱码_log_format_02

debugging log

nginx日志文件不显示中文 nginx日志乱码_access_log_03

nginx日志文件不显示中文 nginx日志乱码_nginx_04

④   nginx error_log日志调试技巧

背景: 因为'error_log'指令开启'debug 级别'的'打印'太多,所以要学习'debug_connection'

debug_connection     通过debug日志定位问题

特点: 只让'特定ip'的请求日志为'deug'级别,'其余请求'的日志级别保持'error_log'指令的设置

引申: 该指令'ip信息来源'是'$remote_addr'吗? 跟'客户端真实ip'的关系?

nginx日志文件不显示中文 nginx日志乱码_nginx_05

nginx日志文件不显示中文 nginx日志乱码_nginx_06

需求1: 仅记录'固定ip'的错误日志,一般是'开发或者运维人员'机器的ip发过来的请求用于'调测'

备注:  由于'error_log'无法在if指令的上下文中使用,无法通过'if ($remote='xxx')'记录

细节:  如果在'enents'指令中'新增'配置,'reload'即可生效;生产中对于'必现'问题'可线上配置

nginx日志文件不显示中文 nginx日志乱码_access_log_07

思考: 通过'debug'级别的日志我们能'分析'什么?

1、nginx作为'server'端,从客户端'接收 request header'信息

2、分析'find location'的过程,然后定位'using configuration'就知道使用了'哪个'location

3、nginx作为'反向代理',发送给上游的'request header'信息 

4、nginx作为'反向代理'从'上游接收'的'response header'信息

nginx日志文件不显示中文 nginx日志乱码_nginx日志文件不显示中文_08

需求2: 调试 nginx 'rewrite' 规则

server {
    error_log    /var/logs/nginx/example.com.error.log;
    rewrite_log on;
}

特点:开启后,它将发送'所有的 rewrite 相关'的日志信息到 error_log 文件中,使用'notice'级别

rewrite_log 

nginx日志文件不显示中文 nginx日志乱码_access_log_09

需求3: 通过 syslog 将日志发送到'统一服务器'

场景: error_log配置syslog'远程传输'

补充: 增加'syslog'一行记录'在记录nginx错误日志的同时',会'同时记录'访问日志到syslog服务器

nginx的access_log和error_log支持记录到操作系统的syslog

nginx 用syslog传输error.log到远程服务器

nginx日志文件不显示中文 nginx日志乱码_log_format_10

error_log off 指令

需求4: 使用location记录'指定URL'的日志  --> "日志排错"

server {
        error_log    /var/logs/nginx/$hostname.error.log;
        location /static {
          error_log /var/logs/nginx/static-error.log debug; 
    }         
}

⑤  log_format

1) 用于定义日志格式的 'log_format' 指令仅适用于 'http 块'级指令内

2) 所有'时间值'均以'毫秒'为单位

3) 可以在'日志格式'中定义所有的出现的'$variable'变量

  备注: 非'json'格式,推荐'content-length=[$content-length] '日志格式

4) log_format对'字符串'进行转义配置,nginx '1.11.8之后'的版本才引入该指令

 细节: escape 参数'1.11.8'允许在变量中设置 'json 或 default' 字符转义

 [1]、escape=default  --> "默认值"

 备注1: 默认'"'、'\'、'ASCII<32'、'ASCII>126',会被转义为'\xXX'的'16'进制格式

 备注2: 如果'找不到'变量值,将记录连字符"-"

 [2]、escape=json     --> 解决'非法json值'和'未转义字符串'的问题

 特点1: 所有 JSON 字符串中'不允许'的字符都将'被转义'

 特点2: 字符 '"' 和 '\' 被转义为 '\"' 和 '\\'

 特点3: 值小于 32 的字符被转义为 '\n','\r','\t'、'\b'、'\f' 或 '\u00XX'

 备注: Unicode转义'\u00XX'的编码和解码 --> '\u0000-\u00ff'

 [3]、escape=none     --> "什么字符都不转义",禁用转义

nginx日志文件不显示中文 nginx日志乱码_nginx_11

+++++++++++ "关于头部的补充说明" +++++++++++

1) '$http_name'          --> client发送给'nginx'的'原始请求头'

2) '$sent_http_name'     --> nginx'发送给'客户端的'响应头',经过'filter'之后

3) '$upstream_http_name' --> '后端'发送给'nginx'的'原始'响应头

注意: nginx'模块'提供的变量

补充: 变量'不区分'大小写,变量'脱敏' --> '$COOKIE_flag'

nginx日志文件不显示中文 nginx日志乱码_access_log_12

⑥  log_format中的escape=json

应用场景: 为了配合'ELK'做日志分析,需要将nginx的日志转为'json'格式

解决: 部分json字符串'不能正常'解析,主要体现在'非法json值'和'未转义字符串'的问题

核心点1:map的指令'创建一个变量',该变量由其它变量通过一个'映射表置换'得来

通过map脱敏在 access_log 中混淆密码

1) 在$upstream_response_time为'空'的时候返回'0',而不是'-',将该值赋值给'新变量'

map $upstream_response_time $upstream_response_timer {
    default $upstream_response_time;
    ""        0;
}

2) 'json'格式的日志

log_format json escape=json '{"@timestamp":"$time_iso8601",'
            '"@version":"1",'
            '"server_addr":"$server_addr",'
            '"upstream_response_time":$upstream_response_timer,'
            '"remote_addr":"$remote_addr"'
            '}';

细节1: 可以分开'多行'书写,只要最后一行';'结尾即可

细节2: 日志格式一定要符合'json字符串'的日志格式

细节3: 外面'单引号'包括,里面的字符串"双引号"包括

json字符串格式

⑦  access_log

'默认': access_log logs/access.log combined gzip=1 flush=64K;

备注: 只要使用'buffer or gzip'之一,日志就会'buffer' 

access_log: 用来指定日志文件的'存放路径'、'格式'和'缓存'大小

补充: 不开启'buffer'时,每条日志都'需要IO'开销

format: 定义的'某个'access_log的日志'名称'

场景: 如果每次进行'磁盘'操作,将会较多的耗费资源,基于这个情况可以'开启' nginx 日志缓冲区

效果: 缓冲区'满'或者定时写入的'时间到了',再一次写入日志

nginx日志文件不显示中文 nginx日志乱码_nginx日志文件不显示中文_13

nginx日志文件不显示中文 nginx日志乱码_log_format_14

日志缓冲区'参数':'buffer'、'flush'

nginx日志文件不显示中文 nginx日志乱码_log_format_15

access_log 中'path[file]'指定'日志文件'

注意事项:

 [1]、'日志目录'中,nginx进程设置的'用户和组'必须有对该路径'创建文件'的权限

nginx日志文件不显示中文 nginx日志乱码_nginx_16

if: 通过变量'判断'日志是否记录

nginx日志文件不显示中文 nginx日志乱码_access_log_17

应用场景: 不依赖'crontab或lograte'的日志切割;'不推荐',影响效率

if ($time_iso8601 ~ "(\d{4}-\d{2}-\d{2})") {
   set $daily $1;
}
access_log /log/blog_access_$daily.log;

nginx的日志切割   escape=json解决中文乱码  日志分析的工具

PLG做nginx日志展示  根据access_log的日志格式做统计分析

⑧  open_log_file_cache  了解

nginx日志文件不显示中文 nginx日志乱码_access_log_18

⑨  log_subrequest  rewrite_log

注意: 默认都是'off'

nginx日志文件不显示中文 nginx日志乱码_nginx_19

nginx日志文件不显示中文 nginx日志乱码_nginx_20

nginx access访问日志分析

nginx -s reopen日志切割

nginx日志文件不显示中文 nginx日志乱码_nginx_21

⑩  题外话

思考:nginx什么情况'不记录'日志?

题外话:

  1) include file '相对路径为'--conf-path文件所在的目录

  2) 其它指令 file '相对路径为'--prefix所在的目录

nginx日志文件不显示中文 nginx日志乱码_nginx_22

nginx日志文件不显示中文 nginx日志乱码_access_log_23

nginx学习资料整理  借助 SSL/TLS 和 NGINX 进行 Web 流量加密

disable_symlinks   max_ranges

max_ranges 0 的时候表示'不支持range-bytes',即不支持http'断点续传'

nginx日志文件不显示中文 nginx日志乱码_nginx日志文件不显示中文_24