开发者社区> 科技小先锋> 正文

修改nginx源代码改变访问日志的时间格式

简介:
+关注继续查看

 由于公司领导说要把nginx访问日志存进数据库,然后利用程序进行分析,但是nginx访问日志的时间格式是:[17/Jun/2013:14:42:13 +0400] 这种格式不能用datetime格式存进数据库,只能以字符串的格式存进数据库,但是以字符串的格式存进数据库不好按天来进程查询分析,所以需要更改nginx访问日志的时间格式,经过网上查找资料得知更改源代码可以再进行编译可以更改nginx访问日志的格式,但是公司里的程序员都是PHP的,没有人懂C语言,想来想去只有我自己改源码然后编译安装(虽然我也不懂C)。

我需要更改的格式:

原格式为: 17/Jun/2013:14:42:13 +0400

需要修改成:2013-06-17 22:39:02

nginx版本是:nginx-1.4.1

经过网上查找资料,发现需要更改两个文件:src/http/modules/ngx_http_log_module.c 和src/core/ngx_times.c 这两个文件。
一、修改src/core/ngx_times.c 文件,这个文件有3个地方需要修改,分别是:
1、在49行和50行原代码如下:
1
2
static u_char            cached_http_log_time[NGX_TIME_SLOTS]
                              [sizeof("28/Sep/1970:12:00:00 +0600")];
修改后:
1
2
static u_char            cached_http_log_time[NGX_TIME_SLOTS]
                                    [sizeof("1970-09-28 12:00:00")];
2、在64行的原代码为:
1
ngx_cached_http_log_time.len = sizeof("28/Sep/1970:12:00:00 +0600") - 1;
修改后:
1
ngx_cached_http_log_time.len = sizeof("1970-09-28 12:00:00") - 1;
3、在151行到158行的原代码是(很重要的修改):
1
2
3
4
5
6
7
p2 = &cached_http_log_time[slot][0];
(void) ngx_sprintf(p2, "%02d/%s/%d:%02d:%02d:%02d %c%02d%02d",
                   tm.ngx_tm_mday, months[tm.ngx_tm_mon - 1],
                   tm.ngx_tm_year, tm.ngx_tm_hour,
                   tm.ngx_tm_min, tm.ngx_tm_sec,
                   tp->gmtoff < 0 ? '-' '+',
                   ngx_abs(tp->gmtoff / 60), ngx_abs(tp->gmtoff % 60));
修改后是:
1
2
3
4
5
6
7
p2 = &cached_http_log_time[slot][0];
(void) ngx_sprintf(p2, "%4d-%02d-%02d %02d:%02d:%02d",
                   tm.ngx_tm_year, tm.ngx_tm_mon,
                   tm.ngx_tm_mday, tm.ngx_tm_hour,
                   tm.ngx_tm_min, tm.ngx_tm_sec,
                   tp->gmtoff < 0 ? '-' '+',
                   ngx_abs(tp->gmtoff / 60), ngx_abs(tp->gmtoff % 60));
注:这里其实是把P2格式改成P1格式基本相同了,完全可以直接将log_time的格式改成p1。

二、修改src/http/modules/ngx_http_log_module.c 文件,有一个地方需要修改

在220行:

1
{ ngx_string("time_local"), sizeof("28/Sep/1970:12:00:00 +0600") - 1

修改后:

1
{ ngx_string("time_local"), sizeof("1970-09-28 12:00:00") - 1

修改好后,重新编译nginx,编译安装完后用killall -9 nginx 干掉nginx在启动,然后查看nginx的访问日志,看看时间格式是不是改好了。

1
2
3
[root@localhost objs]# tail -n 0 -f /usr/local/nginx/logs/access.log
10.10.8.120 - - [2013-06-18 03:24:24] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31"
10.10.8.120 - - [2013-06-18 03:24:24] "GET /favicon.ico HTTP/1.1" 404 570 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31"

看到上面的时间格式和我想要的是一样的,说明修改成功。



本文转自1594cqb 51CTO博客,原文链接:http://blog.51cto.com/wolfchen/1223803,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
下载Google官方/CM Android源代码自动重新开始的Shell脚本
        国内由于某种原因,下载CM或Google官方的Android源代码总容易中断。总看着机器,一中断就重新执行repo sync还太麻烦,所以我特意编写了一段shell脚本(download.sh)。
697 0
MyEclipse中防止代码格式化时出现换行
    辛苦写完的代码,被Eclipse一格式化以后,本来想放在一行上的东西却被自动转成了多行,虽然自动换行以后可以在编辑器中一眼就能看到全部的代码,但是可读性却大打折扣,比如方法名及参数我喜欢放在一行上,自动格式化时给我拆成三、四行看着太乱了,避免出现这种情况的办法是:     1.Java代码     打开Eclipse的Window菜单,然后Preferences->Java->Code Style->Formatter->Edit/Show(根据不同版本可用的按钮会不一样) ->Line Wrapping->Maximum line width:由80改成800就行了。
782 0
Ingress-nginx 源码分析
对于像我这样的 k8s 萌新来说,ingress-nginx 项目有着很重要的意义。从学习 k8s 的角度来讲,它功能简练,代码量相对较少,很适合我们通过它来侧面理解 k8s 中的一些概念。
2615 0
6965
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载