From 8d9b2efc11529da8cb5870b39ff15249c648b10a Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Thu, 31 Aug 2017 07:57:35 +0100 Subject: use nslog library for logging if available. --- Makefile | 6 + Makefile.defaults | 8 + content/handlers/javascript/duktape/dukky.h | 4 +- test/log.c | 12 +- utils/log.c | 221 +++++++++++++++++----------- utils/log.h | 42 ++++-- 6 files changed, 193 insertions(+), 100 deletions(-) diff --git a/Makefile b/Makefile index 1c2f517d6..146b2f7cb 100644 --- a/Makefile +++ b/Makefile @@ -537,6 +537,7 @@ NETSURF_FEATURE_NSSVG_CFLAGS := -DWITH_NS_SVG NETSURF_FEATURE_OPENSSL_CFLAGS := -DWITH_OPENSSL NETSURF_FEATURE_ROSPRITE_CFLAGS := -DWITH_NSSPRITE NETSURF_FEATURE_NSPSL_CFLAGS := -DWITH_NSPSL +NETSURF_FEATURE_NSLOG_CFLAGS := -DWITH_NSLOG # libcurl and openssl ordering matters as if libcurl requires ssl it # needs to come first in link order to ensure its symbols can be @@ -557,6 +558,7 @@ $(eval $(call pkg_config_find_and_add_enabled,GIF,libnsgif,GIF)) $(eval $(call pkg_config_find_and_add_enabled,NSSVG,libsvgtiny,SVG)) $(eval $(call pkg_config_find_and_add_enabled,ROSPRITE,librosprite,Sprite)) $(eval $(call pkg_config_find_and_add_enabled,NSPSL,libnspsl,PSL)) +$(eval $(call pkg_config_find_and_add_enabled,NSLOG,libnslog,LOG)) # List of directories in which headers are searched for INCLUDE_DIRS :=. include $(OBJROOT) @@ -569,6 +571,10 @@ CXXFLAGS += -DNETSURF_UA_FORMAT_STRING=\"$(NETSURF_UA_FORMAT_STRING)\" CFLAGS += -DNETSURF_HOMEPAGE=\"$(NETSURF_HOMEPAGE)\" CXXFLAGS += -DNETSURF_HOMEPAGE=\"$(NETSURF_HOMEPAGE)\" +# set the logging level +CFLAGS += -DNETSURF_LOG_LEVEL=$(NETSURF_LOG_LEVEL) +CXXFLAGS += -DNETSURF_LOG_LEVEL=$(NETSURF_LOG_LEVEL) + # ---------------------------------------------------------------------------- # General make rules # ---------------------------------------------------------------------------- diff --git a/Makefile.defaults b/Makefile.defaults index a3ccf871d..d6637da9e 100644 --- a/Makefile.defaults +++ b/Makefile.defaults @@ -70,8 +70,16 @@ NETSURF_USE_DUKTAPE := YES NETSURF_USE_HARU_PDF := NO # Enable the use of the Public suffix library to detect supercookies +# Valid options: YES, NO, AUTO (highly recommended) NETSURF_USE_NSPSL := AUTO +# Enable use of filtered logging library +# Valid options: YES, NO, AUTO (highly recommended) +NETSURF_USE_NSLOG := AUTO +# The minimum logging level *compiled* into netsurf +# Valid options are: DEEPDEBUG, DEBUG, VERBOSE, INFO, WARNING, ERROR, CRITICAL +NETSURF_LOG_LEVEL := INFO + # Enable stripping the NetSurf binary # Valid options: YES, NO NETSURF_STRIP_BINARY := NO diff --git a/content/handlers/javascript/duktape/dukky.h b/content/handlers/javascript/duktape/dukky.h index b5809aa08..435e0c305 100644 --- a/content/handlers/javascript/duktape/dukky.h +++ b/content/handlers/javascript/duktape/dukky.h @@ -26,11 +26,13 @@ #define DUKKY_H #ifdef JS_DEBUG -# define JS_LOG(format, args...) LOG(format , ##args) +# define JS_LOG(format, args...) NSLOG(netsurf, INFO, format , ##args) #else # define JS_LOG(format, ...) ((void) 0) #endif +#define LOG(format, args...) NSLOG(netsurf, INFO, format , ##args) + duk_ret_t dukky_create_object(duk_context *ctx, const char *name, int args); duk_bool_t dukky_push_node_stacked(duk_context *ctx); duk_bool_t dukky_push_node(duk_context *ctx, struct dom_node *node); diff --git a/test/log.c b/test/log.c index 90b4379e9..fc6b6285c 100644 --- a/test/log.c +++ b/test/log.c @@ -42,13 +42,15 @@ void nslog_log(const char *file, const char *func, int ln, const char *format, . { va_list ap; - fprintf(stderr, "%s:%i %s: ", file, ln, func); + if (verbose_log) { + fprintf(stderr, "%s:%i %s: ", file, ln, func); - va_start(ap, format); + va_start(ap, format); - vfprintf(stderr, format, ap); + vfprintf(stderr, format, ap); - va_end(ap); + va_end(ap); - fputc('\n', stderr); + fputc('\n', stderr); + } } diff --git a/utils/log.c b/utils/log.c index 15a7a9e75..2f0d3b3bf 100644 --- a/utils/log.c +++ b/utils/log.c @@ -36,6 +36,116 @@ bool verbose_log = false; /** The stream to which logging is sent */ static FILE *logfile; +NSLOG_DEFINE_CATEGORY(netsurf, "NetSurf default logging"); + +/** 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 + +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); +} + +#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); + } +} + +#endif + nserror nslog_init(nslog_ensure_t *ensure, int *pargc, char **argv) { struct utsname utsname; @@ -59,9 +169,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 */ @@ -96,94 +206,35 @@ nserror nslog_init(nslog_ensure_t *ensure, int *pargc, char **argv) verbose_log = false; } +#ifdef WITH_NSLOG + + 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) -{ - /* 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; -} - -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); -} - -#endif diff --git a/utils/log.h b/utils/log.h index 708016b18..0e73f4d37 100644 --- a/utils/log.h +++ b/utils/log.h @@ -17,8 +17,8 @@ * along with this program. If not, see . */ -#ifndef _NETSURF_LOG_H_ -#define _NETSURF_LOG_H_ +#ifndef NETSURF_LOG_H +#define NETSURF_LOG_H #include #include @@ -43,9 +43,31 @@ typedef bool(nslog_ensure_t)(FILE *fptr); */ extern nserror nslog_init(nslog_ensure_t *ensure, int *pargc, char **argv); -#ifdef NDEBUG -# define LOG(format, ...) ((void) 0) -#else +#ifndef NETSURF_LOG_LEVEL +#define NETSURF_LOG_LEVEL INFO +#endif + +#define NSLOG_LVL(level) NSLOG_LEVEL_ ## level +#define NSLOG_EVL(level) NSLOG_LVL(level) +#define NSLOG_COMPILED_MIN_LEVEL NSLOG_EVL(NETSURF_LOG_LEVEL) + +#ifdef WITH_NSLOG + +#include + +NSLOG_DECLARE_CATEGORY(netsurf); + +#else /* WITH_NSLOG */ + +enum nslog_level { + NSLOG_LEVEL_DEEPDEBUG = 0, + NSLOG_LEVEL_DEBUG = 1, + NSLOG_LEVEL_VERBOSE = 2, + NSLOG_LEVEL_INFO = 3, + NSLOG_LEVEL_WARNING = 4, + NSLOG_LEVEL_ERROR = 5, + NSLOG_LEVEL_CRITICAL = 6 +}; extern void nslog_log(const char *file, const char *func, int ln, const char *format, ...) __attribute__ ((format (printf, 4, 5))); @@ -60,13 +82,15 @@ extern void nslog_log(const char *file, const char *func, int ln, const char *fo # define LOG_LN __LINE__ # endif -#define LOG(format, args...) \ +#define NSLOG(catname, level, logmsg, args...) \ do { \ - if (verbose_log) { \ - nslog_log(__FILE__, LOG_FN, LOG_LN, format , ##args); \ + if (NSLOG_LEVEL_##level >= NSLOG_COMPILED_MIN_LEVEL) { \ + nslog_log(__FILE__, LOG_FN, LOG_LN, logmsg , ##args); \ } \ } while(0) -#endif +#define NSLOG_DEFINE_CATEGORY(catname, description) + +#endif /* WITH_NSLOG */ #endif -- cgit v1.2.3