From 8d9b2efc11529da8cb5870b39ff15249c648b10a Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Thu, 31 Aug 2017 07:57:35 +0100 Subject: [PATCH] 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 | 237 ++++++++++++-------- utils/log.h | 42 +++- 6 files changed, 201 insertions(+), 108 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,91 +36,15 @@ bool verbose_log = false; /** The stream to which logging is sent */ static FILE *logfile; -nserror nslog_init(nslog_ensure_t *ensure, int *pargc, char **argv) -{ - struct utsname utsname; - nserror ret = NSERROR_OK; - - if (((*pargc) > 1) && - (argv[1][0] == '-') && - (argv[1][1] == 'v') && - (argv[1][2] == 0)) { - int argcmv; - - /* verbose logging to stderr */ - logfile = stderr; - - /* remove -v from argv list */ - for (argcmv = 2; argcmv < (*pargc); argcmv++) { - argv[argcmv - 1] = argv[argcmv]; - } - (*pargc)--; - - /* ensure we actually show logging */ - verbose_log = true; - } else if (((*pargc) > 2) && - (argv[1][0] == '-') && - (argv[1][1] == 'V') && - (argv[1][2] == 0)) { - int argcmv; - - /* verbose logging to file */ - logfile = fopen(argv[2], "a+"); - - /* remove -V and filename from argv list */ - for (argcmv = 3; argcmv < (*pargc); argcmv++) { - argv[argcmv - 2] = argv[argcmv]; - } - (*pargc) -= 2; - - if (logfile == NULL) { - /* could not open log file for output */ - ret = NSERROR_NOT_FOUND; - verbose_log = false; - } else { - - /* ensure we actually show logging */ - verbose_log = true; - } - } else if (verbose_log == true) { - /* default is logging to stderr */ - logfile = stderr; - } - - /* ensure output file handle is correctly configured */ - if ((verbose_log == true) && - (ensure != NULL) && - (ensure(logfile) == false)) { - /* failed to ensure output configuration */ - ret = NSERROR_INIT_FAILED; - verbose_log = false; - } - - /* sucessfull logging initialisation so log system info */ - if (ret == NSERROR_OK) { - LOG("NetSurf version '%s'", netsurf_version); - if (uname(&utsname) < 0) { - LOG("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); - } - } - - 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. -*/ +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) { @@ -166,24 +90,151 @@ static const char *nslog_gettime(void) timeval_subtract(&tv, &now_tv, &start_tv); snprintf(buff, sizeof(buff),"(%ld.%06ld)", - (long)tv.tv_sec, (long)tv.tv_usec); + (long)tv.tv_sec, (long)tv.tv_usec); return buff; } -void nslog_log(const char *file, const char *func, int ln, const char *format, ...) +#ifdef WITH_NSLOG + +static void +netsurf_render_log(void *_ctx, + nslog_entry_context_t *ctx, + const char *fmt, + va_list args) { - va_list ap; - fprintf(logfile, "%s %s:%i %s: ", nslog_gettime(), file, ln, func); + fprintf(logfile, + "%s %.*s:%i %.*s: ", + nslog_gettime(), + ctx->filenamelen, + ctx->filename, + ctx->lineno, + ctx->funcnamelen, + ctx->funcname); - va_start(ap, format); - - vfprintf(logfile, format, ap); - - va_end(ap); + 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; + nserror ret = NSERROR_OK; + + if (((*pargc) > 1) && + (argv[1][0] == '-') && + (argv[1][1] == 'v') && + (argv[1][2] == 0)) { + int argcmv; + + /* verbose logging to stderr */ + logfile = stderr; + + /* remove -v from argv list */ + for (argcmv = 2; argcmv < (*pargc); argcmv++) { + argv[argcmv - 1] = argv[argcmv]; + } + (*pargc)--; + + /* ensure we actually show logging */ + verbose_log = true; + } else if (((*pargc) > 2) && + (argv[1][0] == '-') && + (argv[1][1] == 'V') && + (argv[1][2] == 0)) { + int argcmv; + + /* verbose logging to file */ + logfile = fopen(argv[2], "a+"); + + /* remove -V and filename from argv list */ + for (argcmv = 3; argcmv < (*pargc); argcmv++) { + argv[argcmv - 2] = argv[argcmv]; + } + (*pargc) -= 2; + + if (logfile == NULL) { + /* could not open log file for output */ + ret = NSERROR_NOT_FOUND; + verbose_log = false; + } else { + + /* ensure we actually show logging */ + verbose_log = true; + } + } else if (verbose_log == true) { + /* default is logging to stderr */ + logfile = stderr; + } + + /* ensure output file handle is correctly configured */ + if ((verbose_log == true) && + (ensure != NULL) && + (ensure(logfile) == false)) { + /* failed to ensure output configuration */ + ret = NSERROR_INIT_FAILED; + 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) { + NSLOG(netsurf, INFO, "NetSurf version '%s'", netsurf_version); + if (uname(&utsname) < 0) { + NSLOG(netsurf, INFO, + "Failed to extract machine information"); + } else { + 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; +} 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