Nginx R31 doc-16-logging 配置日志

前言

大家好,我是老马。很高兴遇到你。

我们为 java 开发者实现了 java 版本的 nginx

https://github.com/houbb/nginx4j

如果你想知道 servlet 如何处理的,可以参考我的另一个项目:

手写从零实现简易版 tomcat minicat

手写 nginx 系列

如果你对 nginx 原理感兴趣,可以读一下

从零手写实现 nginx-01-为什么不能有 java 版本的 nginx?

从零手写实现 nginx-02-nginx 的核心能力

从零手写实现 nginx-03-nginx 基于 Netty 实现

从零手写实现 nginx-04-基于 netty http 出入参优化处理

从零手写实现 nginx-05-MIME类型(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展类型)

从零手写实现 nginx-06-文件夹自动索引

从零手写实现 nginx-07-大文件下载

从零手写实现 nginx-08-范围查询

从零手写实现 nginx-09-文件压缩

从零手写实现 nginx-10-sendfile 零拷贝

配置日志记录

在日志文件中详细记录错误和请求处理信息,可以选择在本地或通过 syslog 进行记录。

本文描述了如何在 NGINX Open Source 和 NGINX Plus 中配置错误日志和已处理请求的日志记录。

设置错误日志

NGINX 将不同严重程度的问题信息写入错误日志。error_log 指令设置日志记录到特定文件、stderr 或 syslog,并指定要记录的消息的最小严重程度级别。

默认情况下,错误日志位于 logs/error.log(绝对路径取决于操作系统和安装),并记录指定严重程度级别以上的所有消息。

以下配置将错误消息的最小严重程度级别从 error 更改为 warn:

error_log logs/error.log warn;

在这种情况下,将记录 warn、error、crit、alert 和 emerg 级别的消息。

错误日志的默认设置是全局的。要覆盖它,请将 error_log 指令放置在主(顶级)配置上下文中。主上下文中的设置始终会被其他配置级别(http、server、location)继承。error_log 指令也可以在 http、stream、server 和 location 级别指定,并覆盖从更高级别继承的设置。

在发生错误时,消息仅写入一个错误日志,即发生错误的级别最接近的日志。但是,如果在同一级别上指定了多个 error_log 指令,则消息将写入所有指定的日志。

注意:在 NGINX Open Source 版本 1.5.2 中添加了在同一配置级别上指定多个 error_log 指令的功能。

设置访问日志

NGINX 在请求处理完成后立即在访问日志中记录有关客户端请求的信息。默认情况下,访问日志位于 logs/access.log,并且信息以预定义的 combined 格式写入日志。要覆盖默认设置,请使用 log_format 指令更改记录消息的格式,以及 access_log 指令指定日志的位置和格式。日志格式使用变量定义。

以下示例定义了一个日志格式,扩展了预定义的 combined 格式,其中包含指示响应 gzip 压缩比的值。然后,将此格式应用于启用了压缩的虚拟服务器。

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;...}
}

另一个日志格式的示例可跟踪 NGINX 和上游服务器之间的不同时间值,这可能有助于诊断网站出现缓慢的问题。您可以使用以下变量记录指定的时间值:

  • $upstream_connect_time – 与上游服务器建立连接所花费的时间
  • $upstream_header_time – 从上游服务器建立连接到接收到响应头的第一个字节所花费的时间
  • $upstream_response_time – 从建立连接到从上游服务器接收到响应体的最后一个字节所花费的时间
  • $request_time – 处理请求所花费的总时间

所有时间值以秒为单位,毫秒为分辨率。

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;...}
}

在读取结果时间值时,请注意以下内容:

  • 当一个请求通过多个服务器处理时,变量包含用逗号分隔的多个值
  • 当存在从一个上游组到另一个的内部重定向时,值以分号分隔
  • 当请求无法到达上游服务器或无法接收到完整的头时,变量包含 0
  • 在连接到上游时出现内部错误或从缓存中获取回复时,变量包含 -(连字符)

通过启用消息日志的缓冲区和常用日志文件描述符的缓存,可以优化日志记录。使用 access_log 指令的 buffer 参数指定缓冲区的大小。当下一个日志消息不适合缓冲区时,以及在某些其他情况下,缓冲的消息随后写入日志文件。

要启用日志文件描述符的缓存,请使用 open_log_file_cache 指令。

与 error_log 指令类似,在特定配置级别上定义的 access_log 指令会覆盖来自前一级别的设置。

当请求处理完成时,消息将写入配置在当前级别上的日志,或从前一级别继承的日志。

如果一个级别定义了多个访问日志,消息将写入所有这些日志。

启用条件日志记录

条件日志记录允许从访问日志中排除微不足道或不重要的日志条目。在 NGINX 中,通过 access_log 指令的 if 参数来启用条件日志记录。

以下示例排除了 HTTP 状态码为 2xx(成功)和 3xx(重定向)的请求:

map $status $loggable {~^[23]  0;default 1;
}access_log /path/to/access.log combined if=$loggable;

用例:抽样 TLS 参数

许多客户端使用早于 TLS 1.3 的 TLS 版本。虽然许多密码被声明为不安全,但旧的实现仍在使用它们;ECC 证书比 RSA 提供更好的性能,但并非所有客户端都能接受 ECC。许多 TLS 攻击依赖于“中间人”,该中间人拦截密码协商握手并强制客户端和服务器选择较不安全的密码。因此,重要的是将 NGINX Plus 配置为不支持弱密码或遗留密码,但这样做可能会排除遗留客户端。

您可以评估从客户端获取的 SSL 数据,并确定如果删除对旧 SSL 协议和密码的支持,将有多少比例的客户端被排除在外。

以下配置示例记录了任何连接的 TLS 客户端的 SSL 协议、密码和 User-Agent 标头,假设每个客户端选择其支持的最新协议和最安全的密码。

在此示例中,每个客户端由其唯一的 IP 地址和 User-Agent 组合标识。

定义包括 SSL 协议版本($ssl_protocol)、连接中使用的密码($ssl_cipher)、客户端 IP 地址($remote_addr)和标准 User Agent HTTP 请求字段的值($http_user_agent)的自定义日志格式 sslparams:

log_format sslparams '$ssl_protocol $ssl_cipher ''$remote_addr "$http_user_agent"';

定义一个键值存储,将客户端的 IP 地址和其 User Agent 保存在其中,例如,clients:

keyval_zone zone=clients:80m timeout=3600s;

为每个唯一的 $remote_addr 和 User-Agent 标头组合创建一个变量,例如,$seen:

keyval $remote_addr:$http_user_agent $seen zone=clients;
server {listen 443 ssl;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_ciphers   HIGH:!aNULL:!MD5;if ($seen = "") {set $seen  1;set $logme 1;}access_log  /tmp/sslparams.log sslparams if=$logme;# ...
}

查看使用此配置生成的日志文件:

TLSv1.2 AES128-SHA 1.1.1.1 "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"
TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 2.2.2.2 "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1"
TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 3.3.3.3 "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:58.0) Gecko/20100101 Firefox/58.0"
TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 4.4.4.4 "Mozilla/5.0 (Android 4.4.2; Tablet; rv:65.0) Gecko/65.0 Firefox/65.0"
TLSv1 AES128-SHA 5.5.5.5 "Mozilla/5.0 (Android 4.4.2; Tablet; rv:65.0) Gecko/65.0 Firefox/65.0"
TLSv1.2 ECDHE-RSA-CHACHA20-POLY1305 6.6.6.6 "Mozilla/5.0 (Linux; U; Android 5.0.2; en-US; XT1068 Build/LXB22.46-28) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 UCBrowser/12.10.2.1164 Mobile Safari/537.36"

处理日志文件以确定数据的分布:

cat /tmp/sslparams.log | cut -d ' ' -f 2,2 | sort | uniq -c | sort -rn | perl -ane 'printf "%30s %s\n", $F[1], "="x$F[0];'

在此输出中,识别了低容量、不太安全的密码:

ECDHE-RSA-AES128-GCM-SHA256 =========================
ECDHE-RSA-AES256-GCM-SHA384 ========AES128-SHA ====
ECDHE-RSA-CHACHA20-POLY1305 ==ECDHE-RSA-AES256-SHA384 ==

然后,您可以检查日志以确定哪些客户端正在使用这些密码,然后做出有关从 NGINX Plus 配置中删除这些密码的决定。

有关使用 NGINX 条件日志记录进行请求抽样的更多信息,请参阅博客文章。

记录到 Syslog

syslog 实用程序是计算机消息记录的标准,它允许将日志消息从不同设备发送到单个 syslog 服务器。在 NGINX 中,通过 error_log 和 access_log 指令的 syslog: 前缀来配置日志记录到 syslog。

Syslog 消息可以发送到 server=,可以是域名、IP 地址或 UNIX 域套接字路径。域名或 IP 地址可以使用端口指定,以覆盖默认端口 514。UNIX 域套

接字路径可以在 unix: 前缀之后指定:

error_log  syslog:server=unix:/var/log/nginx.sock debug;
access_log syslog:server=[2001:db8::1]:1234,facility=local7,tag=nginx,severity=info;

在此示例中,NGINX 错误日志消息写入了一个 UNIX 域套接字,并设置为调试日志级别,访问日志写入了一个带有 IPv6 地址和端口 1234 的 syslog 服务器。

facility= 参数指定记录消息的程序类型。默认值为 local7。其他可能的值包括:auth、authpriv、daemon、cron、ftp、lpr、kern、mail、news、syslog、user、uucp、local0 ... local7。

tag= 参数将自定义标签应用于 syslog 消息(在我们的示例中为 nginx)。

severity= 参数设置了访问日志的 syslog 消息的严重级别。按照严重级别递增的可能值是:debug、info、notice、warn、error(默认)、crit、alert 和 emerg。消息以指定级别和所有更严重级别记录。在我们的示例中,严重级别 error 还启用了 crit、alert 和 emerg 级别的记录。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/17916.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SOLIDWORKS正版一年多少钱 2024版报价

SOLIDWORKS软件作为一款优秀的三维设计工具,以其强大的功能和优质的设计工具,为设计师们提供了前所未有的便利。SOLIDWORKS三维设计软件是一款多科学集成软件,它在产品开发和制造方面发挥着重要作用。 作为整个SOLIDWORKS产品开发解决方案套件…

SQL使用函数给多个分表添加同一字段

数据库中分表时,往往需要向多个分表中添加同一个字段,可以定义一个函数,每次调用这个函数向多个份表中添加同意字段。 1、创建函数示例: 在PostgreSQL中创建一个简单的函数 以下是一个在PostgreSQL中创建函数的简单示例&#x…

kotlin基础之高阶函数

Kotlin中的高阶函数、内联函数以及noinline和crossinline关键字是函数式编程中的重要概念。下面我将逐一解释这些概念的定义、实现原理、使用场景以及noinline和crossinline关键字的具体用法。 高阶函数 定义:高阶函数是接受一个或多个函数作为参数,或…

android上用QT实现绘制曲线及双指放大缩小

Android上用QT绘制曲线有多个绘图库可用,比如QCustomPlot,Qwt,Qchart,但经过博主测试在Android上并不是每种库都能满足要求,本文会进行三者对比,并给出一个android上可以实现双指滑动和放大缩小的具体解决方案及代码示例。 一.三种QT绘图库介绍 1.QCustomPlot在windows系统…

如何修改 Kafka 消息保留时长:经验总结

如何修改 Kafka 消息保留时长:经验总结 引言 Apache Kafka 是一种高性能的分布式消息系统,用于处理实时数据流。在实际使用中,我们可能需要根据业务需求调整 Kafka 消息的保留时长。本文将介绍如何修改 Kafka 消息保留时长,并分…

SEO之核心关键词(二)

初创企业或者需要建站的朋友看以下两篇文章,谢谢支持: 我给不会敲代码又想搭建网站的人建议新手上云 (接上一篇。。。。) 4、查询搜索次数 经过自己及朋友、同事的头脑风暴和检查竞争对手网站之后,再到Google 关键词…

用天工AI写文章,节约了8个人的成本

关注卢松松,会经常给你分享一些我的经验和观点。 当下AI工具最大的问题是什么? 是写的文章没有灵魂、没有感情、像机器人! 生成的文章官话连篇,人们一眼就看出是AI写的,这种文章怎么能给客户交差呢?自己这关都过不去,是吧? …

快乐数-力扣

使用一个set来存储遇到的每个数,如果遇到的数在set中,那么说明这个数不是快乐数,否则一直循环下去,直到n 1结束循环,表示这个数是个快乐数。 需要注意的是,给定一个数 n, 怎样对这个数 n 进行每一位求和。…

33 mid 55. 跳跃游戏

贪心算法&#xff1a; class Solution {public boolean canJump(int[] nums) {int leftBorder 0;for (int i 0; i <nums.length; i) {if(i<leftBorder){leftBorderMath.max(leftBorder,inums[i]);}if(leftBorder>nums.length-1){return true;}}return false;} }

操作系统——用户态与内核态、同步与异步、阻塞与阻塞

文章目录 什么是用户态与内核态同步与异步、阻塞与非阻塞四种组合方式 什么是用户态与内核态 计算机系统中&#xff0c;通常 CPU 执行两种不同性质的程序代码&#xff1a;一种是操作系统内核程序&#xff08;管理程序&#xff09;&#xff1b;另一种是用户自编程序&#xff08…

欢乐钓鱼大师攻略大全,游戏自动辅助,钓鱼大全!

欢迎来到《欢乐钓鱼大师》的攻略大全&#xff01;本文将为你详细介绍游戏中的各类玩法、技巧和注意事项&#xff0c;帮助你快速掌握游戏精髓&#xff0c;成为一名真正的钓鱼大师。攻略内容包括新手鱼竿选择、锦标赛攻略、实用技巧、藏宝图玩法、箱子开法等多个方面。让我们一起…

生成式AI模型大PK——GPT-4、Claude 2.1和Claude 3.0 Opus

RAG(检索增强生成)系统的新评估似乎每天都在发布&#xff0c;其中许多都集中在有关框架的检索阶段。然而&#xff0c;生成方面——模型如何合成和表达这些检索到的信息&#xff0c;在实践中可能具有同等甚至更大的意义。许多实际应用中的案例证明&#xff0c;系统不仅仅要求从上…

Leecode热题100---二分查找---搜索插入位置

题目&#xff1a; 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 nums 为 无重复元素 的 升序 排列数组 常规思路&#xff1a; class Solution { public:int f…

管理node——NVM安装及使用

NVM安装及使用 前言正文下载安装及配置一、卸载原有的node版本&#xff08;很重要&#xff01;&#xff01;&#xff01;&#xff09;- 卸载node- 清除npm相关文件 二、安装nvm&#xff0c;添加镜像1.nvm自定义安装位置2.nodejs版本存放位置- 未解决&#xff0c;无限踩坑- 已解…

crossover玩游戏缺少文件怎么办 为什么游戏打开说缺失文件 crossover支持的游戏列表 CrossOver 提示 X 11 缺失怎么办?

CrossOver是一款类虚拟机软件&#xff0c;可以实现在Mac电脑上运行exe程序。不少Mac用户为了玩游戏&#xff0c;选择使用CrossOver这款软件玩Windows平台的游戏。 一、CrossOver支持的软件多吗 CrossOver是一款基于Wine的兼容工具&#xff0c;它可以让你在Mac或Linux上运行许多…

大数据开发面试题【Flink篇】

148、flink架构 flink是一个框架和分布式处理引擎&#xff0c;用于对无界和有界数据流进行有状态计算 特点&#xff1a; 高吞吐和低延迟&#xff1a;每秒数百万个事件&#xff0c;毫秒级延迟 结果的准确性&#xff1a;提供了事件时间和处理时间语义&#xff0c;提供结果的一致…

解读makefile中的.PHONY

在 Makefile 中&#xff0c;.PHONY 是一个特殊的目标&#xff0c;用于声明伪目标&#xff08;phony target&#xff09;。伪目标是指并不代表实际构建结果的目标&#xff0c;而是用来触发特定动作或命令的标识。通常情况下&#xff0c;.PHONY 会被用来声明一组需要执行的动作&a…

某有赞滑块验证码

⚠️前言⚠️ 本文仅用于学术交流。 学习探讨逆向知识&#xff0c;欢迎私信共享学习心得。 如有侵权&#xff0c;联系博主删除。 请勿商用&#xff0c;否则后果自负。 网址 aHR0cHM6Ly9wYXNzcG9ydC55b3V6YW4uY29tL2xvZ2luL3Bhc3N3b3Jk 1. 首先来分析一下参数 1_1. get-beh…

@ConfigurationProperties结合Nacos配置动态刷新之底层原理分析

Hello&#xff0c;我是大都督周瑜&#xff0c;本文给大家分析一下ConfigurationProperties结合Nacos配置动态刷新的底层原理&#xff0c;记得点赞、关注、分享哦&#xff01; 公众号&#xff1a;IT周瑜 应用背景 假如在Nacos中有Data ID为common.yml的配置项&#xff1a; m…

上海一儿童写真馆摄影师大量售卖女童照片!当你的肖像权或隐私权被侵犯时应如何写起诉状?

上海一儿童写真馆摄影师大量售卖女童照片&#xff01;当你的肖像权或隐私权被侵犯时应如何写起诉状&#xff1f; 近日&#xff0c;上海市一儿童写真馆摄影师被指大量售卖女童的照片和特写花絮。对此&#xff0c; 上海市公安局徐汇分局发布了警情通报&#xff08;见下图&#x…