ngx_log_init

定义在 src\core\ngx_log.c

ngx_log_t *
ngx_log_init(u_char *prefix, u_char *error_log)
{u_char  *p, *name;size_t   nlen, plen;ngx_log.file = &ngx_log_file;ngx_log.log_level = NGX_LOG_NOTICE;if (error_log == NULL) {error_log = (u_char *) NGX_ERROR_LOG_PATH;}name = error_log;nlen = ngx_strlen(name);if (nlen == 0) {ngx_log_file.fd = ngx_stderr;return &ngx_log;}p = NULL;#if (NGX_WIN32)if (name[1] != ':') {
#elseif (name[0] != '/') {
#endifif (prefix) {plen = ngx_strlen(prefix);} else {
#ifdef NGX_PREFIXprefix = (u_char *) NGX_PREFIX;plen = ngx_strlen(prefix);
#elseplen = 0;
#endif}if (plen) {name = malloc(plen + nlen + 2);if (name == NULL) {return NULL;}p = ngx_cpymem(name, prefix, plen);if (!ngx_path_separator(*(p - 1))) {*p++ = '/';}ngx_cpystrn(p, error_log, nlen + 1);p = name;}}ngx_log_file.fd = ngx_open_file(name, NGX_FILE_APPEND,NGX_FILE_CREATE_OR_OPEN,NGX_FILE_DEFAULT_ACCESS);if (ngx_log_file.fd == NGX_INVALID_FILE) {ngx_log_stderr(ngx_errno,"[alert] could not open error log file: "ngx_open_file_n " \"%s\" failed", name);
#if (NGX_WIN32)ngx_event_log(ngx_errno,"could not open error log file: "ngx_open_file_n " \"%s\" failed", name);
#endifngx_log_file.fd = ngx_stderr;}if (p) {ngx_free(p);}return &ngx_log;
}

ngx_log_init 函数是 Nginx 中用于初始化错误日志的核心函数

参数解析

  • prefix : 日志路径的前缀(通常是 Nginx 安装目录的路径)。如果日志路径是相对路径,则会基于此前缀构建完整路径。
  • error_log : 指定的日志文件路径。如果为 NULL,则使用默认路径 NGX_ERROR_LOG_PATH

ngx_log_t *
ngx_log_init(u_char *prefix, u_char *error_log)
{u_char  *p, *name;size_t   nlen, plen;ngx_log.file = &ngx_log_file;ngx_log.log_level = NGX_LOG_NOTICE;
  • 将全局日志对象 ngx_log 的文件指针指向 ngx_log_file
  • 设置默认日志级别为 NGX_LOG_NOTICE(通知级别)。

    if (error_log == NULL) {error_log = (u_char *) NGX_ERROR_LOG_PATH;}

 未指定 error_log 时,则使用默认路径 NGX_ERROR_LOG_PATH

此时 

error_log=(null)

被赋值为 NGX_ERROR_LOG_PATH 后
error_log=/home/wsd/桌面/nginx/LOG/error.log


    name = error_log;nlen = ngx_strlen(name);

ngx_strlen 获取字符串长度,不包括结束符

此时

nlen=36


    if (nlen == 0) {ngx_log_file.fd = ngx_stderr;return &ngx_log;}

此时条件不成立


    p = NULL;#if (NGX_WIN32)if (name[1] != ':') {
#elseif (name[0] != '/') {
#endif

if (name[0] != '/') {

检查路径是否以 / 开头

此时 name=/home/wsd/桌面/nginx/LOG/error.log

是以 开头
所以当前 name 已经是绝对路径了,不需要拼接前缀

    ngx_log_file.fd = ngx_open_file(name, NGX_FILE_APPEND,NGX_FILE_CREATE_OR_OPEN,NGX_FILE_DEFAULT_ACCESS);

以追加的方式打开 name 指向的 日志文件 

ngx_open_file-CSDN博客

此时 

ngx_log_file.fd=4


    if (ngx_log_file.fd == NGX_INVALID_FILE) {ngx_log_stderr(ngx_errno,"[alert] could not open error log file: "ngx_open_file_n " \"%s\" failed", name);
#if (NGX_WIN32)ngx_event_log(ngx_errno,"could not open error log file: "ngx_open_file_n " \"%s\" failed", name);
#endifngx_log_file.fd = ngx_stderr;}

NGX_INVALID_FILE

#define NGX_INVALID_FILE         -1

-1 无效的文件描述符

文件打开失败

记录错误日志

此时

ngx_log_file.fd=4

条件不成立


    if (p) {ngx_free(p);}

由于 此次 name 在一开始是绝对路径,没有使用 p

所以 p 还是初始值 NULL

条件不成立


return &ngx_log;

最后返回 ngx_log 的地址

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

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

相关文章

网络华为HCIA+HCIP 策略路由,双点双向

目录 路由策略,策略路由 策略路由优势 策略路由分类 接口策略路由 双点双向 双点双向路由引入特点: 联系 路由回灌和环路问题 路由策略,策略路由 路由策略:是对路由条目进行控制,通过控制路由条目影响报文的转发路径,即路…

水下成像机理分析

一般情况下, 水下环境泛指浸入到人工水体 (如水库、人工湖等)或自然水体(如海洋、河流、湖 泊、含水层等)中的区域。在水下环境中所拍摄 的图像由于普遍受到光照、波长、水中悬浮颗粒物 等因素的影响,导致生成的水下图像出现模糊、退 化、偏色等现象,图像…

MySQL的数据目录以及日志

1.MySQL数据目录 MySQL服务器的管理信息、业务数据、⽇志⽂件、磁盘缓冲⽂件默认存储在数据⽬录下.数据目录保存了我们用户的信息,以及我们创建的数据库和表的数据.维护了日志文件等.mysqld主要操作的就是我们的数据目录. 如何查看数据目录: ll /var/lib/mysql#ll 是查看指令 …

论文阅读:Dual Anchor Graph Fuzzy Clustering for Multiview Data

论文地址:Dual Anchor Graph Fuzzy Clustering for Multiview Data | IEEE Journals & Magazine | IEEE Xplore 代码地址:https://github.com/BBKing49/DAG_FC 摘要 多视角锚图聚类近年来成为一个重要的研究领域,催生了多个高效的方法。然而&#…

32f4,串口1,usart.c.h2025

usart.c #include "sys.h" #include "usart.h" #include "led.h" // #include "stdlib.h" #include "stdarg.h" #include "stdio.h" //加入以下代码,支持printf函数,而不需要选择use MicroLIB #if 1#pragma…

C语言:一组位操作宏

解析协议时&#xff0c;取得位域的值是一种常见操作&#xff0c;这些宏可以辅助我们工作。 /* ** 将x的第n位置1 ** ** x 0x00000000 ** BIT_SET(x, 7) 0x00000080 */ #define BIT_SET(x, n) ((x) | (1 << (n)))/* ** 将x的第n位置为0 ** ** x 0x00000080 ** …

记一个使用BigDecimal所有类型变为整数的问题

场景 通过 Excel 导入数据&#xff0c;数据中包含金额。数据库类型 decimal(18, 6) 问题 Excel 导入后所有的金额列都被四舍五入。经过测试&#xff0c;只有数据有整数时所有数据才会被四舍五入&#xff0c;全部为浮点类型没有问题。 解决 强制设置小数位数 // RoundingM…

nodejs、socket.io、express + 实时线上聊天系统(自用笔记)

留个链接给自己参考用&#xff1a; socket.io官方文档&#xff1a;介绍 | Socket.IO nodejs基础语法&#xff1a;大前端技能讲解&#xff1a;NodeJS、Npm、Es6、Webpack_nodejs webpack-CSDN博客 socket.io教学&#xff1a;半小时学会socket.io【中英字幕】Learn Socket.Io …

配置网络编辑器

网络断开的原因 1.由于网络未连接的情况 解决方法 方法1&#xff1a;检查网卡配置 cd /etc/syscongfig/network_scripts vi ifcfg_ens31 方法2&#xff1a;打开虚拟机编辑--- 虚拟网络编辑器 查看ip地址是否在可用的网段范围内 修改后重启网络 systemctl restart netwo…

vscode代码片段的设置与使用

在 Visual Studio Code (VS Code) 中&#xff0c;可以通过自定义**代码片段&#xff08;Snippets&#xff09;**快速插入常用代码模板。以下是详细设置步骤&#xff1a; 步骤 1&#xff1a;打开代码片段设置 按下快捷键 Ctrl Shift P&#xff08;Windows/Linux&#xff09;或…

基于S函数的simulink仿真

基于S函数的simulink仿真 S函数可以用计算机语言来描述动态系统。在控制系统设计中&#xff0c;S函数可以用来描述控制算法、自适应算法和模型动力学方程。 S函数中使用文本方式输入公式和方程&#xff0c;适合复杂动态系统的数学描述&#xff0c;并且在仿真过程中可以对仿真…

做题记录:和为K的子数组

来自leetcode 560 前言 自己只会暴力&#xff0c;这里就是记录一下前缀和哈希表的做法&#xff0c;来自灵神的前缀和哈希表&#xff1a;从两次遍历到一次遍历&#xff0c;附变形题 正文 首先&#xff0c;这道题无法使用滑动窗口&#xff0c;因为滑动窗口需要满足单调性&am…

浅浅尝试Numpy的函数:

1.numpy.empty: numpy.empty方法用来创建一个指定形状&#xff08;shape&#xff09;&#xff0c;数据类型&#xff08;dtype&#xff09;且未被初始化的数组&#xff1a; numpy.empty(shape,dtype float,order C) 参数说明&#xff1a; shape:数组形状。 dtype:数据类型&am…

IM基本设计思路与有序ID的重要性

文章目录 概要问题解析思考问题数据基础读取写入总结 概要 说起IM程序我们都不陌生&#xff0c;本篇文章我们就为如何实现一个IM做一个简单的整体方案设计以及基本的数据结构 问题解析 我们先不上一大堆牛逼哄哄的中间件。 我们先从实现角度&#xff0c;来讲讲设计思路。 从…

数据结构学习

链表 单链表 头插 将x插到下标是k的点后面 将下标是k的点后面的点删掉 代码 // head 表示头结点的下标 // e[i] 表示节点i的值 // ne[i] 表示节点i的next指针是多少 // idx 存储当前已经用到了哪个点// 初始化 void init() {head -1;idx 0; }// 将x插到头结点 void add_to_…

0.DJI-PSDK开发准备及资料说明(基于DJI经纬M300RTK和M350RTK无人机上使用)

0.DJI-PSDK开发准备及资料说明&#xff08;基于DJI经纬M300RTK和M350RTK无人机上使用&#xff09; 【资料名称】 DJI经纬M300RTK和M350RTK无人机二次开发资料包。资料包在最下方的百度网盘 一、引言 在进行大疆无人机负载开发的过程中&#xff0c;我整理出一系列有价值的资…

Linux内核TCP/IP协议栈中的设计模式:从面向对象到系统级软件的跨界实践

引言 设计模式(Design Patterns)自GoF(Gang of Four)在1994年提出以来,已成为软件工程领域的核心概念。尽管其经典定义基于面向对象编程(OOP),但设计模式的本质是解决复杂问题的经验总结,而非局限于特定编程范式。本文以Linux内核的TCP/IP协议栈为例,探讨设计模式在…

第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(部分题解)

文章目录 前言日期统计题意&#xff1a; 冶炼金属题意&#xff1a; 岛屿个数题意&#xff1a; 子串简写题意&#xff1a; 整数删除题意&#xff1a; 总结 前言 一年一度的&#x1f3c0;杯马上就要开始了&#xff0c;为了取得更好的成绩&#xff0c;好名字写了下前年2023年蓝桥…

处理JWT Token失效需求

JWT 本身是无状态的&#xff0c;这意味着服务器不会保存任何关于 Token 的状态信息。但为了支持 JWT 的状态管理&#xff08;例如&#xff1a;强制使某些 Token 失效&#xff09;&#xff0c;可以借助 Redis 这样的外部存储来维护一个黑名单或白名单。 安装必要的 NuGet 包 首…

PHP代码审计-01

&#x1f338; 连接方式 PHP Mysql连接方式&#xff1a; Mysql&#xff08;废弃&#xff09;MysqliPDO &#x1f338; 常见过滤 intval/addslashes/mysql_real_escape mysqli_escape_string/mysqli_real_escape_string/mysqli::escape_string PDO::quote 参数化查询 a…