- 浏览: 1482739 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (691)
- linux (207)
- shell (33)
- java (42)
- 其他 (22)
- javascript (33)
- cloud (16)
- python (33)
- c (48)
- sql (12)
- 工具 (6)
- 缓存 (16)
- ubuntu (7)
- perl (3)
- lua (2)
- 超级有用 (2)
- 服务器 (2)
- mac (22)
- nginx (34)
- php (2)
- 内核 (2)
- gdb (13)
- ICTCLAS (2)
- mac android (0)
- unix (1)
- android (1)
- vim (1)
- epoll (1)
- ios (21)
- mysql (3)
- systemtap (1)
- 算法 (2)
- 汇编 (2)
- arm (3)
- 我的数据结构 (8)
- websocket (12)
- hadoop (5)
- thrift (2)
- hbase (1)
- graphviz (1)
- redis (1)
- raspberry (2)
- qemu (31)
- opencv (4)
- socket (1)
- opengl (1)
- ibeacons (1)
- emacs (6)
- openstack (24)
- docker (1)
- webrtc (11)
- angularjs (2)
- neutron (23)
- jslinux (18)
- 网络 (13)
- tap (9)
- tensorflow (8)
- nlu (4)
- asm.js (5)
- sip (3)
- xl2tp (5)
- conda (1)
- emscripten (6)
- ffmpeg (10)
- srt (1)
- wasm (5)
- bert (3)
- kaldi (4)
- 知识图谱 (1)
最新评论
-
wahahachuang8:
我喜欢代码简洁易读,服务稳定的推送服务,前段时间研究了一下go ...
websocket的helloworld -
q114687576:
http://www.blue-zero.com/WebSoc ...
websocket的helloworld -
zhaoyanzimm:
感谢您的分享,给我提供了很大的帮助,在使用过程中发现了一个问题 ...
nginx的helloworld模块的helloworld -
haoningabc:
leebyte 写道太NB了,期待早日用上Killinux!么 ...
qemu+emacs+gdb调试内核 -
leebyte:
太NB了,期待早日用上Killinux!
qemu+emacs+gdb调试内核
最简单的方式就是
或者
但是如果打印
会报错
参考章亦春的echo
http://wiki.nginx.org/HttpEchoModule
源码中有个ddebug.h里面定义的打印log都输出到stderr
所以在这个模块的源码中把开头的
改成
当启动nginx的时候就输出log了 类似
可以重定向
./nginx >a.log 2>&1
★★★★★★第二种方法★★★★★★
还有一种是通用的 打印log的方法,跟nginx没关系
任何都适用,定义haolog.c haolog.h 在ngx_http_echo_module.c中引用haolog.h
config中标记新增的源码.c 和依赖的.h
log代码如下
haolog.c:
完整的nginx模块如下
调用
DEBUG_LOG("haoning --ngx_http_echo_merge_loc_conf");
就打印到自定义的
/root/hellogit/hello/graphviz/nginx/mymodule/mylog/test.log
疑问,handler里的怎么打印不出来????
fprintf(stderr, "haoning hahahah:%s\r\n","ningning");
或者
ngx_log_stderr(0,"haoning: ngx_http_hello_world_handler\"%s\"","haohao" );
但是如果打印
ngx_log_stderr(0,"haoning haohao subrequest in memory: %d", (int) r->subrequest_in_memory); ngx_log_stderr(0,"haoning haohao r->method : %d",(int) r->method); ngx_log_stderr(0,"haoning haohao r->http_version: %d",(int) r->http_version) ; ngx_log_stderr(0,"haoning haohao r->request_line.data: %s",r->request_line.data) ; ngx_log_stderr(0,"haoning haohao r->uri.data): %s",r->uri.data); ngx_log_stderr(0,"haoning haohao r->args.data: %s",r->args.data); ngx_log_stderr(0,"haoning haohao r->unparsed_uri.data: %s",r->unparsed_uri.data); ngx_log_stderr(0,"haoning haohao r->method_name.data: %s",r->method_name.data) ; ngx_log_stderr(0,"haoning haohao r->http_protocol.data: %s",r->http_protocol.data); ngx_log_stderr(0,"haoning haohao r->exten.data: %s",r->exten.data);
会报错
参考章亦春的echo
http://wiki.nginx.org/HttpEchoModule
源码中有个ddebug.h里面定义的打印log都输出到stderr
所以在这个模块的源码中把开头的
#ifndef DDEBUG #define DDEBUG 0 #endif
改成
#ifndef DDEBUG #define DDEBUG 1 #endif
当启动nginx的时候就输出log了 类似
e.c line 463. echo *** ngx_http_echo_helper: filter used = 1 at /root/hellogit/hello/graphviz/nginx/mymodule/echo-nginx-module-0.48/src/ngx_http_echo_module.c line 324. echo *** ngx_http_echo_helper: found raw arg hello at /root/hellogit/hello/graphviz/nginx/mymodule/echo-nginx-module-0.48/src/ngx_http_echo_module.c line 358. echo *** ngx_http_echo_echo_before_body: processing echo_before_body directive... at /root/hellogit/hello/graphviz/nginx/mymodule/echo-nginx-module-0.48/src/ngx_http_echo_module.c line 463. echo *** ngx_http_echo_helper: found raw arg world at /root/hellogit/hello/graphviz/nginx/mymodule/echo-nginx-module-0.48/src/ngx_http_echo_module.c line 358. echo *** ngx_http_echo_helper: filter used = 1 at /root/hellogit/hello/graphviz/nginx/mymodule/echo-nginx-module-0.48/src/ngx_http_echo_module.c line 324. echo *** ngx_http_echo_helper: found raw arg hiya at /root/hellogit/hello/graphviz/nginx/mymodule/echo-nginx-module-0.48/src/ngx_http_echo_module.c line 358. echo *** ngx_http_echo_helper: found raw arg igor at /root/hellogit/hello/graphviz/nginx/mymodule/echo-nginx-module-0.48/src/ngx_http_echo_module.c line 358.
可以重定向
./nginx >a.log 2>&1
★★★★★★第二种方法★★★★★★
还有一种是通用的 打印log的方法,跟nginx没关系
任何都适用,定义haolog.c haolog.h 在ngx_http_echo_module.c中引用haolog.h
/root/hellogit/hello/graphviz/nginx/mymodule/echo [root@VM_253_237_tlinux echo]# ls config haolog.c haolog.h nginx.conf ngx_http_echo_module.c shuoming.txt [root@VM_253_237_tlinux echo]#
config中标记新增的源码.c 和依赖的.h
ngx_addon_name=ngx_http_echo_module HTTP_MODULES="$HTTP_MODULES ngx_http_echo_module" NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_echo_module.c $ngx_addon_dir/haolog.c" NGX_ADDON_DEPS="$NGX_ADDON_DEPS $ngx_addon_dir/haolog.h" CORE_LIBS="$CORE_LIBS -lpcre"
log代码如下
[root@VM_253_237_tlinux echo]# cat haolog.h #include <stdio.h> #include <time.h> #define DEBUG_LOG( str ) log_append_to_file("/root/hellogit/hello/graphviz/nginx/mymodule/mylog/test.log", str,__FILE__,__LINE__ ); void log_append_to_file(char* filename,char* str,char* sourceFile,int fileLine); [root@VM_253_237_tlinux echo]
haolog.c:
[root@VM_253_237_tlinux echo]# cat haolog.c #include <stdio.h> #include <time.h> #define DEBUG_LOG( str ) log_append_to_file("/root/hellogit/hello/graphviz/nginx/mymodule/mylog/test.log", str,__FILE__,__LINE__ ); void log_append_to_file(char* filename,char* str,char* sourceFile,int fileLine) { time_t t; time(&t); struct tm* tp= localtime(&t); char now_str[100]; strftime(now_str, 100, "%Y-%m-%d %H:%M:%S", tp); FILE *fo; fo = fopen(filename, "a"); if (fo == 0) { return; } fprintf(fo, "%s %s(:%d):%s\r\n",now_str,sourceFile,fileLine, str); fclose(fo); } //int main(int argc, char **argv) //{ ///*********************define******************/ // // DEBUG_LOG("haoning----logmain.c"); // printf("Hello World!\n"); // return 0; //} [root@VM_253_237_tlinux echo]#
完整的nginx模块如下
[root@VM_253_237_tlinux echo]# cat ngx_http_echo_module.c /* * Copyright (C) fabricehao */ #include <ngx_config.h> #include <ngx_core.h> #include <ngx_http.h> #include <time.h> #include "haolog.h" /* Module config */ typedef struct { ngx_str_t ed; } ngx_http_echo_loc_conf_t; static char *ngx_http_echo(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); static void *ngx_http_echo_create_loc_conf(ngx_conf_t *cf); static char *ngx_http_echo_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child); /* Directives */ static ngx_command_t ngx_http_echo_commands[] = { { ngx_string("echo"), NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, ngx_http_echo, NGX_HTTP_LOC_CONF_OFFSET, offsetof(ngx_http_echo_loc_conf_t, ed), NULL }, ngx_null_command }; /* Http context of the module */ static ngx_http_module_t ngx_http_echo_module_ctx = { NULL, /* preconfiguration */ NULL, /* postconfiguration */ NULL, /* create main configuration */ NULL, /* init main configuration */ NULL, /* create server configuration */ NULL, /* merge server configuration */ ngx_http_echo_create_loc_conf, /* create location configration */ ngx_http_echo_merge_loc_conf /* merge location configration */ }; /* Module */ ngx_module_t ngx_http_echo_module = { NGX_MODULE_V1, &ngx_http_echo_module_ctx, /* module context */ ngx_http_echo_commands, /* module directives */ NGX_HTTP_MODULE, /* module type */ NULL, /* init master */ NULL, /* init module */ NULL, /* init process */ NULL, /* init thread */ NULL, /* exit thread */ NULL, /* exit process */ NULL, /* exit master */ NGX_MODULE_V1_PADDING }; /* Handler function */ static ngx_int_t ngx_http_echo_handler(ngx_http_request_t *r) { DEBUG_LOG("haoning.........ngx_http_echo_handler"); ngx_int_t rc; ngx_buf_t *b; ngx_chain_t out; ngx_http_echo_loc_conf_t *elcf; elcf = ngx_http_get_module_loc_conf(r, ngx_http_echo_module); if(!(r->method & (NGX_HTTP_HEAD|NGX_HTTP_GET|NGX_HTTP_POST))) { return NGX_HTTP_NOT_ALLOWED; } r->headers_out.content_type.len = sizeof("text/html") - 1; r->headers_out.content_type.data = (u_char *) "text/html"; r->headers_out.status = NGX_HTTP_OK; r->headers_out.content_length_n = elcf->ed.len; if(r->method == NGX_HTTP_HEAD) { DEBUG_LOG("haoning......ngx_http_echo_handlerr---r->method == NGX_HTTP_HEAD"); rc = ngx_http_send_header(r); if(rc != NGX_OK) { return rc; } } b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t)); if(b == NULL) { ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "Failed to allocate response buffer."); return NGX_HTTP_INTERNAL_SERVER_ERROR; } out.buf = b; out.next = NULL; b->pos = elcf->ed.data; b->last = elcf->ed.data + (elcf->ed.len); b->memory = 1; b->last_buf = 1; rc = ngx_http_send_header(r); if(rc != NGX_OK) { return rc; } DEBUG_LOG("haoning......ngx_http_output_filter"); return ngx_http_output_filter(r, &out); } static char * ngx_http_echo(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) { DEBUG_LOG("haoning --ngx_http_echo->>>>> init"); ngx_http_core_loc_conf_t *clcf; clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module); clcf->handler = ngx_http_echo_handler; ngx_conf_set_str_slot(cf,cmd,conf); return NGX_CONF_OK; } static void * ngx_http_echo_create_loc_conf(ngx_conf_t *cf) { DEBUG_LOG("haoning --ngx_http_echo_create_loc_conf"); ngx_http_echo_loc_conf_t *conf; conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_echo_loc_conf_t)); if (conf == NULL) { return NGX_CONF_ERROR; } conf->ed.len = 0; conf->ed.data = NULL; return conf; } static char * ngx_http_echo_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) { DEBUG_LOG("haoning --ngx_http_echo_merge_loc_conf"); ngx_http_echo_loc_conf_t *prev = parent; ngx_http_echo_loc_conf_t *conf = child; ngx_conf_merge_str_value(conf->ed, prev->ed, ""); return NGX_CONF_OK; } [root@VM_253_237_tlinux echo]#
调用
DEBUG_LOG("haoning --ngx_http_echo_merge_loc_conf");
就打印到自定义的
/root/hellogit/hello/graphviz/nginx/mymodule/mylog/test.log
疑问,handler里的怎么打印不出来????
发表评论
-
xl2tp 备份
2019-09-24 16:25 7332019年9月24日更新: 注意,需要开启firewall ... -
sdl笔记
2019-01-31 17:19 741sdl教程教程 https://github.com/Twin ... -
tinyemu
2019-01-24 17:59 1441参考https://bellard.org/jslinux/t ... -
aws搭建xl2tp给iphone使用
2018-12-26 21:37 19022019年12月26日 可以参考原来的配置 https:// ... -
ios的safari使用自制ca证书测试webrtc
2018-08-20 13:31 2474这个需要注意 https://stackoverflow.c ... -
nginx push_upstream模块的websocket
2018-05-04 23:27 1228参考 https://www.rails365.net/art ... -
openresty聊天室的helloworld
2018-04-22 19:25 824openresty的websocket + redis的sub ... -
openresty websocket
2018-04-18 17:08 1550mac安装openresty brew install o ... -
nginx模块开发(三)upstream模块
2017-08-20 23:48 848使用nginx-1.13.4版本 三个文件ngx_http_ ... -
nginx模块开发(二) 使用gdb-dashboard调试
2017-08-11 18:47 2019gdb-dashboard或者 gdbgui 或者gdb自带 ... -
nginx模块开发(一)
2017-07-29 22:44 570决定重新整理nginx模块开发 helloworld con ... -
consul的基本使用
2017-06-27 11:13 1409### 安装 [centos7上consul的安装](ht ... -
lvs的helloworld
2017-06-13 20:36 601###################lvs######### ... -
系统调用的helloworld
2017-05-04 16:14 660《2.6内核标准教程》 p293 #include < ... -
bitcoin和cgminer的安装
2017-04-05 22:45 1963参考 http://blog.csdn.net/rion_ch ... -
ceph安装和常用命令
2017-03-21 21:55 964/etc/hosts ssh-keygen ssh-copy- ... -
nginx带进度条的上传超大文件
2016-12-12 18:40 388111年写的 http://haoningabc.iteye.c ... -
mobile terminal 笔记
2016-12-02 15:35 648找出旧的iphone4 越狱之后可以变个小操作系统 mobi ... -
nginx rewrite替代apache rewrite
2016-10-18 20:30 844清理chrome的缓存 chrome://appcache-i ... -
socket基础和select(python)
2016-06-14 17:21 1807上接 c语言的socket基础ht ...
相关推荐
根据上述文件提供的信息,配置Nginx以使用JSON格式记录日志的步骤可以详细分为以下几个知识点: 1. Nginx日志格式配置基础 首先,要了解Nginx的日志记录是通过其配置文件来定义的,通常位于nginx.conf中的http、...
在Linux系统上,通常有以下几种方法来安装Nginx: 1. **使用包管理器**:对于基于RPM的系统(如凝思6),可以使用`yum`或`dnf`(如果已升级到更新版本)来安装。命令如下: ``` sudo yum install nginx ``` 2. ...
在实际应用中,你可能还需要考虑其他因素,如缓存策略(对于提高性能)、SSL/TLS 加密(确保数据传输安全)以及日志记录(便于监控和调试)。同时,根据业务需求,你可能需要结合 Squid 和 Nginx 使用,比如 Squid ...
如果出现问题,可以查看Nginx的日志文件或者启用更详细的日志模式来进行调试。 通过这种方式,Nginx Lua不仅可以作为静态文件服务器,还可以作为一个轻量级的图片处理服务,为Web应用提供灵活、高效的图片处理能力...
关于Apache和PHP的集成,有几种方法,如使用PHP作为Apache模块(mod_php),FastCGI,或者通过PHP-FPM(FastCGI Process Manager)。每种方法都有其优缺点,例如mod_php将PHP解析器直接嵌入Apache,响应速度快但可能...
- **日志**:配置Nginx的日志记录,以便分析和调试直播服务中的问题。 7. **案例应用** - **教育直播**:在线教育平台可以通过Nginx RTMP实现教师授课的实时直播,学生可以随时随地观看。 - **电竞赛事**:游戏...
Nginx是一种高性能的HTTP和反向代理服务器,同时也支持IMAP/POP3/SMTP代理服务。其在Linux、BSD、Solaris、Mac OS X、...此外,文档还提供了常见问题的解答,以及如何调试Nginx的详细信息,大大降低了使用Nginx的门槛。
- 日志记录:合理设置日志文件,便于监控和调试。 通过深入理解这些知识点,你将能够有效地利用Nginx在Docker环境中搭建高效、稳定的网络服务。阅读并实践提供的配置文件,结合博客文章,将有助于你更好地掌握这些...
在IT行业中,网络服务的高可用性和负载均衡是至关重要的,而`keepalived`与`nginx`的结合就是一种常见的实现方式。本篇将详细阐述`keepalived`和`nginx`如何协同工作,以及如何成功配置它们,确保服务的稳定运行。 ...
配置Nginx的日志模块,可以通过以下几种方式: 1. **日志级别配置**:通过`error_log`指令设置日志级别,如`error_log /path/to/error.log info;`将错误日志级别设置为INFO。 2. **日志文件位置**:使用`error_log...
8. **监控与日志**:理解如何查看Nginx的日志文件,以便于调试问题和分析服务器性能。还可以集成其他监控工具,如Prometheus或ELK栈,以获取更详细的性能数据。 9. **反向代理与负载均衡**:学习如何配置Nginx作为...
3. **调试工具**:包括使用gdb进行调试、日志记录等方法。 #### 结语 Nginx凭借其强大的功能和灵活性,已成为现代Web开发不可或缺的一部分。无论是作为Web服务器、反向代理还是负载均衡器,Nginx都能胜任。深入...
9. Web服务器日志:Apache和Nginx等Web服务器也有自己的日志系统,记录了请求处理的详细信息,对于排查服务器相关的问题非常有帮助。 10. IDE集成:现代IDE如PhpStorm、Visual Studio Code等,都有强大的PHP调试...
Location指令的匹配规则有以下几种: 1. `=`:精确匹配,如果找到,则停止其他匹配。 2. `^~`:如果URI以指定的字符串开始,停止其他匹配。 3. `~` 和 `~*`:区分大小写和不区分大小写的正则匹配。 4. `/`:作为...
配置文件中的配置项主要分为几种类型,包括基本配置项、用于调试和定位的配置项、优化性能的配置项以及事件类配置项。基本配置项包括error_log、pid、worker_processes等,用于定义错误日志的路径、存放pid文件的...
8. **日志管理**:Python 应用和 Nginx 都会生成日志,这对于调试和监控系统状态至关重要。了解日志配置和日志文件的位置有助于排查问题。 9. **部署流程**:理解如何将这个应用部署到服务器上,涉及到的步骤可能...
在IT行业中,日志清除器是一种非常实用的工具,它主要负责管理和清理系统或应用程序产生的大量日志文件。日志文件记录了系统运行时的各种事件、错误信息、警告以及调试数据,对于排查问题和监控系统状态至关重要。...
格式很简单: proxy_pass URL; ... 示例如下: ...对于proxy_pass的配置有几种情况需要注意: 假设server_name为www.xxx.com 当请求http://www.xxx.com/aming/a.html的时候,以上示例分别访问的结果是 示例1
3. **日志记录**:`access_log`和`error_log`指令用于记录访问和错误日志,有助于分析和调试。 总结,Nginx虚拟主机是高效管理多网站的关键技术,通过合理配置,可以实现资源优化、性能提升以及安全控制。了解和...