配置日志的时候重启nginx报错:[emerg]: invalid log level “debug_http” in /path/conf/nginx.conf:XX,看到这篇文章找到了答案

转载地址:http://100continue.iteye.com/blog/1821893

用户在使用Nginx的过程中,可能会遇到所请求的资源不正确,Nginx Core Dump,段错误等异常情况,这时需要有相应的机制来进行调试及问题定位,特别是面对大量的日志信息,合理的调试处理机制对用户来说是一件非常重要的事情。以下将着重为大家介绍调试日志。

【调试日志】

一,开启调试日志:

要开启调试日志,首先需要在配置Nginx时打开调试功能,然后编译:

./configure --with-debug ...

然后在配置文件中设置error_log的级别为:

error_log /path/to/log debug;

Nginx的Windows二进制版本总是将调试日志开启的,因此只需要设置debug的日志级别即可。

二,日志级别分析:

在此,我们通过分析Nginx源码了解下Nginx将日志分为几个等级及不同日志等级之间的相互关系:

Ngx_log.h代码  
  1. #define NGX_LOG_STDERR 0
  2. #define NGX_LOG_EMERG 1
  3. #define NGX_LOG_ALERT 2
  4. #define NGX_LOG_CRIT 3
  5. #define NGX_LOG_ERR 4
  6. #define NGX_LOG_WARN 5
  7. #define NGX_LOG_NOTICE 6
  8. #define NGX_LOG_INFO 7
  9. #define NGX_LOG_DEBUG 8
  10. #define NGX_LOG_DEBUG_CORE 0x010
  11. #define NGX_LOG_DEBUG_ALLOC 0x020
  12. #define NGX_LOG_DEBUG_MUTEX 0x040
  13. #define NGX_LOG_DEBUG_EVENT 0x080
  14. #define NGX_LOG_DEBUG_HTTP 0x100
  15. #define NGX_LOG_DEBUG_MAIL 0x200
  16. #define NGX_LOG_DEBUG_MYSQL 0x400
  17. #define NGX_LOG_DEBUG_FIRST NGX_LOG_DEBUG_CORE
  18. #define NGX_LOG_DEBUG_LAST NGX_LOG_DEBUG_MYSQL
  19. #define NGX_LOG_DEBUG_CONNECTION 0x80000000
  20. #define NGX_LOG_DEBUG_ALL 0x7ffffff0

其中默认有效的第一级别日志是"stderr","emerg","alert","crit","error","warn","notice","info","debug"。

而Ngx_log.h内列出的其他debug第二级别日志:"debug_core","debug_alloc","debug_mutex","debug_event","debug_http","debug_mail","debug_mysql"等则需要在配置Nginx时启动调试日志功能才能使用,并且用户可以通过修改Ngx_log.h及Ngx_log.c源码来更新debug第二级别。

我们再通过Ngx_log.c的部分代码分析下可以如何使用这些日志级别:

Ngx_log.c代码  
  1. char *
  2. ngx_log_set_levels(ngx_conf_t *cf, ngx_log_t *log)
  3. {
  4. ...
  5. for (n = 1; n <= NGX_LOG_DEBUG; n++) {
  6. if (ngx_strcmp(value[i].data, err_levels[n].data) == 0) {
  7. if (log->log_level != 0) {
  8. ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
  9. "duplicate log level \"%V\"",
  10. &value[i]);
  11. return NGX_CONF_ERROR;
  12. }
  13. log->log_level = n;
  14. found = 1;
  15. break;
  16. }
  17. }
  18. for (n = 0, d = NGX_LOG_DEBUG_FIRST; d <= NGX_LOG_DEBUG_LAST; d <<= 1) {
  19. if (ngx_strcmp(value[i].data, debug_levels[n++]) == 0) {
  20. if (log->log_level & ~NGX_LOG_DEBUG_ALL) {
  21. ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
  22. "invalid log level \"%V\"",
  23. &value[i]);
  24. return NGX_CONF_ERROR;
  25. }
  26. log->log_level |= d;
  27. found = 1;
  28. break;
  29. }
  30. }
  31. ...
  32. if (log->log_level == NGX_LOG_DEBUG) {
  33. log->log_level = NGX_LOG_DEBUG_ALL;
  34. }
  35. ...
  36. }

按照以上代码逻辑,我们可以得出以下结论:

1. 第一级别日志之间是互斥的,如果配置文件内加入如下配置项:

Java代码  
  1. error_log path/logs/error.log warn;
  2. error_log path/logs/error.log info;

那么启动Nginx将报错如下:

[emerg]: duplicate log level "info" in /path/conf/nginx.conf:XX

但是需要注意的是,在配置文件不同block中是允许重新定义错误日志的。但是当用户在重新定义错误日志时,如果没有指定相应的日志级别,那么调试日志将会被屏蔽。下面的例子里,在server层中重新定义的日志就屏蔽了这个虚拟主机的调试日志:

C代码  
  1. error_log  /path/to/log  debug;
  2. http {
  3. server {
  4. error_log  /path/to/log;
  5. ...

为了避免这个问题,可以注释这行重新定义日志的配置,或者也给日志指定debug级别:

C代码  
  1. error_log  /path/to/log  debug;
  2. http {
  3. server {
  4. error_log  /path/to/log  debug;
  5. ...

2. 第二级别日志是多选的,用户可以根据项目需要配置多个第二级别日志:

C代码  
  1. error_log  logs/error.log debug_mysql;
  2. error_log  logs/error.log debug_core;

3. 在第一级别日志与第二级别日志组合配置时,仅有在第一级别日志为"debug"时才可以有第二级别的配置,其他第一级别日志的情况下指定第二级别日志将无法启动Nginx,如:

C代码  
  1. error_log  logs/error.log error;
  2. error_log  logs/error.log debug_core;

启动Nginx将获得如下错误信息:

[emerg]: invalid log level “debug_http” in /path/conf/nginx.conf:XX

当用户开启debug级别日志时,会输出所有debug_开头的调试信息,因此可以通过上面组合debug_core|debug_http的形式来获取用户所需要的调试信息。

三,日志格式设置:

用户在使用Nginx提供web服务的时候,可能会有很多场景需要记录日志,如打点日志,访问日志,数据统计日志,性能分析日志等。为了更加方便的对日志进行分析,我们可以通过设置日志格式的方式来要求Nginx按照用户要求进行日志的展现。

控制nginx日志输出的指令如下:

C代码  
  1. log_format  customLog "$remote_addr^A$remote_user^A$time_local^A$request_method^A$uri^A$args^A$server_protocol"
  2. "^A$status^A$body_bytes_sent^A$http_referer"
  3. "^A$http_user_agent";
  4. access_log /path/logs/access.log customLog;

上面例子中通过使用特殊字符(^A)来作为日志字段的分隔符,用户后续可以使用sort和grep之类的工具对特定url做分析,如统计各url请求量倒排取前50个:

C代码  
  1. awk -F^A '{print $5}' /path/logs/access.log | sort | uniq -c | sort -nr | head -50

类似上面的日志定制化设置,可以让用户在调试日志的过程中随心所欲,如鱼得水。

详细的log_format指令和access_log指令,用户可以访问Nginx官网的HttpLog模块。

四,调试日志的几个注意点:

1. 勘误:在Nginx Wiki里面error log相关部分的介绍中提到

http://wiki.nginx.org/NginxHttpMainModule#error_log 
Default values for the error level:
in the main section - error
in the HTTP section - crit
in the server section - crit

但是,我们从源码上看:

C代码  
  1. static char *
  2. ngx_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
  3. {
  4. ...
  5. if (cf->args->nelts == 2) {
  6. cf->cycle->new_log.log_level = NGX_LOG_ERR;
  7. return NGX_CONF_OK;
  8. }
  9. ...
  10. }

当error_log 的日志级别选项为配置时,默认日志级别为error,无上面提及的三个section的区别。故特在此勘误。

2. 配置error_log off并不能关闭日志记录——日志信息会被写入到文件名为off的文件当中。如果要关闭日志记录,用户可以做如下配置:

C代码  
  1. error_log /dev/null crit;

3. 如果nginx进程没有权限将日志信息写入指定的log地址,那么nginx会在启动是报错:

[alert]: could not open error log file: open() "/path/log/nginx/error.log" failed (13: Permission denied)

4. 通过debug_connection配置项,用户可以针对某些地址开启调试日志:

C代码  
  1. error_log  /path/to/log;
  2. events {
  3. debug_connection   10.232.10.1;
  4. debug_connection   10.232.10.0/24;
  5. }

参考文献:

1. 调试日志 http://nginx.org/cn/docs/debugging_log.html

2. nginx error log  http://wiki.nginx.org/NginxHttpMainModule#error_log

3. log format http://wiki.nginx.org/HttpLogModule

4. 使用nginx记日志 http://blog.linezing.com/2011/11/%E4%BD%BF%E7%94%A8nginx%E8%AE%B0%E6%97%A5%E5%BF%97

Nginx调试日志[emerg]: invalid log level “debug_http” in /path/conf/nginx.conf:XX相关推荐

  1. nginx 学习笔记(5) nginx调试日志

    为启动一个调试日志,nginx需要在构建时配置城支持调试模式. ./configure --with-debug ... 而且调试级别应该使用err_log指令来设置: err_log /path/t ...

  2. ELK日志系统之使用Rsyslog快速方便的收集Nginx日志

    常规的日志收集方案中Client端都需要额外安装一个Agent来收集日志,例如logstash.filebeat等,额外的程序也就意味着环境的复杂,资源的占用,有没有一种方式是不需要额外安装程序就能实 ...

  3. nginx 错误日志分析

    一.Nginx配置和内核优化 实现突破十万并发 二.一次Nignx的502页面的错误记录 (1)错误页面显示 错误日志: 2017/07/17 17:32:57 [error] 29071#0: *9 ...

  4. nginx错误:unknown directive 锘? in F:\nginx/conf/nginx.conf:3

    C:\Users\Administrator>d: D:\>cd D:\nginx-1.4.7 D:\nginx-1.4.7>start nginx.exe D:\nginx-1.4 ...

  5. nginx的日志配置

    nginx的日志配置 nginx有一个非常灵活的日志记录模式.每个级别的配置可以有各自独立的访问日志.日志格式通过log_format命令来定义. ngx_http_log_module 是用来定义请 ...

  6. NGINX访问日志和错误日志

    Logs are very useful to monitor activities of any application apart from providing you with valuable ...

  7. 【Nginx 日志配置】【访问日志log_format】【错误日志error_log 指令】【Nginx的日志轮转】

    文章目录 Nginx 日志配置 `log_format` 指令中常用的一些变量: 访问日志 案例 可以配置段:`http`, `stream`, `server`, `location`作用域. er ...

  8. log_format为nginx设置日志格式

    nginx服务器日志相关指令主要有两条 1.一条是log_format,用来设置日志格式. 2. 另外一条是access_log,用来指定日志文件的存放路径.格式和缓存大小,一般在nginx的配置文件 ...

  9. Nginx错误日志详解

    Nginx错误日志详解 Nginx软件会把自身运行的故障信息及用户访问的日志信息记录到指定的日志文件里 Nginx错误日志信息介绍 Nginx的错误信息是调试Nginx服务的重要手段,属于核心功能模块 ...

最新文章

  1. 4kyu Sums of Perfect Squares
  2. [Silverlight]奇技银巧系列-3
  3. [收藏]7个可以调研B端产品的网站
  4. mysql 创建索引 终止_技术分享 | 常见索引问题处理
  5. Python collection模块与深浅拷贝
  6. 软件测试--04测试用例/测试方法
  7. 10 Python - Python列表list
  8. [导入]OGRE中用到的设计模式
  9. Eclipse多国语言包的安装
  10. 【推荐】程序员必读的三十本经典巨作
  11. 【毕业设计】基于STM32的宠物自动喂食装置
  12. 嵌入式设备时间同步管理
  13. PAT 乙级 1033 旧键盘打字 python
  14. 线下门店如何进行私域运营
  15. PureMVC 实例讲解
  16. Crypto++库实现AES和RSA加密解密
  17. 计算机相关设备有哪些,电脑设备有哪些
  18. 零中频接收机频率转换图_初探“光通信”光接收机
  19. 汤晓丹的第四版计算机操作系统--第九章总结概述
  20. The request client is not a secure context and the resource is in more-private address space `privat

热门文章

  1. python不支持下标访问元素吗_Python 集合不支持使用下标访问其中的元素
  2. 各行业容灾备份架构#容灾#,
  3. python运维看什么书_学习Python在Linux运维上的应用应该看哪些书 什么样的学习路线...
  4. 【天池】金融风控贷款违约预测task5
  5. 连续两年进入Gartner SFA魔力象限,CRM领头羊销售易做对了什么?
  6. cogs 740 分配问题
  7. Fortify扫描漏洞解决方案
  8. java中map参数封装到bean_JavaBean和Map转换封装类详解
  9. win10的Win快捷键使用简易操作方法
  10. 京东单品页前端开发那些不得不说的事儿