当前位置:首页 > 天道酬勤 > 正文内容

()

张世龙2021年12月20日 20:12天道酬勤1220

立Flag 学习Ng - 日志切割

内容:

让我们来看看日志配置参数日志切割

日志切割

日志格式

Nginx有非常灵活的记录模式。 每个级别的配置都可以有独立的访问日志。 日志格式由log_format命令定义。 ngx_http_log_module用于定义请求日志格式。

以下内容其实在上一篇的配置项目中。 这里是主题学习

日志相关配置项(指令)

access_log

访问日志路径格式;

access _ logpathformatgzip [=等级]缓冲器=大小[闪存=时间];

访问日志系统服务器=地址[,参数=值] [格式];

访问注销;

gzip压缩级别buffer设置内存缓存大小。 flush在缓冲区中保存的最长时间的默认值为:

访问日志/访问. logcomwydxbced; 配置段:

HTP,服务器,位置,在位置,限制_退出

不记录日志:

访问注销;

以默认的comwydxbced格式记录:

访问日志/访问.日志

# #或

访问日志/访问. logcomwydxbced;

log_format

日志格式名称字符串…;

name表示格式名称。 string表示同义格式的默认值

log _格式组合“…”

配置段:

HTP

log_format有缺省的comwydxbced日志格式。 这相当于apache的comwydxbced日志格式,如下所示。

log _ formatcomwydxbced ' $远程- $远程_用户[ $时间_本地]

' $请求' $状态$主体_字节_森特'

$ http _引用者“$ http _用户代理”;

如果nginx位于负载平衡器、squid和nginx反向代理上,则web服务器将无法直接获取客户端的实际IP地址。 $remote_addr获取反向代理的IP地址。 反向代理服务器可以在转发请求的http标头信息中添加x-forded for信息,以记录客户端的IP地址和客户端所请求的服务器的地址。 如下所示。

log _ formatporxy ' $ http _ x _ forwarded _ for-$远程_用户[ $时间_本地] '

' $请求' $状态$主体_字节_森特'

$ http _引用者“$ http _用户代理”;

日志格式可以包含以下变量注释:

$remote_addr,$HTTP_x_forwarded_for记录客户端IP地址$remote_user记录客户端用户名$request记录请求的URL和http协议$bytes_sent发送给客户端的字节总数。 $连接的序列号。 $connection_requests当前通过一个连接获取的请求数。 $msec日志写入时间。 单位为秒,精度为毫秒。 如果通过HTTP管线(pipelined )发送$pipe请求,则pipe值为“p”,否则为“.”。 $http_referer记录通过哪个页面链接进行访问的$http_user_agent记录客户端浏览器相关信息$request_length请求的长度。 这包括请求行、请求头和请求正文。 $request_time请求处理时间,单位为秒,精度为毫秒; 从读取客户端的第一个字节到将最后一个字符发送到客户端再写入日志。 $time_iso8601 ISO8601标准格式下的本地时间。 $time_local通用日志格式的本地时间。 对于每个

open_log_file_cache

日志记录,打开文件,然后写入日志并关闭。 可以使用open_log_file_cache设置日志文件缓存。 默认值为off。

开启记录档

le_cache max=N [inactive=time] [min_uses=N] [valid=time]; open_log_file_cache off;

默认值:

open_log_file_cache off;

配置段:

http, server, location

参数注释如下:

max:设置缓存中的最大文件描述符数量,如果缓存被占满,采用 LRU 算法将描述符关闭。inactive:设置存活时间,默认是 10smin_uses:设置在 inactive 时间段内,日志文件最少使用多少次后,该日志文件描述符记入缓存中,默认是 1 次valid:设置检查频率,默认 60soff:禁用缓存

示例:

open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;

log_subrequest

是否在 access_log 中记录子请求的访问日志。默认不记录。

log_subrequest on | off;

默认值:

log_subrequest off;

配置段:

http, server, location

log_not_found

是否在 error_log 中记录不存在的错误。默认是。

语法:

log_not_found on | off;

默认值:

log_not_found on;

配置段:

http, server, location

rewrite_log

由 ngx_http_rewrite_module 模块提供的。用来记录重写日志的。对于调试重写规则建议开启。

启用时将在 error log 中记录 notice 级别的重写日志。

语法:

rewrite_log on | off;

默认值:

rewrite_log off;

配置段:

http, server, location, if

error_log

配置错误日志。

语法:

error_log file | stderr | syslog:server=address[,parameter=value] [debug | info | notice | warn | error | crit | alert | emerg];

默认值:

error_log logs/error.log error;

配置段:

main, http, server, location

切割

shell脚本

#!/wydxbc/bash LOGS_PATH=/usr/local/nginx/logs HISTORY_PATH=/usr/local/nginx/logs/history YESTERDAY=$(date -d "yesterday" +%Y-%m-%d) # 按照日期分割访问日志文件 mv "${LOGS_PATH}/access.log" "${HISTORY_PATH}/access_${YESTERDAY}.log" # 按照日期分割错误日志文件 mv "${LOGS_PATH}/error.log" "${HISTORY_PATH}/error_${YESTERDAY}.log" # 重新打开日志文件 kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)

添加定时任务

# 将脚本文件放在 /usr/local/nginx/swydxbc 目录下 # 赋予执行权限 chmod +x /usr/local/nginx/swydxbc/log_split.sh # 设置定时任务,每天0分0点执行一次 # 添加定时任务 crontab -e 0 0 1 * * /usr/local/nginx/swydxbc/og_split.sh # 查看定时任务 crontab -l # 删除定时任务 # 使用下面命令打开文件,删除相应信息 crontab -e

实操

这里仅是能正常输出日志,更多的细节以后遇到的时候在进行补充(,不然Flag就完不成啦)

指定日志输出位置和输出格式#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; keepalive_timeout 65; map $http_upgrade $connection_upgrade { default upgrade; '' close; } # log_format 这里注意下位置,一开始我写在了server里面,但是会报错 # 经验证需要放在外面 # 客户端ip - 客户端用户名称 - [时间] url 请求状态 发送给客户端的字节数(不包括响应头的大小) # 从哪个页面链接访问过来 客户端浏览器相关信息 log_format testformat '$http_x_forwarded_for - $remote_user [$time_local] ' ' "$request" $status $body_bytes_sent ' ' "$http_referer" "$http_user_agent" '; server { listen 80; server_name localhost; # 配置access.log 指定这个虚拟server的access日志路径 access_log /usr/local/nginx/logs/test_access.log; location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }

测试访问80端口后查看对应路径存在test_access.log日志。

查看日志信息

# 客户端ip - 客户端用户名称 - [时间] url 请求状态 发送给客户端的字节数(不包括响应头的大小) 从哪个页面链接访问过来 客户端浏览器相关信息 10.1.112.115 - - [12/Jan/2021:14:16:41 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36"

这里可以看到日志输出的信息是符合我们自定义的格式的。

编写shell脚本进行日志切割# 进入目录 > cd /usr/local/nginx/swydxbc # 创建文件 > vim test_nglog_split # 写入如下内容 #!/wydxbc/bash LOGS_PATH=/usr/local/nginx/logs HISTORY_PATH=/usr/local/nginx/logs/history YESTERDAY=$(date -d "yesterday" +%Y-%m-%d) # 按照日期分割访问日志文件 mv "${LOGS_PATH}/test_access.log" "${HISTORY_PATH}/test_access${YESTERDAY}.log" # 按照日期分割错误日志文件 mv "${LOGS_PATH}/error.log" "${HISTORY_PATH}/error_${YESTERDAY}.log" # 重新打开日志文件 kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid) # 赋予执行权限 > chmod +x /usr/local/nginx/swydxbc/test_nglog_split # 设置定时任务,这里为了测试就把时间周期改为每分钟执行一次 # 添加定时任务 > crontab -e */1 * * * * /usr/local/nginx/swydxbc/test_nglog_split # 新创建的cron job,不会马上执行,至少要过2分钟才执行。如果重启cron则马上执行 > /etc/init.d/crond restart # 进入history目录验证 > cd /usr/local/nginx/logs/history > ll -rw-r--r-- 1 nobody root 2060 Jan 12 14:45 error_2021-01-11.log -rw-r--r-- 1 nobody root 304 Jan 12 14:45 test_access2021-01-11.log # 删除测试的定时任务 > crontab -e

比较简单的应用,后面遇到更详细的场景需求如果我记得会再写一篇补充文档。(毕竟我不是做运维工作的,遇到的场景会比较少)

扫描二维码推送至手机访问。

版权声明:本文由花开半夏のブログ发布,如需转载请注明出处。

本文链接:https://www.zhangshilong.cn/work/25847.html

分享给朋友:

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。