nginx日志
1.1 Nginx日志描述
通过访问日志,你可以得到用户地域来源、跳转来源、使用终端、某个URL访问量等相关信息;通过错误日志,你可以得到系统某个服务或server的性能瓶颈等。因此,将日志好好利用,你可以得到很多有价值的信息。
1.2 Nginx日志格式
打开nginx.conf配置文件:vim /usr/local/nginx/conf/nginx.conf
日志部分内容:
#access_log logs/access.log main;
日志生成的到Nginx根目录logs/access.log文件,默认使用“main”日志格式,也可以自定义格式。
默认“main”日志格式:
参数明细表:
$remote_addr |
客户端的ip地址(代理服务器,显示代理服务ip) |
---|---|
$remote_user |
用于记录远程客户端的用户名称(一般为“-”) |
$time_local |
用于记录访问时间和时区 |
$request |
用于记录请求的url以及请求方法 |
$status |
响应状态码,例如:200成功、404页面找不到等。 |
$body_bytes_sent |
给客户端发送的文件主体内容字节数 |
$http_user_agent |
用户所使用的代理(一般为浏览器) |
$http_x_forwarded_for |
可以记录客户端IP,通过代理服务器来记录客户端的ip地址 |
$http_referer |
可以记录用户是从哪个链接访问过来的 |
查看日志命令tail -f /usr/local/nginx/logs/access.log
1.3 Nginx自定义日志
打开nginx.conf配置文件去掉#注释见下图:
自定义某一个server配置的日志,使用“main”日志格式。
日志生成的到Nginx根目录logs/access.log文件,默认使用“main”日志格式,也可以自定义格式。
重新读取加载Nginx配置文件:
执行命令:nginx-s reload
查看日志文件:
执行命令:tail -100f /usr/local/nginx/logs/abc.access.log
1.4 Nginx日志分隔
nginx的日志文件没有rotate功能。编写每天生成一个日志,我们可以写一个nginx日志切割脚本来自动切割日志文件。
第一步就是重命名日志文件,不用担心重命名后nginx找不到日志文件而丢失日志。在你未重新打开原名字的日志文件前,nginx还是会向你重命名的文件写日志,Linux是靠文件描述符而不是文件名定位文件。
第二步向nginx主进程发送USR1信号。nginx主进程接到信号后会从配置文件中读取日志文件名称,重新打开日志文件(以配置文件中的日志名称命名),并以工作进程的用户作为日志文件的所有者。重新打开日志文件后,nginx主进程会关闭重名的日志文件并通知工作进程使用新打开的日志文件。工作进程立刻打开新的日志文件并关闭重名名的日志文件。然后你就可以处理旧的日志文件了。[或者重启nginx服务]。
nginx日志按每分钟自动切割脚本如下:
新建shell脚本:vi/usr/local/software/nginx/nginx_log.sh
#!/bin/bash
#设置日志文件存放目录
LOG_HOME="/usr/local/software/nginx/logs/"
#备分文件名称
LOG_PATH_BAK="$(date -d yesterday +%Y%m%d%H%M)".abc.access.log
#重命名日志文件
mv ${LOG_HOME}/abc.access.log ${LOG_HOME}/${LOG_PATH_BAK}.log
#向nginx主进程发信号重新打开日志
kill -USR1 `cat /usr/local/software/nginx/logs/nginx.pid`
创建crontab设置作业
#设置日志文件存放目录crontab -e
*/1 * * * * sh /usr/local/software/nginx/nginx_log.sh
- 10个大数据误区,看看你中了几个?
- 从数据到代码——通过代码生成机制实现强类型编程[上篇]
- Spring读书笔记——bean加载
- Java8-初识Lambda
- 我的WCF之旅(5):面向服务架构(SOA)和面向对象编程(OOP)的结合——如何实现Service Contract的重载(Overloading)
- WCF技术剖析之三十:一个很有用的WCF调用编程技巧[下篇]
- 谈谈WCF中的Data Contract(3):WCF Data Contract对Collection & Dictionary的支持
- WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载]
- 我的WCF之旅(4):WCF中的序列化[下篇]
- [WCF权限控制]模拟(Impersonation)与委托(Delegation)[上篇]
- Android EclipseIDE技巧
- 什么是编译错误,运行时错误及逻辑错误?
- 我的WCF之旅(4):WCF中的序列化[上篇]
- WCF技术剖析之二十八:自己动手获取元数据[附源代码下载]
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【Flutter 实战】1.20版本更新及新增组件
- 手把手教你使用Python实现常用的假设检验 !
- Oracle 每日一题系列合集
- Arrow更好用的python时间序列处理库,你用过吗?
- 死信队列监听补充
- 手把手教你用Python查询你的物流信息
- Selenium自动登录淘宝,我无意间发现了登录漏洞!
- 【DB宝20】在Docker中分分钟即可拥有OGG Director环境
- mq监听死信队列后如何处理
- 【小白学PyTorch】7 最新版本torchvision.transforms常用API翻译与讲解
- 小白学PyTorch | 8 实战之MNIST小试牛刀
- 干货:用好VSCode这13款插件和8个快捷键,工作效率提升10倍
- 使用dplyr包对表格整理
- 安利 5 个拍案叫绝的 Matplotlib 骚操作!
- 多媒体程序开发