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; } }