예제 #1
0
파일: clfjson.c 프로젝트: HarryR/logpipe
static int
print_clfjson(void *ctx, str_t *str, logmeta_t *meta) {
    json_printer jp;
    str_clear(str);
    json_print_init(&jp, jp_callback, str); 

    char timestamp[50];
    memset(timestamp, 0, sizeof(timestamp));
    strftime(timestamp, sizeof(timestamp), "%d/%b/%Y:%H:%M:%S %z", &meta->utc_timestamp);

    json_print_raw(&jp, JSON_ARRAY_BEGIN, NULL, 0);    
        print_strraw_or_null(&jp, logmeta_field(meta, LOGPIPE_C_IP));
        print_strraw_or_null(&jp, logmeta_field(meta, LOGPIPE_CS_IDENT));
        print_strraw_or_null(&jp, logmeta_field(meta, LOGPIPE_CS_USERNAME));
        json_print_raw(&jp, JSON_STRING, timestamp, strlen(timestamp));
        print_strraw_or_null(&jp, logmeta_field(meta, LOGPIPE_CS_METHOD));
        print_strraw_or_null(&jp, logmeta_field(meta, LOGPIPE_CS_URI_STEM));
        print_strraw_or_null(&jp, logmeta_field(meta, LOGPIPE_SC_STATUS));
        print_strraw_or_null(&jp, logmeta_field(meta, LOGPIPE_BYTES));
        if( ! logmeta_field_isempty(meta, LOGPIPE_CS_REFERER) ) {
            print_strraw_or_null(&jp, logmeta_field(meta, LOGPIPE_CS_REFERER));
            if( ! logmeta_field_isempty(meta, LOGPIPE_CS_USER_AGENT) ) {
                print_strraw_or_null(&jp, logmeta_field(meta, LOGPIPE_CS_USER_AGENT));
            }
        }
    json_print_raw(&jp, JSON_ARRAY_END, NULL, 0);    
    json_print_free(&jp);
    return 1;
}
static void tree_print(json_printer* printer, json_print_function print_func, const json_val_t * v) {
    switch (v->type) {
    case JSON_OBJECT_BEGIN:
        json_print_raw(printer, JSON_OBJECT_BEGIN, NULL, NULL);
        for (int i = 0; i < v->length; i++) {
            json_print_raw(printer, JSON_KEY, v->u.object[i]->key, v->u.object[i]->key_length);
            tree_print(printer, print_func, v->u.object[i]->val);
        }
        json_print_raw(printer, JSON_OBJECT_END, NULL, NULL);
        break;

    case JSON_ARRAY_BEGIN:
        json_print_raw(printer, JSON_ARRAY_BEGIN, NULL, NULL);
        for (int i = 0; i < v->length; i++)
            tree_print(printer, print_func, v->u.array[i]);
        json_print_raw(printer, JSON_ARRAY_END, NULL, NULL);
        break;

    case JSON_STRING:
        json_print_raw(printer, JSON_STRING, v->u.str_val, (uint32_t)strlen(v->u.str_val));
        break;

    case JSON_INT:
        {
            char buffer[32];
            int length = sprintf(buffer, "%lld", v->u.int_val);
            json_print_raw(printer, JSON_INT, buffer, (uint32_t)length);
        }        
        break;

    case JSON_FLOAT:
        {
            char buffer[32];
            int length = sprintf(buffer, "%.17g", v->u.float_val);
            json_print_raw(printer, JSON_FLOAT, buffer, (uint32_t)length);
        }        
        break;

    case JSON_TRUE:
        json_print_raw(printer, JSON_TRUE, "true", 4);
        break;

    case JSON_FALSE:
        json_print_raw(printer, JSON_STRING, "false", 5);
        break;

    case JSON_NULL:
        json_print_raw(printer, JSON_STRING, "null", 4);
        break;
    }
}