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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

 由于公司领导说要把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,如需转载请自行联系原作者

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
2月前
|
存储 监控 算法
防止员工泄密软件中文件访问日志管理的 Go 语言 B + 树算法
B+树凭借高效范围查询与稳定插入删除性能,为防止员工泄密软件提供高响应、可追溯的日志管理方案,显著提升海量文件操作日志的存储与检索效率。
89 2
|
9月前
|
数据可视化 关系型数据库 MySQL
ELK实现nginx、mysql、http的日志可视化实验
通过本文的步骤,你可以成功配置ELK(Elasticsearch, Logstash, Kibana)来实现nginx、mysql和http日志的可视化。通过Kibana,你可以直观地查看和分析日志数据,从而更好地监控和管理系统。希望这些步骤能帮助你在实际项目中有效地利用ELK来处理日志数据。
666 90
|
7月前
|
存储 安全 应用服务中间件
将下载的Nginx证书转换为Tomcat证书格式
好,可以看到,将Nginx证书转换为Tomcat证书的过程就像在烘焙一块蛋糕。你需要准备材料(证书),配备工具(OpenSSL, keytool),按照一定的步骤慎重制作,最后你就拥有了一块可以在浏览器中呈现出漂亮的安全状态的HTTPS蛋糕。就这么简单,明了,没有任何复杂的理论知识,就像在家庭厨房里烘焙的快乐一样。
320 16
|
9月前
|
域名解析 应用服务中间件 网络安全
阿里云个人博客外网访问中断应急指南:从安全组到日志的七步排查法
1. 检查安全组配置:确认阿里云安全组已开放HTTP/HTTPS端口,添加规则允许目标端口(如80/443),授权对象设为`0.0.0.0/0`。 2. 本地防火墙设置:确保服务器防火墙未阻止外部流量,Windows启用入站规则,Linux检查iptables或临时关闭防火墙测试。 3. 验证Web服务状态:检查Apache/Nginx/IIS是否运行并监听所有IP,使用命令行工具确认监听状态。 4. 测试网络连通性:使用外部工具和内网工具测试服务器端口是否开放,排除本地可访问但外网不可的问题。 5. 排查DNS解析:确认域名A记录指向正确公网IP,使用`ping/nslookup`验证解析正
334 2
|
12月前
|
监控 应用服务中间件 定位技术
要统计Nginx的客户端IP,可以通过分析Nginx的访问日志文件来实现
要统计Nginx的客户端IP,可以通过分析Nginx的访问日志文件来实现
1006 3
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
213 2
|
应用服务中间件 nginx
nginx error日志 client intended to send too large body: 1434541 bytes 如何处理?
【8月更文挑战第27天】nginx error日志 client intended to send too large body: 1434541 bytes 如何处理?
940 6
|
Ubuntu Linux 测试技术
在Linux中,已知 apache 服务的访问日志按天记录在服务器本地目录/app/logs 下,由于磁盘空间紧张现在要求只能保留最近7天的访问日志,请问如何解决?
在Linux中,已知 apache 服务的访问日志按天记录在服务器本地目录/app/logs 下,由于磁盘空间紧张现在要求只能保留最近7天的访问日志,请问如何解决?
|
应用服务中间件 Linux nginx
在Linux中,如何统计ip访问情况?分析 nginx 访问日志?如何找出访问页面数量在前十位的ip?
在Linux中,如何统计ip访问情况?分析 nginx 访问日志?如何找出访问页面数量在前十位的ip?
|
存储 Ubuntu 应用服务中间件
如何在 Ubuntu VPS 上配置 Nginx 的日志记录和日志轮转
如何在 Ubuntu VPS 上配置 Nginx 的日志记录和日志轮转
203 4