error日志的用法

news/2024/4/18 12:24:49/文章来源:https://blog.csdn.net/qq_62309585/article/details/128083100

1.引入

Nginx的日志模块(这里所说的日志模块是ngx_errlog_module模块, 而ngx_http_log_module模块是用于记录HTTP请求的访问日志的, 两者功能不同, 在实现上也没有任何关系) 为其他模块提供了基本的记录日志功能!

2.出于跨平台的考虑, 日志模块提供了相当多的接口, 主要是因为有些平台下不支持可变参数。 主要讨论支持可变参数的日志接口, 事实上不支持可变参数的日志接口在实现方面与其并没有太大的不同。

#define ngx_log_error(level,log,args...)            \if((log)->log_level>=level>=level) ngx_log_error_core(level, log, args)#define ngx_log_debug(level, log, args...) \
if ((log)->log_level & level) \ngx_log_error_core(NGX_LOG_DEBUG, log, args)void ngx_log_error_core(ngx_uint_t level, ngx_log_t log, ngx_err_t err, const char fmt, ...);

解析:采取宏函数

Nginx的日志模块记录日志的核心功能是由ngx_log_error_core方法实现的, ngx_log_error
宏和ngx_log_debug宏只是对它做了简单的封装

参数解析:

1.level参数 对于ngx_log_error宏来说, level表示当前这条日志的级别

级别大全:

级别名称意义
NGX_LOG_STDERR0最高级别日志,日志的内容不会再写入 log参数指定的文件,而是会直接将日志输出到标准错误设备,如控制台屏幕
NGX_LOG_EMERG1大于NGX_LOG_ALERT级别,而小于或等于NGX_LOG_EMERG级别的l志都会输出到log参数指定的文件中

NGx_LOG_ALERT

2>NGX_LOG_CRIT
NGX_LOG_CRIT3>NGX_LOG_ERR
NGX_LOG_ERR4>NGX_LOG_WARN
NGX_LOG_WARN5>NGX_LOG_NOTICE
NGX_LOG_NOTICE6>NGX_LOG_INFO
NGX_LOG_INFO7>NGX LOG DEBUG
NGX LOG DEBUG8调试级别,最低级别

注:使用ngx_log_error宏记录日志时, 如果传入的level级别小于或等于log参数中的日志级别
(通常是由nginx.conf配置文件中指定) , 就会输出日志内容

注:在使用ngx_log_debug宏时, level的意义完全不同, 它表达的意义不再是级别(已经是
DEBUG级别) , 而是日志类型, 因为ngx_log_debug宏记录的日志必须是NGX_LOG_DEBUG
调试级别的, 这里的level由各子模块定义

ngx_log_debug日志接口level参数的取值范围
级别名称意义

NGX_LOG_DEBUG_CORE

0X010核心模板的调试日志
NGX_LOG_DEBUG_ALLOC0X020ngxin在分配内存时使用的的调试日志
NGX_LOG_DEBUG_MUTEX0X040ngxin在使用进程锁使用的调试日志
NGX_LOG_DEBUG_EVENT0X080ngxin在使用时间模板的调试日志
NGX_LOG_DEBUG_HTTP0X100ngx——http模板的日志
NGX_LOG_DEBUG_MAIL0X200mail模板使用的日志
NGX_LOG _DEBUG_MYSOL0X400表示使用mysql的相关模板的调试日志

当HTTP模块调用ngx_log_debug宏记录日志时, 传入的level参数是NGX_LOG_DEBUG_HTTP, 这时如果log参数不属于HTTP模块, 如使用了event事件模块的log, 则不会输出任何日志。 它正是ngx_log_debug拥有level参数的意义所在

2.log参数

实际上, 在开发HTTP模块时我们并不用关心log参数的构造, 因为在处理请求时
ngx_http_request_t结构中的connection成员就有一个ngx_log_t类型的log成员, 可以传给
ngx_log_error宏和ngx_log_debug宏记录日志。 在读取配置阶段, ngx_conf_t结构也有log成员可
以用来记录日志( 读取配置阶段时的日志信息都将输出到控制台屏幕)

typedef struct ngx_log_s ngx_log_t;
typedef u_char (ngx_log_handler_pt) (ngx_log_t log, u_char buf, size_t len);
struct ngx_log_s {ngx_uint_t log_level;ngx_open_file_t *file;void data;char action;
};

1.关于data参数:为连接数, 不为0时会输出到日志中ngx_atomic_uint_t connection;
记录日志时的回调方法。 当handler已经实现(不为NULL),并且不是DEBUG调试级别时, 才会调用handler钩子方法 ngx_log_handler_pt handler;每个模块都可以自定义 data的使用方法。 通常,data参数都是在实现了上面的 handler回调方法后才使用的。

例如,HTTP框架就定义了handler方法, 并在data中放入了这个请求的上下文信息, 这样每次输出日志时都会把这个请求URI输出到日志的尾部

2.关于action参数:表示当前的动作。 实际上,action与data是一样的, 只有在实现了handler回调方法后才会使用

例如:HTTP框架就在handler方法中检查action是否为NULL, 如果不为
NULL, 就会在日志后加入“while ”+action, 以此表示当前日志是在进行什么操作, 帮助定位问题
 

总结:可以看到, 如果只是想把相应的信息记录到日志文件中, 那么完全不需要关心ngx_log_t
类型的log参数是如何构造的。 特别是在编写HTTP模块时, HTTP框架要求所有的HTTP模块
都使用它提供的log, 如果重定义ngx_log_t中的handler方法, 或者修改data指向的地址, 那么
很可能会造成一系列问题
 

3.err参数:

err参数就是错误码, 一般是执行系统调用失败后取得的errno参数。 当err不为0时,Nginx日志模块将会在正常日志内容前输出这个错误码以及其对应的字符串形式的错误消息

4.fmt参数

fmt就是可变参数

ngx_log_error(NGX_LOG_ALERT, r->connection->log,0,
"test_flag=%d,test_str=%V,path=%*s,mycf addr=%p",
mycf->my_flag,
&mycf->my_str,
mycf->my_path->name.len,
mycf->my_path->name.data,
mycf);


 

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

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

相关文章

Learning C++ No.11【string类实现】

引言: 北京时间:2023/2/19/8:48,昨天更新了有关进程状态的博客,然后在休息的时候,打开了腾讯视屏,然后看到了了一个电视剧,导致上头,从晚上6点看到了10点,把我宝贵的博客…

【NestJS】中间件

中间件是在路由处理程序之前调用的函数,所以在中间件函数中可以访问请求和响应。 中间件函数需要执行 next() 将控制传递给下一个中间件函数,否则请求会被挂起。 可以使用 nest g mi XXX 创建中间件。 局部中间件 nest g res usernest g mi ajax、编写…

klog bug:仅输出到日志文件,不打印到命令行/stderr

一、 问题描述 开发k8s插件,使用klog作为日志工具,开发完成发现在设置将日志打印到文件后,Error级别的日志信息仍然会输出到命令行,过多日志打印会使后期将服务部署于docker有卡死的风险(docker的bug,日志…

kubectl常用的命令

目录 安装 kubectl 一、命令自动补全 二、常用命令 1、查看所有pod列表 2、查看RC和service列表 3、显示Node的详细信息 4、显示Pod的详细信息, 特别是查看Pod无法创建的时候的日志 5、 根据yaml创建资源, apply可以重复执行,create不行 6、基于nginx.yaml…

优思学院:六西格玛中的水平对比方法是什么?

水平对比,就是比较不同事物之间的差异。 这个概念在六西格玛管理中也很重要,也就是我们经常说的标杆管理,经常被用来寻找行业中最好的做法,以帮助组织改进自身的绩效。 在六西格玛管理中,水平对比有三种常见的应用方式…

记一次IDE的Docker插件实战(Dockfile篇)

IDEA下使用Docker插件制作镜像、推送及运行 前言 本部分主要根据IDEA的Docker插件实战(Dockerfile篇)_程序员欣宸的博客-CSDN博客_idea编写dockerfile一文所述内容进行实践,并对其中遇到的问题进行解答,从而串接多个知识点。 如何编写Dockfile 在Int…

【YOLOv5】 3060显卡 GPU版本环境搭建与运行

YOLOv5环境搭建步骤创建虚拟环境使用anaconda新建一个python版本为3.7的虚拟环境查看电脑支持的cuda版本由于30系列的的显卡暂时不支持CUDA11以下版本。因此,这里得安装超过CUDA11.0的版本。通过如下命令来查看可以安装的cuda的版本:conda search cuda安…

JVM类加载子系统

1、类加载子系统在内存结构中所处的位置通过内存结构图,我们先知道类加载子系统所处的位置,做到心中有图。2、类加载器作用类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。ClassLoader只负责cla…

火花幻境加深与亚马逊云科技的合作,为玩家创造更加美好的游戏体验

元宇宙可谓是2022年科技界的“当红炸子鸡”,该概念的兴起为游戏产业带来了更多的发展机遇,游戏与元宇宙的结合,为玩家带来了更好的全息感官体验与游戏乐趣。元宇宙游戏市场前景广阔,企业能否快速抢滩市场,不断缩短游戏…

如何配置git,使其支持多用户

如何配置git,使其支持多用户? 在多数时候, 我们使用git进行操作时,只需要在本地配置一个用户的ssh key,就可以完成基本的pull/push操作。如果现在我有两个github的账号,并需要在一台电脑中操作其中的repo&…

java网络编程-nio学习:阻塞和非阻塞

一、阻塞 阻塞模式下,相关方法都会导致线程暂停 ServerSocketChannel.accept 会在没有连接建立时让线程暂停 SocketChannel.read 会在没有数据可读时让线程暂停 阻塞的表现其实就是线程暂停了,暂停期间不会占用 cpu,但线程相当于闲置 单线…

PyQt5数据库开发1 4.3 QSqlTableModel 之 相关槽函数的实现(多图长文详解)

目录 一、打开数据库表 1. 写打开数据库的槽函数 2. 运行后发现数据库可以打开了 3. ODBC配通了,数据库还是打不开 4. 写在tableView上显示数据库表的函数 5. 运行后发现表可以显示了 6. 代码分析 7. 添加列名称 8. 根据内容调整列宽 9. 备注:…

三、NetworkX工具包实战3——特征工程【CS224W】(Datawhale组队学习)

开源内容:https://github.com/TommyZihao/zihao_course/tree/main/CS224W 子豪兄B 站视频:https://space.bilibili.com/1900783/channel/collectiondetail?sid915098 斯坦福官方课程主页:https://web.stanford.edu/class/cs224w NetworkX…

数据库事务AICD以及隔离级别

目录一.事务的ACID二.隔离级别三.并发事务中的问题1.脏写2.脏读3.不可重复读4.幻读四.MVCC机制五.读锁与写锁六.大事务的影响七.事务优化一.事务的ACID 原子性(Atomicity):一个事务中的所有操作,要么全部成功,要么失败全部回滚,不…

linux集群技术(一)--LVS(负载均衡)(一)

集群功能分类负载均衡LVS概述LVS工作模式轮训算法 1.集群功能分类 1.1 LB (一)简介 LB:Load Balancing,负载均衡(增加处理能力),有一定高可用能力,但不是高可用集群,是以提高服务的…

「文档数据库之争」MongoDB和CouchDB的比较

MongoDB和CouchDB都是基于文档的NoSQL数据库类型。文档数据库又称mdocument store,通常用于存储半结构化数据的文档格式及其详细描述。它允许创建和更新程序,而不需要引用主模式。移动应用程序中的内容管理和数据处理是可以应用文档存储的两个字段。Mong…

SSH 服务支持弱加密算法

漏洞扫描有SSH 服务支持弱加密算法,解决方案有两个: 方案一:修改 SSH 配置文件,添加加密算法: vi /etc/ssh/sshd_config 最后添加一下内容(去掉 arcfour、arcfour128、arcfour256 等弱加密算法)…

游戏服务器算法-AOI基本介绍

一、直接比较所有对象 最直观也是最效率最低的一种方法。当一个事件发生,我们需要获得AOI范围以内的物体时,直接遍历游戏中所有的对象,并且进行坐标判断,如果小于或者等于AOI的范围,则为需要的游戏对象。 这种方法实…

智慧校园信息化管理平台技术方案

1.2总体架构设计 智慧校园平台是以学校现有网络为基础,以服务于全校师生的教学、科研、生活为目的,建立在学校数据中心平台之上,涵盖了学校的学校管理、学生管理、教学管理、班级管理、家校共育、教务管理等全方位的管理信息平台与信息服务平…