澳门皇冠金沙网站-澳门皇冠844网站

热门关键词: 澳门皇冠金沙网站,澳门皇冠844网站

修改nginx的日期格式,log日志时间格式

一、修改原因
  因为要获取nginx访问信息,作为开发的数据使用,但是nginx的access.log文件中的默认的时间格式是这样的:

修改nginx的日期格式

gettimeofday()的开销
在Linux中,Nginx通过gettimeofday()获取系统当前时间;
gettimeofday是C库提供的函数(不是系统调用),它封装了内核里的sys_gettimeofday系统调用。
Linux的系统调用通过int 80h实现,用系统调用号来区分入口函数,步骤大致如下:
1 API将系统调用号存入EAX,然后通过中断调用使系统进入内核态;
2 内核中的中断处理函数根据系统调用号,调用对应的内核函数(系统调用);
3 系统调用完成相应功能,将返回值存入EAX,返回到中断处理函数;
4 中断处理函数返回到API中;
5 API将EAX返回给应用程序

  [02/Nov/2017:20:48:25 0800]

 

然而除了基本的系统调用外,x86_64还提供了sysenter/vsyscall方式获取内核态数据,vsyscall在内存中创建内核态的共享页面,用户态也有权访问,可不经过系统中断和陷入内核获取内核信息;
gettimeofday()便是通过vsyscall实现了系统调用。

  而要求的格式类似如下:

开发有要求需要修改nginx日志中的时间格式

更新时间缓存
为避免每次都调用OS的gettimeofday,nginx采用时间缓存,每个worker进程都能自行维护;
为控制并发访问,每次更新时间缓存前需申请锁,而读时间缓存无须加锁;
为避免分裂读,即某worker进程读时间缓存过程中接受中断请求,期间时间缓存被其他worker更新,导致前后读取时间不一致;nginx引入时间缓存数组(共64个成员),每次都更新数组中的下一个元素;
 更新时间通过ngx_time_update()实现
typedef struct {
    time_t      sec;
    ngx_uint_t  msec;
    ngx_int_t  gmtoff;
 } ngx_time_t;
volatile ngx_time_t    *ngx_cached_time;
volatile ngx_str_t      ngx_cached_err_log_time;
volatile ngx_str_t      ngx_cached_http_time;
volatile ngx_str_t      ngx_cached_http_log_time;
volatile ngx_str_t      ngx_cached_http_log_iso8601;

  [2017-11-02 20:52:06]

2010-08-23 17:27:11

static ngx_time_t        cached_time[NGX_TIME_SLOTS];
static u_char            cached_err_log_time[NGX_TIME_SLOTS][sizeof("1970/09/28 12:00:00")];
static u_char            cached_http_time[NGX_TIME_SLOTS][sizeof("Mon, 28 Sep 1970 06:00:00 GMT")];
static u_char            cached_http_log_time[NGX_TIME_SLOTS][sizeof("28/Sep/1970:12:00:00 0600")];
static u_char            cached_http_log_iso8601[NGX_TIME_SLOTS][sizeof("1970-09-28T12:00:00 06:00")];
static u_char            cached_syslog_time[NGX_TIME_SLOTS][sizeof("Sep 28 12:00:00")];

二、修改方法
  方法都几种,但是修改源码的方法看上去麻烦,做起来也简单,我这边修改了源码(把原来的删了,复制新的),重新编译

Nginx的默认日志时间格式为

void
ngx_time_update(void)
{
    u_char          *p0, *p1, *p2, *p3, *p4;
    ngx_tm_t        tm, gmt;
    time_t          sec;
    ngx_uint_t      msec;
    ngx_time_t      *tp;
    struct timeval  tv;

  1.修改src/http/modules/ngx_http_log_module.c  

23/Aug/2010:17:26:44 0800

    if (!ngx_trylock(&ngx_time_lock)) {--更新缓存前需获取ngx_time_lock
        return;
    }

1) { ngx_string("time_local"), sizeof("28/Sep/1970:12:00:00 0600") - 1,
                          ngx_http_log_time },
修改后:
{ ngx_string("time_local"), sizeof("1970-09-28 12:00:00 0600") - 1,
                          ngx_http_log_time },
 
 
  return ngx_cpymem(buf, ngx_cached_http_log_time.data,
                      ngx_cached_http_log_time.len);
修改后:
  return ngx_cpymem(buf, ngx_cached_err_log_time.data,
                      ngx_cached_err_log_time.len);

 

    ngx_gettimeofday(&tv);--宏定义,调用os的gettimeofday(tp, null)

  2、修改 src/core/ngx_times.c 140行

1.修改src/http/modules/ngx_http_log_澳门皇冠金沙网站,module.c

    sec = tv.tv_sec;
    msec = tv.tv_usec / 1000;
    ngx_current_msec = (ngx_msec_t) sec * 1000 msec;

 (void) ngx_sprintf(p1, "M/d/d d:d:d",
                      tm.ngx_tm_year, tm.ngx_tm_mon,
                      tm.ngx_tm_mday, tm.ngx_tm_hour,
                      tm.ngx_tm_min, tm.ngx_tm_sec);
 
修改后
    (void) ngx_sprintf(p1, "M-d-d d:d:d",
                      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 = &cached_time[slot]; --读当前时间缓存

  3.备份一下配置文件(小心一些好)

第一处

    if (tp->sec == sec) { --如果缓存的时间秒=当前时间秒,直接更新当前slot元素的msec并返回,否则更新下一个slot数组元素;
        tp->msec = msec;
        ngx_unlock(&ngx_time_lock);
        return;
    }

  4.重新编译,参数还是用原来的吧

修改前:

    if (slot == NGX_TIME_SLOTS - 1) {
        slot = 0;
    } else {
        slot ;
    }

      5. make && make install 之后重启nginx就行了

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

    tp = &cached_time[slot];
    tp->sec = sec;
    tp->msec = msec;
    ngx_gmtime(sec, &gmt);

下面关于Nginx的文章您也可能喜欢,不妨参考下:

                          ngx_http_log_time },

    p0 = &cached_http_time[slot][0]; 
--ngx_sprintf读取所有参数并调用ngx_vslprintf,将后续参数以第二个参数的格式复制到P0开始的内存区,即给cached_http_time[slot]赋值,
--后续的cached_err_log_time[slot] & cached_http_log_time[slot] & cached_http_log_iso8601[slot] & cached_syslog_time[slot]也同理
    (void) ngx_sprintf(p0, "%s, d %s M d:d:d GMT",
                      week[gmt.ngx_tm_wday], gmt.ngx_tm_mday,
                      months[gmt.ngx_tm_mon - 1], gmt.ngx_tm_year,
                      gmt.ngx_tm_hour, gmt.ngx_tm_min, gmt.ngx_tm_sec);

Nginx 403 forbidden的解决办法  http://www.linuxidc.com/Linux/2017-08/146084.htm

修改后:

        ..................
    ngx_memory_barrier();--禁止编译器对后面的语句优化,如果没有这个限制,编译器可能将前后两部分代码合并,可能导致这6个时间更新出现间隔,期间若被读取会出现时间不一致的情况

CentOS 7下Nginx服务器的安装配置  http://www.linuxidc.com/Linux/2017-04/142986.htm

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

    ngx_cached_time = tp;
    ngx_cached_http_time.data = p0;
    ngx_cached_err_log_time.data = p1;
    ngx_cached_http_log_time.data = p2;
    ngx_cached_http_log_iso8601.data = p3;
    ngx_cached_syslog_time.data = p4;

CentOS上安装Nginx服务器实现虚拟主机和域名重定向  http://www.linuxidc.com/Linux/2017-04/142642.htm

                          ngx_http_log_time },

    ngx_unlock(&ngx_time_lock);
}

CentOS 6.8 安装LNMP环境(Linux Nginx MySQL PHP)  http://www.linuxidc.com/Linux/2017-04/142880.htm

 

ngx_time_update()调用最频繁的是在worker进程处理事件时
ngx_worker_process_cycle -- ngx_process_events_and_timers -- ngx_process_events
#define ngx_process_events  ngx_event_actions.process_events
以epoll为例,其对应API为ngx_epoll_process_events
ngx_epoll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags)
    events = epoll_wait(ep, event_list, (int) nevents, timer);
    err = (events == -1) ? ngx_errno : 0;
    if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) { 
        ngx_time_update();
    }
epoll_wait()阻塞时可以被三种事件唤醒:读写事件发生、等待时间超时和事件信号中断。
当epoll_wait()返回时,会更新一次时间缓存,然后调用处理函数;事件处理函数是non-block的,本身执行时间极短(毫秒级),故即便当前时间是缓存的,误差很小可以接受。

Linux下安装PHP环境并配置Nginx支持php-fpm模块  http://www.linuxidc.com/Linux/2017-05/144333.htm

第二处  www.2cto.com  

如何控制时间更新频率
nginx提供参数timer_resolution,设置缓存时间更新的间隔;
配置该项后,nginx将使用中断机制,而非使用定时器红黑树中的最小时间为epoll_wait的超时时间,即此时定时器将定期被中断。
timer_resolution指令的使用将会设置epoll_wait超时时间为-1,这表示epoll_wait将永远阻塞直至读写事件发生或信号中断。

Nginx服务的SSL认证和htpasswd认证  http://www.linuxidc.com/Linux/2017-04/142478.htm

修改前:

ngx_process_events_and_timers(ngx_cycle_t *cycle)
  if (ngx_timer_resolution) {
        timer = NGX_TIMER_INFINITE;
        flags = 0;
    } else {
        timer = ngx_event_find_timer();
        flags = NGX_UPDATE_TIME;
    }
1.设置timer_resolution时,flags=0,只有当ngx_event_timer_alarm=1时epoll_wait()返回时才执行ngx_time_update(更新后会把ngx_event_timer_alarm置零)
2.没有设置timer_resolution,flags = NGX_UPDATE_TIME,timer为定时器红黑树中最小定时时间,将作为epoll_wait的超时时间(timeout)

Ubuntu 16.04上启用加密安全的Nginx Web服务器  http://www.linuxidc.com/Linux/2017-07/145522.htm

  return ngx_cpymem(buf, ngx_cached_http_log_time.data,

ngx_event_process_init(ngx_cycle_t *cycle)
    if (ngx_timer_resolution && !(ngx_event_flags & NGX_USE_TIMER_EVENT)) {
        ngx_memzero(&sa, sizeof(struct sigaction));
        sa.sa_handler = ngx_timer_signal_handler;
        sigemptyset(&sa.sa_mask);

Linux中安装配置Nginx及参数详解  http://www.linuxidc.com/Linux/2017-05/143853.htm

                      ngx_cached_http_log_time.len);

        if (sigaction(SIGALRM, &sa, NULL) == -1) {
            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
                          "sigaction(SIGALRM) failed");
            return NGX_ERROR;
        }

Nginx日志过滤 使用ngx_log_if不记录特定日志 http://www.linuxidc.com/Linux/2014-07/104686.htm

修改后:

        itv.it_interval.tv_sec = ngx_timer_resolution / 1000;
        itv.it_interval.tv_usec = (ngx_timer_resolution % 1000) * 1000;
        itv.it_value.tv_sec = ngx_timer_resolution / 1000;
        itv.it_value.tv_usec = (ngx_timer_resolution % 1000 ) * 1000;

CentOS 7.2下Nginx PHP MySQL Memcache缓存服务器安装配置  http://www.linuxidc.com/Linux/2017-03/142168.htm

  return ngx_cpymem(buf, ngx_cached_err_log_time.data,

        if (setitimer(ITIMER_REAL, &itv, NULL) == -1) { 
            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
                          "setitimer() failed");
        }
    }
每隔ngx_timer_resolution时间发出信号SIGALRM,执行ngx_timer_signal_handler,后者仅仅将ngx_event_timer_alarm = 1,用于epoll_wait()返回后的ngx_time_update()调用

CentOS6.9编译安装Nginx1.4.7  http://www.linuxidc.com/Linux/2017-06/144473.htm

                      ngx_cached_err_log_time.len);

--------------------------------------分割线

CentOS 6.2实战部署Nginx MySQL PHP http://www.linuxidc.com/Linux/2013-09/90020.htm

使用Nginx搭建WEB服务器 http://www.linuxidc.com/Linux/2013-09/89768.htm

搭建基于Linux6.3 Nginx1.2 PHP5 MySQL5.5的Web服务器全过程 http://www.linuxidc.com/Linux/2013-09/89692.htm

CentOS 6.3下Nginx性能调优 http://www.linuxidc.com/Linux/2013-09/89656.htm

CentOS 6.3下配置Nginx加载ngx_pagespeed模块 http://www.linuxidc.com/Linux/2013-09/89657.htm

CentOS 6.4安装配置Nginx Pcre php-fpm http://www.linuxidc.com/Linux/2013-08/88984.htm

Nginx安装配置使用详细笔记 http://www.linuxidc.com/Linux/2014-07/104499.htm

Nginx日志过滤 使用ngx_log_if不记录特定日志 http://www.linuxidc.com/Linux/2014-07/104686.htm

Nginx 的详细介绍:请点这里
Nginx 的下载地址:请点这里

 

--------------------------------------分割线

Nginx 的详细介绍:请点这里
Nginx 的下载地址:请点这里

本文永久更新链接地址:http://www.linuxidc.com/Linux/2014-11/109850.htm

澳门皇冠金沙网站 1

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-11/148221.htm

2、修改 src/core/ngx_times.c 140行

澳门皇冠金沙网站 2

 

修改前

 (void) ngx_sprintf(p1, "M/d/d d:d:d",

                       tm.ngx_tm_year, tm.ngx_tm_mon,

本文由澳门皇冠金沙网站发布于网络操作,转载请注明出处:修改nginx的日期格式,log日志时间格式