Escape slashes in log output for JSON format

I would like to add “json” option for additional escape for backslash
character. So it will be:
access_log path format json;

The initial patch for 1.6.2 looks like:
— ./src/http/modules/ngx_http_log_module.c.orig
+++ ./src/http/modules/ngx_http_log_module.c
@@ -67,6 +67,7 @@
time_t disk_full_time;
time_t error_log_time;
ngx_http_log_fmt_t *format;

  • ngx_uint_t json;
    } ngx_http_log_t;

@@ -881,7 +882,7 @@

 value->escape = len ? 1 : 0;
  • return value->len + len * 3;
  • return value->len + len * 4;
    }

@@ -951,6 +952,7 @@
while (size) {
if (escape[*src >> 5] & (1 << (*src & 0x1f))) {
*dst++ = ‘\’;

  •        *dst++ = '\\';
           *dst++ = 'x';
           *dst++ = hex[*src >> 4];
           *dst++ = hex[*src & 0xf];
    

@@ -1068,6 +1070,7 @@
log->script = NULL;
log->disk_full_time = 0;
log->error_log_time = 0;

  • log->json = 0;

    lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_log_module);
    fmt = lmcf->formats.elts;
    @@ -1087,6 +1090,7 @@

    ssize_t size;
    ngx_int_t gzip;

  • ngx_int_t json;
    ngx_uint_t i, n;
    ngx_msec_t flush;
    ngx_str_t *value, name, s;
    @@ -1189,6 +1193,7 @@
    size = 0;
    flush = 0;
    gzip = 0;

  • json = 0;

    for (i = 3; i < cf->args->nelts; i++) {

@@ -1255,6 +1260,16 @@
#endif
}

  •    if (ngx_strncmp(value[i].data, "json", 4) == 0)
    
  •    {
    
  •        s.len = value[i].len - 5;
    
  •        s.data = value[i].data + 5;
    
  •        json = 1;
    
  •        continue;
    
  •    }
    
  •    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
                          "invalid parameter \"%V\"", &value[i]);
       return NGX_CONF_ERROR;
    

@@ -1267,6 +1282,10 @@
return NGX_CONF_ERROR;
}

  • if (json) {

  •    log->json = 1;
    
  • }

  • if (size) {

       if (log->script) {
    

But I can’t figure out how can I pass the json variable directly to the
functions:

  • ngx_http_log_variable_getlen
    and
  • ngx_http_log_variable

Can someone give me suggestions?

Posted at Nginx Forum:
http://forum.nginx.org/read.php?2,255071,255071#msg-255071

I’ve done the patch for nginx 1.6.2

Now if you use this config:
access_log logs/access.log main json;

Additional backslash for backslash should appear in log. And it will not
break JSON format.

Can someone review my changes?
https://github.com/kayrus/nginx/commit/682f3684ea331e089aa124fe7fce8409e13c1870

Posted at Nginx Forum:
http://forum.nginx.org/read.php?2,255071,255142#msg-255142