当前位置: 首页 > news >正文

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] != ':') {
#else
    if (name[0] != '/') {
#endif

        if (prefix) {
            plen = ngx_strlen(prefix);

        } else {
#ifdef NGX_PREFIX
            prefix = (u_char *) NGX_PREFIX;
            plen = ngx_strlen(prefix);
#else
            plen = 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);
#endif

        ngx_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] != ':') {
#else
    if (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);
#endif

        ngx_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.dtcms.com/a/109368.html

相关文章:

  • RTOS基础 -- NXP M4小核的RPMsg-lite与端点机制回顾
  • Qt基础:主界面窗口类QMainWindow
  • 前端切片上传、上传进度、断点续传、秒传
  • maven项目添加第三方JAR包
  • 《Java编程思想》读书笔记:第九章 接口
  • TI-BQ34Z100 STM32CubeIDE STM32L151 调试过程,含详细步骤文档、代码工程、测试记录、BQ34Z100手册等相关资料
  • 数据框的添加
  • P2758 编辑距离
  • 08_paho.mqtt.cpp库使用示例
  • Python学习笔记(8)关于列表内置函数和多维列表
  • Java 常用数据结构详解
  • Java8 到 Java21 系列之 Stream API:数据处理的新方式(Java 8)
  • Node.js 安装与配置全攻略:从入门到高效开发
  • 做题记录:和为K的子数组
  • 二极管正负极区分
  • Mermaid 语法教程
  • kali中vmtools失效用不了解决方法
  • Leetcode 857 -- 贪心 | 数学
  • 【C语言】整数和浮点数在内存中的存储
  • 使用pkexec 和其策略文件安全提权执行外部程序
  • linux文件上传下载lrzsz
  • LangChain核心解析:掌握AI开发的“链“式思维
  • 【KMP】P4391 [BalticOI 2009] Radio Transmission 无线传输|普及+
  • 蜜蜡是什么?蜜蜡与琥珀的区别以及蜜蜡的收藏价值一览
  • 《AI大模型应知应会100篇》第57篇:LlamaIndex使用指南:构建高效知识库
  • 一篇关于Netty相关的梳理总结
  • 修复SSL证书链不完整问题certificate verify failed unable to get local issuer certificate
  • Java学习总结-io缓冲流
  • [MySQL初阶]MySQL表的操作
  • 【服务日志链路追踪】