/* * fwts_log_printf_json() * print to a log */ static int fwts_log_print_json( fwts_log_file *log_file, const fwts_log_field field, const fwts_log_level level, const char *status, const char *label, const char *prefix, const char *buffer) { char tmpbuf[4096]; struct tm tm; time_t now; json_object *header; json_object *json_log = (json_object*)json_stack[json_stack_index-1].log; json_object *obj; char *str; FWTS_UNUSED(prefix); if (!((field & LOG_FIELD_MASK) & fwts_log_filter)) return 0; if (field & (LOG_NEWLINE | LOG_SEPARATOR | LOG_DEBUG)) return 0; time(&now); localtime_r(&now, &tm); if ((header = json_object_new_object()) == NULL) fwts_log_out_of_memory_json(); if ((obj = json_object_new_int(log_file->line_number)) == NULL) fwts_log_out_of_memory_json(); json_object_object_add(header, "line_num", obj); snprintf(tmpbuf, sizeof(tmpbuf), "%2.2d/%2.2d/%-2.2d", tm.tm_mday, tm.tm_mon + 1, (tm.tm_year+1900) % 100); if ((obj = json_object_new_string(tmpbuf)) == NULL) fwts_log_out_of_memory_json(); json_object_object_add(header, "date", obj); snprintf(tmpbuf, sizeof(tmpbuf), "%2.2d:%2.2d:%2.2d", tm.tm_hour, tm.tm_min, tm.tm_sec); if ((obj = json_object_new_string(tmpbuf)) == NULL) fwts_log_out_of_memory_json(); json_object_object_add(header, "time", obj); if ((obj = json_object_new_string(fwts_log_field_to_str_full(field))) == NULL) fwts_log_out_of_memory_json(); json_object_object_add(header, "field_type", obj); str = fwts_log_level_to_str(level); if (!strcmp(str, " ")) str = "None"; if ((obj = json_object_new_string(str)) == NULL) fwts_log_out_of_memory_json(); json_object_object_add(header, "level", obj); if ((obj = json_object_new_string(*status ? status : "None")) == NULL) fwts_log_out_of_memory_json(); json_object_object_add(header, "status", obj); if ((obj = json_object_new_string(label && *label ? label : "None")) == NULL) fwts_log_out_of_memory_json(); json_object_object_add(header, "failure_label", obj); /* Redundant really if ((obj = json_object_new_string(log->owner)) == NULL) fwts_log_out_of_memory_json(); json_object_object_add(header, "owner", obj); */ if ((obj = json_object_new_string(buffer)) == NULL) fwts_log_out_of_memory_json(); json_object_object_add(header, "log_text", obj); json_object_array_add(json_log, header); log_file->line_number++; /* This is academic really */ return 0; }
/* * fwts_log_print_xml() * print to a log */ static int fwts_log_print_xml( fwts_log_file *log_file, const fwts_log_field field, const fwts_log_level level, const char *status, const char *label, const char *prefix, const char *buffer) { struct tm tm; time_t now; char *str; FWTS_UNUSED(prefix); if (!((field & LOG_FIELD_MASK) & fwts_log_filter)) return 0; if (field & (LOG_NEWLINE | LOG_SEPARATOR | LOG_DEBUG)) return 0; time(&now); localtime_r(&now, &tm); fprintf(log_file->fp, "%*s<logentry>\n", xml_stack_index * XML_INDENT, ""); fprintf(log_file->fp, "%*s<line_num>%" PRIu32 "</line_num>\n", (xml_stack_index + 1) * XML_INDENT, "", log_file->line_number); fprintf(log_file->fp, "%*s<date>%2.2d/%2.2d/%-2.2d</date>\n", (xml_stack_index + 1) * XML_INDENT, "", tm.tm_mday, tm.tm_mon + 1, (tm.tm_year+1900) % 100); fprintf(log_file->fp, "%*s<time>%2.2d:%2.2d:%2.2d</time>\n", (xml_stack_index + 1) * XML_INDENT, "", tm.tm_hour, tm.tm_min, tm.tm_sec); fprintf(log_file->fp, "%*s<field_type>%s</field_type>\n", (xml_stack_index + 1) * XML_INDENT, "", fwts_log_field_to_str_full(field)); str = fwts_log_level_to_str(level); if (!strcmp(str, " ")) str = "None"; fprintf(log_file->fp, "%*s<level>%s</level>\n", (xml_stack_index + 1) * XML_INDENT, "", str); fprintf(log_file->fp, "%*s<status>%s</status>\n", (xml_stack_index + 1) * XML_INDENT, "", *status ? status : "None"); fprintf(log_file->fp, "%*s<failure_label>%s</failure_label>\n", (xml_stack_index + 1) * XML_INDENT, "", label && *label ? label : "None"); fprintf(log_file->fp, "%*s<log_text>%s</log_text>\n", (xml_stack_index + 1) * XML_INDENT, "", buffer); fprintf(log_file->fp, "%*s</logentry>\n", xml_stack_index * XML_INDENT, ""); fflush(log_file->fp); log_file->line_number++; return 0; }
/* * fwts_log_print_html() * print to a log */ static int fwts_log_print_html( fwts_log_file *log_file, const fwts_log_field field, const fwts_log_level level, const char *status, const char *label, const char *prefix, const char *buffer) { char *str; char *style; char *code_start; char *code_end; char *html_converted; FWTS_UNUSED(label); FWTS_UNUSED(prefix); if (!((field & LOG_FIELD_MASK) & fwts_log_filter)) return 0; if (field & (LOG_NEWLINE | LOG_SEPARATOR | LOG_DEBUG)) return 0; if ((html_converted = fwts_log_html_convert_ascii_str(buffer)) == NULL) { /* We can't report an error via the logging mechanism in case we loop */ fprintf(stderr, "Out of memory converting html.\n"); exit(EXIT_FAILURE); } fwts_log_html(log_file, "<TR>\n"); if (field & LOG_VERBATUM) { code_start = "<PRE class=style_code>"; code_end = "</PRE>"; } else { code_start = ""; code_end = ""; } switch (field & LOG_FIELD_MASK) { case LOG_ERROR: fwts_log_html(log_file, " <TD class=style_error>Error</TD>" "<TD COLSPAN=2>%s</TD>\n", html_converted); break; case LOG_WARNING: fwts_log_html(log_file, " <TD class=style_error>Warning</TD>" "<TD COLSPAN=2 class=style_advice_info>%s%s%s</TD>\n", code_start, html_converted, code_end); break; case LOG_HEADING: fwts_log_html(log_file, "<TD COLSPAN=2 class=style_heading>%s%s%s</TD>\n", code_start, html_converted, code_end); break; case LOG_INFO: fwts_log_html(log_file, " <TD></TD><TD COLSPAN=2 class=style_infos>%s%s%s</TD>\n", code_start, html_converted, code_end); break; case LOG_PASSED: fwts_log_html(log_file, "<TD class=style_passed>PASSED</TD><TD>%s</TD>\n", html_converted); break; case LOG_FAILED: switch (level) { case LOG_LEVEL_CRITICAL: style = " class=style_critical"; break; case LOG_LEVEL_HIGH: style = " class=style_high"; break; case LOG_LEVEL_MEDIUM: style = " class=style_medium"; break; case LOG_LEVEL_LOW: style = " class=style_low"; break; case LOG_LEVEL_INFO: case LOG_LEVEL_NONE: default: style = ""; break; } str = fwts_log_level_to_str(level); fwts_log_html(log_file, " <TD%s>%s [%s]</TD>\n", style, *status ? status : "", str); fwts_log_html(log_file, " <TD>%s</TD>\n", html_converted); break; case LOG_SKIPPED: fwts_log_html(log_file, "<TD class=style_skipped>Skipped</TD>" "<TD>%s%s%s</TD>\n", code_start, html_converted, code_end); break; case LOG_SUMMARY: fwts_log_html(log_file, " <TD></TD>" "<TD COLSPAN=2 class=style_summary>%s%s%s</TD>\n", code_start, html_converted, code_end); break; case LOG_ADVICE: fwts_log_html(log_file, " <TD class=style_advice>Advice</TD>" "<TD COLSPAN=2 class=style_advice_info>%s%s%s</TD>\n", code_start, html_converted, code_end); break; default: break; } free(html_converted); fwts_log_html(log_file, "</TR>\n"); fflush(log_file->fp); log_file->line_number++; /* not used, but bump it anyway */ return 0; }