diff options
Diffstat (limited to 'utils/log.c')
-rw-r--r-- | utils/log.c | 284 |
1 files changed, 200 insertions, 84 deletions
diff --git a/utils/log.c b/utils/log.c index 15a7a9e75..e267b3179 100644 --- a/utils/log.c +++ b/utils/log.c @@ -1,9 +1,5 @@ /* - * Copyright 2007 Rob Kendrick <rjek@netsurf-browser.org> - * Copyright 2004-2007 James Bursa <bursa@users.sourceforge.net> - * Copyright 2003 Phil Mellor <monkeyson@users.sourceforge.net> - * Copyright 2003 John M Bell <jmb202@ecs.soton.ac.uk> - * Copyright 2004 John Tytgat <joty@netsurf-browser.org> + * Copyright 2017 Vincent Sanders <vince@netsurf-browser.org> * * This file is part of NetSurf, http://www.netsurf-browser.org/ * @@ -24,6 +20,7 @@ #include <stdio.h> #include "utils/config.h" +#include "utils/nsoption.h" #include "utils/sys_time.h" #include "utils/utsname.h" #include "desktop/version.h" @@ -36,6 +33,154 @@ bool verbose_log = false; /** The stream to which logging is sent */ static FILE *logfile; +/** Subtract the `struct timeval' values X and Y + * + * \param result The timeval structure to store the result in + * \param x The first value + * \param y The second value + * \return 1 if the difference is negative, otherwise 0. + */ +static int +timeval_subtract(struct timeval *result, struct timeval *x, struct timeval *y) +{ + /* Perform the carry for the later subtraction by updating y. */ + if (x->tv_usec < y->tv_usec) { + int nsec = (int)(y->tv_usec - x->tv_usec) / 1000000 + 1; + y->tv_usec -= 1000000 * nsec; + y->tv_sec += nsec; + } + if ((int)(x->tv_usec - y->tv_usec) > 1000000) { + int nsec = (int)(x->tv_usec - y->tv_usec) / 1000000; + y->tv_usec += 1000000 * nsec; + y->tv_sec -= nsec; + } + + /* Compute the time remaining to wait. + tv_usec is certainly positive. */ + result->tv_sec = x->tv_sec - y->tv_sec; + result->tv_usec = x->tv_usec - y->tv_usec; + + /* Return 1 if result is negative. */ + return x->tv_sec < y->tv_sec; +} + +/** + * Obtain a formatted string suitable for prepending to a log message + * + * \return formatted string of the time since first log call + */ +static const char *nslog_gettime(void) +{ + static struct timeval start_tv; + static char buff[32]; + + struct timeval tv; + struct timeval now_tv; + + if (!timerisset(&start_tv)) { + gettimeofday(&start_tv, NULL); + } + gettimeofday(&now_tv, NULL); + + timeval_subtract(&tv, &now_tv, &start_tv); + + snprintf(buff, sizeof(buff),"(%ld.%06ld)", + (long)tv.tv_sec, (long)tv.tv_usec); + + return buff; +} + +#ifdef WITH_NSLOG + +NSLOG_DEFINE_CATEGORY(netsurf, "NetSurf default logging"); +NSLOG_DEFINE_CATEGORY(llcache, "Low level cache"); +NSLOG_DEFINE_CATEGORY(fetch, "objet fetching"); +NSLOG_DEFINE_CATEGORY(plot, "rendering system"); +NSLOG_DEFINE_CATEGORY(schedule, "scheduler"); +NSLOG_DEFINE_CATEGORY(fbtk, "Framebuffer toolkit"); +NSLOG_DEFINE_CATEGORY(layout, "Layout"); + +static void +netsurf_render_log(void *_ctx, + nslog_entry_context_t *ctx, + const char *fmt, + va_list args) +{ + fprintf(logfile, + "%s %.*s:%i %.*s: ", + nslog_gettime(), + ctx->filenamelen, + ctx->filename, + ctx->lineno, + ctx->funcnamelen, + ctx->funcname); + + vfprintf(logfile, fmt, args); + + /* Log entries aren't newline terminated add one for clarity */ + fputc('\n', logfile); +} + +/* exported interface documented in utils/log.h */ +nserror +nslog_set_filter(const char *filter) +{ + nslog_error err; + nslog_filter_t *filt = NULL; + + err = nslog_filter_from_text(filter, &filt); + if (err != NSLOG_NO_ERROR) { + if (err == NSLOG_NO_MEMORY) + return NSERROR_NOMEM; + else + return NSERROR_INVALID; + } + + err = nslog_filter_set_active(filt, NULL); + filt = nslog_filter_unref(filt); + if (err != NSLOG_NO_ERROR) { + return NSERROR_NOSPACE; + } + + return NSERROR_OK; +} + +#else + +void +nslog_log(const char *file, const char *func, int ln, const char *format, ...) +{ + va_list ap; + + if (verbose_log) { + fprintf(logfile, + "%s %s:%i %s: ", + nslog_gettime(), + file, + ln, + func); + + va_start(ap, format); + + vfprintf(logfile, format, ap); + + va_end(ap); + + fputc('\n', logfile); + } +} + +/* exported interface documented in utils/log.h */ +nserror +nslog_set_filter(const char *filter) +{ + (void)(filter); + return NSERROR_OK; +} + + +#endif + nserror nslog_init(nslog_ensure_t *ensure, int *pargc, char **argv) { struct utsname utsname; @@ -59,9 +204,9 @@ nserror nslog_init(nslog_ensure_t *ensure, int *pargc, char **argv) /* ensure we actually show logging */ verbose_log = true; } else if (((*pargc) > 2) && - (argv[1][0] == '-') && - (argv[1][1] == 'V') && - (argv[1][2] == 0)) { + (argv[1][0] == '-') && + (argv[1][1] == 'V') && + (argv[1][2] == 0)) { int argcmv; /* verbose logging to file */ @@ -82,7 +227,7 @@ nserror nslog_init(nslog_ensure_t *ensure, int *pargc, char **argv) /* ensure we actually show logging */ verbose_log = true; } - } else if (verbose_log == true) { + } else { /* default is logging to stderr */ logfile = stderr; } @@ -96,94 +241,65 @@ nserror nslog_init(nslog_ensure_t *ensure, int *pargc, char **argv) verbose_log = false; } +#ifdef WITH_NSLOG + + if (nslog_set_filter(verbose_log ? + NETSURF_BUILTIN_VERBOSE_FILTER : + NETSURF_BUILTIN_LOG_FILTER) != NSERROR_OK) { + ret = NSERROR_INIT_FAILED; + verbose_log = false; + } else if (nslog_set_render_callback(netsurf_render_log, NULL) != NSLOG_NO_ERROR) { + ret = NSERROR_INIT_FAILED; + verbose_log = false; + } else if (nslog_uncork() != NSLOG_NO_ERROR) { + ret = NSERROR_INIT_FAILED; + verbose_log = false; + } + +#endif + /* sucessfull logging initialisation so log system info */ if (ret == NSERROR_OK) { - LOG("NetSurf version '%s'", netsurf_version); + NSLOG(netsurf, INFO, "NetSurf version '%s'", netsurf_version); if (uname(&utsname) < 0) { - LOG("Failed to extract machine information"); + NSLOG(netsurf, INFO, + "Failed to extract machine information"); } else { - LOG("NetSurf on <%s>, node <%s>, release <%s>, version <%s>, machine <%s>", - utsname.sysname, - utsname.nodename, - utsname.release, - utsname.version, - utsname.machine); + NSLOG(netsurf, INFO, + "NetSurf on <%s>, node <%s>, release <%s>, version <%s>, machine <%s>", + utsname.sysname, + utsname.nodename, + utsname.release, + utsname.version, + utsname.machine); } } return ret; } -#ifndef NDEBUG - -/* Subtract the `struct timeval' values X and Y, - storing the result in RESULT. - Return 1 if the difference is negative, otherwise 0. -*/ - -static int -timeval_subtract(struct timeval *result, struct timeval *x, struct timeval *y) +/* exported interface documented in utils/log.h */ +nserror +nslog_set_filter_by_options() { - /* Perform the carry for the later subtraction by updating y. */ - if (x->tv_usec < y->tv_usec) { - int nsec = (int)(y->tv_usec - x->tv_usec) / 1000000 + 1; - y->tv_usec -= 1000000 * nsec; - y->tv_sec += nsec; - } - if ((int)(x->tv_usec - y->tv_usec) > 1000000) { - int nsec = (int)(x->tv_usec - y->tv_usec) / 1000000; - y->tv_usec += 1000000 * nsec; - y->tv_sec -= nsec; - } - - /* Compute the time remaining to wait. - tv_usec is certainly positive. */ - result->tv_sec = x->tv_sec - y->tv_sec; - result->tv_usec = x->tv_usec - y->tv_usec; - - /* Return 1 if result is negative. */ - return x->tv_sec < y->tv_sec; + if (verbose_log) + return nslog_set_filter(nsoption_charp(verbose_filter)); + else + return nslog_set_filter(nsoption_charp(log_filter)); } -/** - * Obtain a formatted string suitable for prepending to a log message - * - * \return formatted string of the time since first log call - */ -static const char *nslog_gettime(void) +/* exported interface documented in utils/log.h */ +void +nslog_finalise() { - static struct timeval start_tv; - static char buff[32]; - - struct timeval tv; - struct timeval now_tv; - - if (!timerisset(&start_tv)) { - gettimeofday(&start_tv, NULL); + NSLOG(netsurf, INFO, + "Finalising logging, please report any further messages"); + verbose_log = true; + if (logfile != stderr) { + fclose(logfile); + logfile = stderr; } - gettimeofday(&now_tv, NULL); - - timeval_subtract(&tv, &now_tv, &start_tv); - - snprintf(buff, sizeof(buff),"(%ld.%06ld)", - (long)tv.tv_sec, (long)tv.tv_usec); - - return buff; -} - -void nslog_log(const char *file, const char *func, int ln, const char *format, ...) -{ - va_list ap; - - fprintf(logfile, "%s %s:%i %s: ", nslog_gettime(), file, ln, func); - - va_start(ap, format); - - vfprintf(logfile, format, ap); - - va_end(ap); - - fputc('\n', logfile); -} - +#ifdef WITH_NSLOG + nslog_cleanup(); #endif +} |