use nslog library for logging if available.

This commit is contained in:
Vincent Sanders 2017-08-31 07:57:35 +01:00
parent f8cdbbce19
commit 8d9b2efc11
6 changed files with 201 additions and 108 deletions

View File

@ -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
# ----------------------------------------------------------------------------

View File

@ -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

View File

@ -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);

View File

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

View File

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

View File

@ -17,8 +17,8 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _NETSURF_LOG_H_
#define _NETSURF_LOG_H_
#ifndef NETSURF_LOG_H
#define NETSURF_LOG_H
#include <stdio.h>
#include <stdbool.h>
@ -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/nslog.h>
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