Linux下玩转nginx系列(三)---nginx日志配置文件说明

article/2025/5/15 10:57:33

nginx日志共三个参数。

access_log: 定义日志的路径及格式。

log_format: 定义日志的模板。

open_log_file_cache: 定义日志文件缓存。

nginx access日志配置

access_log日志配置

access_log用来定义日志级别,日志位置。语法如下:
日志级别: debug > info > notice > warn > error > crit > alert > emerg

语法格式: access_log path [format [buffer=size] [gzip[=level]]
[flush=time] [if=condition]];
access_log off;
默认值 : access_log logs/access.log combined;
作用域 : http, server, location, if in
location, limit_except

• path 指定日志的存放位置。

• format 指定日志的格式。默认使用预定义的combined。

• buffer 用来指定日志写入时的缓存大小。默认是64k。

• gzip 日志写入前先进行压缩。压缩率可以指定,从1到9数值越大压缩比越高,同时压缩的速度也越慢。默认是1。

• flush 设置缓存的有效时间。如果超过flush指定的时间,缓存中的内容将被清空。

• if 条件判断。如果指定的条件计算为0或空字符串,那么该请求不会写入日志。

另外,还有一个特殊的值off。如果指定了该值,当前作用域下的所有的请求日志都被关闭。

示例:

基本用法

access_log /var/logs/nginx-access.log

该例子指定日志的写入路径为/var/logs/nginx-access.log,日志格式使用默认的combined。

access_log /var/logs/nginx-access.log buffer=32k gzip flush=1m

该例子指定日志的写入路径为/var/logs/nginx-access.log,日志格式使用默认的combined,指定日志的缓存大小为32k,日志写入前启用gzip进行压缩,压缩比使用默认值1,缓存数据有效时间为1分钟。

log_format 定义日志格式

语法格式: log_format name [escape=default|json] string …;
默认值 : log_format combined “…”;
作用域 : http

• name 格式名称。在access_log指令中引用。

• escape 设置变量中的字符编码方式是json还是default,默认是default。

• string 要定义的日志格式内容。该参数可以有多个。参数中可以使用Nginx变量。

示例:

access_log /var/logs/nginx-access.log main log_format main
‘$remote_addr - r e m o t e u s e r [ remote_user [ remoteuser[time_local] “KaTeX parse error: Double superscript at position 11: request"' '̲status
b o d y b y t e s s e n t " body_bytes_sent " bodybytessent"http_referer”’ ‘“ h t t p u s e r a g e n t " " http_user_agent" " httpuseragent""http_x_forwarded_for”’;

我们使用log_format指令定义了一个main的格式,并在access_log指令中引用了它。假如客户端有发起请求:https://suyunfe.com/,我们看一下我截取的一个请求的日志记录:

124.78.32.26 - - [12/Mar/2022:22:18:20 +0800] “GET / HTTP/1.1” 200 569 “-” “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51
Safari/537.36” “-”

我们看到最终的日志记录中 r e m o t e u s e r 、 remote_user、 remoteuserhttp_referer、$http_x_forwarded_for都对应了一个-,这是因为这几个变量为空。

设置error_log

错误日志在Nginx中是通过error_log指令实现的。该指令记录服务器和请求处理过程中的错误信息。

  • 语法
    配置错误日志文件的路径和日志级别。

error_log file [level];
Default:
error_log logs/error.log error;

第一个参数指定日志的写入位置。
第二个参数指定日志的级别。level可以是debug, info, notice, warn, error, crit, alert,emerg中的任意值。可以看到其取值范围是按紧急程度从低到高排列的。只有日志的错误级别等于或高于level指定的值才会写入错误日志中。默认值是error。

  • 基本用法

error_log /var/logs/nginx/nginx-error.log

它可以配置在:main, http, mail, stream, server, location作用域。
例子中指定了错误日志的路径为:/var/logs/nginx/nginx-error.log,日志级别使用默认的error。

常见的日志变量

• $remote_addr, $http_x_forwarded_for 记录客户端IP地址。

• $remote_user记录客户端用户名称。

• $request记录请求的URL和HTTP协议(GET,POST,DEL,等)。

• $status记录请求状态。

• $body_bytes_sent发送给客户端的字节数,不包括响应头的大小; 该变量与Apache模块mod_log_config里的“%B”参数兼容。

• $bytes_sent发送给客户端的总字节数。

• $connection连接的序列号。

• $connection_requests 当前通过一个连接获得的请求数量。

• $msec 日志写入时间。单位为秒,精度是毫秒。

• $pipe如果请求是通过HTTP流水线(pipelined)发送,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)。

• max 设置缓存中的最大文件描述符数量,如果缓存被占满,采用LRU算法将描述符关闭。

• inactive 设置存活时间,默认是10s。

• min_uses 设置在inactive时间段内,日志文件最少使用多少次后,该日志文件描述符记入缓存中,默认是1次。

• valid 设置检查频率,默认60s。

• off 禁用缓存。

语法格式: open_log_file_cache max=N [inactive=time] [min_uses=N]
[valid=time];
open_log_file_cache off;
默认值: open_log_file_cache off;
作用域: http, server, location

示例

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

它可以配置在http、server、location作用域中。
例子中,设置缓存最多缓存1000个日志文件描述符,20s内如果缓存中的日志文件描述符至少被被访问2次,才不会被缓存关闭。每隔1分钟检查缓存中的文件描述符的文件名是否还存在。

nginx日志调试技巧

设置 Nginx 仅记录来自于指定的 IP 的错误

当设置日志级别成 debug,如果在调试一个在线的高流量网站的话,错误日志可能会记录每个请求的很多消息,这样会变得毫无意义。
在events{…}中配置如下内容,可以使 Nginx 记录仅仅来自于指定的 IP 的错误日志。

events {
debug_connection 1.2.3.4;
}

调试 nginx rewrite 规则

调试rewrite规则时,如果规则写错只会看见一个404页面,可以在配置文件中开启nginx rewrite日志,进行调试。

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

rewrite_log on; 开启后,它将发送所有的 rewrite 相关的日志信息到 error_log 文件中,使用 [notice] 级别。随后就可以在error_log 查看rewrite信息了。

使用location记录指定URL的日志

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

配置以上配置后,/static/ 相关的日志会被单独记录在static-error.log文件中。

常用例子

main格式

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"''$upstream_addr $upstream_response_time $request_time ';
access_log  logs/access.log  main;

json格式

log_format logstash_json '{"@timestamp":"$time_iso8601",''"host": "$server_addr",''"client": "$remote_addr",''"size": $body_bytes_sent,''"responsetime": $request_time,''"domain": "$host",''"url":"$request_uri",''"referer": "$http_referer",''"agent": "$http_user_agent",''"status":"$status",''"x_forwarded_for":"$http_x_forwarded_for"}';

解释:

u r i 请 求 中 的 当 前 U R I ( 不 带 请 求 参 数 , 参 数 位 于 uri请求中的当前URI(不带请求参数,参数位于 uriURI(args),不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改。不包括协议和主机名,例如/foo/bar.html。
r e q u e s t u r i 这 个 变 量 等 于 包 含 一 些 客 户 端 请 求 参 数 的 原 始 U R I , 它 无 法 修 改 , 请 查 看 request_uri 这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看 requesturiURIuri更改或重写URI。也就是说: r e q u e s t u r i 是 原 始 请 求 U R L , request_uri是原始请求URL, requesturiURLuri则是经过nginx处理请求后剔除参数的URL,所以会将汉字表现为union。

坑点:

使用 u r i 可 以 在 n g i n x 对 U R L 进 行 更 改 或 重 写 , 但 是 用 于 日 志 输 出 可 以 使 用 uri可以在nginx对URL进行更改或重写,但是用于日志输出可以使用 uringinxURL使request_uri代替,如无特殊业务需求,完全可以替换。

压缩格式

日志中增加了压缩的信息。

http {log_format compression '$remote_addr - $remote_user [$time_local] ''"$request" $status $body_bytes_sent ''"$http_referer" "$http_user_agent" "$gzip_ratio"';server {gzip on;access_log /spool/logs/nginx-access.log compression;...}
}

upstream格式

增加upstream消耗的时间。

http {log_format upstream_time '$remote_addr - $remote_user [$time_local] ''"$request" $status $body_bytes_sent ''"$http_referer" "$http_user_agent"''rt=$request_time uct="$upstream_connect_time" uht="$upstream_header_time" urt="$upstream_response_time"';server {access_log /spool/logs/nginx-access.log upstream_time;...}
}

总结

Nginx中通过access_log和error_log指令配置访问日志和错误日志,通过log_format我们可以自定义日志格式。如果日志文件路径中使用了变量,我们可以通过open_log_file_cache指令来设置缓存,提升性能。

另外,在access_log和log_format中使用了很多变量,这些变量没有一一列举出来,详细的变量信息可以参考Nginx官方文档

查看日志使用技巧

统计status 出现的次数

awk '{print $9}' access.log | sort | uniq -c | sort -rn36461 200 
483 500
9 400
3 302
1 403
1 301

显示返回302状态码的URL

awk '($9 ~ /302/)' access.log | awk '{print $7}' | sort | uniq -c | sort -rn1 /anyrtc.png
1 /test.html

参考文档

Nginx日志配置详解
如何在Nginx中配置自定义访问和错误日志格式
Full Example Configuration

在这里插入图片描述


http://chatgpt.dhexx.cn/article/C8mZa5j1.shtml

相关文章

Linux中级实战专题篇三:nginx服务(日志介绍,作用域,格式定义,流量控制,访问控制模块,用户信任登录)

Nginx 日志配置 1、Nginx 日志介绍 Nginx 有一个非常灵活的日志记录模式,每个级别的配置可以有各自独立的访问日志, 所需日志模块 ngx_http_log_module 的支持,日志格式通过 log_format 命令来定义,日志对于统计和排错是非常有利的,下面总结…

英媒:知名色情网站约80万名用户账号遭曝光

英媒称,色情网站Brazzers约80万登记用户的资料遭曝光。黑客从与网站有关的论坛中窃取这些数据。 英国广播公司网站9月7日报道,Brazzersforum是给Brazzers用户讨论影片内容和演员的论坛,很多人看来在两个网站上使用相同的登录名称和密码&#…

黑客团体Anonymous宣称已经攻陷40家儿童色情网站

Anonymous从一成立以来就连续攻击企业和联邦政府的网站,他们的大部分攻击行动公然违法,但事实上这一组织向来以自己的价值观行事,例如他们对儿童色情网站深恶痛绝,在攻击上述网站的同时,自愿扮演起正义维护者的角色。 …

一个emoji表情包处理工具类

一个emoji表情包处理工具类 参考业务场景解决方案方案一(mysql字符集)方案二(emoji表情包转码) 尊重他人成果、转载请注明出处 参考 https://github.com/vdurmont/emoji-java 业务场景 在常规如APP推送、BBS、论坛等类型的业务系…

有趣的表情包购物网站

首页 一个轮播图 首页 换肤 产品页 一个放大镜 我的账户界面 产品信息界面 一个打星小程序 可增删 以及删除的购物车界面

怎么自己制作动图表情包?在线gif生成的操作步骤

gif表情包在我们平时的生活里斗图的时候经常会用到,那么如何用图片制作gif(https://www.gif.cn)表情包呢?今天就分享一个在线gif生成的简单方法,利用gif制作工具将图片转gif动图,下面是详细的操作步骤。 打…

表情符号(emoji)大全,只此一文便够了

本文由 大侠(AhcaoZhu)原创,转载请声明。 链接: https://blog.csdn.net/Ahcao2008 表情符号(emoji)大全、只此一文便够了 摘要集中展示笑脸和动物人庆贺和物品食品和物交通和地点符号 符号表smileys_and_peopleanimals_and_naturefood_and_dr…

热门聊天表情包怎么找?怎么制作?多平台表情合集,没有找不到的表情包!搞笑-金馆长-张家辉-卡通-二次元-gif等表情大全

去年的时候我做了一个表情包的小程序:i表情助手。 第一个版本做的比较简陋,一是表情图片资源比较少,二是需要用户填写文案制作,总的来说还是不够好用,所以一直没有进行推广。 过完年放完假回来,我决定好好…

22、实现发送文字、表情包

实现发送文字、表情包 一、 发送原理 二、 前端处理核心方法三、 后端逻辑处理函数 func dispatch(data[]byte)四、对端接收到消息后处理函数五、表情包简单逻辑六、发送图片流程七、 发送语音八、 发送视频测试 实现发送文字、表情包 一、 发送原理前端user1拼接好数据对象 …

是谁在Go标准库的源码中植入了色情网站?

昨天,有网友在群里说在GitHub上发现了色情网站! GitHub上怎么会有色情网站呢?网友给出了下面的截图: 这个出现在Go标准库中的Issue里面,有一个url… 该Issue地址:https://github.com/golang/go/issues/488…

调皮的表情图(Emoji)

调皮的表情&#xff08;Emoji&#xff09; 示例HTMLCSSJS 更多有趣示例 尽在 知屋安砖社区 示例 HTML <div class"main"><div class"emoji"><div class"emoji__eyes abs"><div class"emoji__eye"></div&…

现表情包大幅流行,今天教你们开发个人表情包网站

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于腾讯云 作者&#xff1a;python学习教程 ( 想要学习Python&#xff1f;Python学习交流群&#xff1a;1039649593&#xff0c;满足你的需求…

python是世界上最好的语言表情包_语言表情包 - 语言微信表情包 - 语言QQ表情包 - 发表情 fabiaoqing.com...

如果你有一个朋友很久没跟你联系了一是他死了是他是学汉语言的三是他在期末考试如果他既是汉语言的又在准备期末考试你就当他死了吧 - 汉语言专业表情包 对方不想和你说话,向你推荐了世界上最好的语言!(PHP)_PHP_语言_对方表情 组织语言中(写作业中)_作业_语言_组织表情 …

情网

情网 我掩饰不住的慌张&#xff0c;在迫不急待地张望&#xff0c;生怕这一路是好梦一场。而你是一张无边无际的网&#xff0c;轻易就把我困在网中央&#xff0c;我越陷越深越迷惘&#xff0c;路越走越远越漫长&#xff0c;如何我才能锁住你眼光。情愿就这样守在你身旁&#xff…

javaScript基础面试题 -- 延迟加载JS有哪些方式?

延迟加载JS有哪些方式&#xff1f; js脚本放置在不同位置&#xff0c;对页面加载的不同影响defer与async的区别&#xff1a; 回答&#xff1a;defer 与 async js脚本放置在不同位置&#xff0c;对页面加载的不同影响 关于这个问题&#xff0c;首先来介绍一下&#xff0c;js脚本…

14道高频手写JS面试题及答案,巩固你的JS基础

目录 1. 手写深拷贝 2. 防抖函数 3. 节流函数 4. 模拟 instanceof 5. 全局通用的数据类型判断方法 6. 手写 call 函数 7. 手写 apply 函数 8. bind方法 9. 模拟 new 10. 类数组转化为数组的方法 11. 组合继承 12. 原型式继承 13. 实现 Object.create() 14. 数组…

javaScript基础面试题 --数据类型和考题

简单数据类型和复杂数据类型 简单类型&#xff08;基本数据类型、值类型&#xff09;&#xff1a;在存储时变量中存储的是值本身&#xff0c;包括string &#xff0c;number&#xff0c;boolean&#xff0c;undefined&#xff0c;null 复杂数据类型&#xff08;引用类型&…

分享一些常用的 JS 基础面试题

介绍 此篇属于前端算法入门系列的第一篇&#xff0c;主要介绍常用的数组方法、字符串方法、遍历方法、高阶函数、正则表达式以及相关数学知识。 前端算法入门一&#xff1a;刷算法题常用的JS基础扫盲[1]前端算法入门二&#xff1a;时间空间复杂度\&8大数据结构的JS实现[2]前…

js基础面试题总结

数据类型 什么是引用类型&#xff0c;值类型 值类型key与value的值存储再栈中&#xff08;量小&#xff09;医用类型再栈存储引用地址&#xff0c;在堆中存储数据&#xff08;量大&#xff09;把引用类型赋值给一个变量&#xff0c;是把变量的引用地址指向引用类型堆中地址 …

js基础常考面试题汇总(一)(附答案)

1.值类型和引用类型的区别 //值类型 let a 100 let b a a 200 console.log(b) //100 //引用类型 let a { age: 20 } let b a console.log(a.age) //21值类型&#xff1a;number, string, boolean, null, undefined, symbol(ES6)引用类型&#xff1a;Object(对象的子类: A…