From d3cb31f1a74c21ff7ec3514b418fb0686dd35f51 Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Wed, 11 Aug 2021 18:09:10 +0200 Subject: [PATCH] feat(log/configure): `filter` can be an array --- @xen-orchestra/log/README.md | 4 +++ @xen-orchestra/log/configure.js | 55 ++++++++++++++++++++++++--------- CHANGELOG.unreleased.md | 1 + 3 files changed, 45 insertions(+), 15 deletions(-) diff --git a/@xen-orchestra/log/README.md b/@xen-orchestra/log/README.md index 903076fcb..b146a5429 100644 --- a/@xen-orchestra/log/README.md +++ b/@xen-orchestra/log/README.md @@ -66,6 +66,10 @@ configure([ // if filter is a string, then it is pattern // (https://github.com/visionmedia/debug#wildcards) which is // matched against the namespace of the logs + // + // If it's an array, it will be handled as an array of filters + // and the transport will be used if any one of them match the + // current log filter: process.env.DEBUG, transport: transportConsole(), diff --git a/@xen-orchestra/log/configure.js b/@xen-orchestra/log/configure.js index bb6475922..8bb7cebaa 100644 --- a/@xen-orchestra/log/configure.js +++ b/@xen-orchestra/log/configure.js @@ -4,6 +4,42 @@ const { compileGlobPattern } = require('./utils') // =================================================================== +const compileFilter = filter => { + if (filter === undefined) { + return + } + + const type = typeof filter + if (type === 'function') { + return filter + } + if (type === 'string') { + const re = compileGlobPattern(filter) + return log => re.test(log.namespace) + } + + if (Array.isArray(filter)) { + const filters = filter.map(compileFilter).filter(_ => _ !== undefined) + const { length } = filters + if (length === 0) { + return + } + if (length === 1) { + return filters[0] + } + return log => { + for (let i = 0; i < length; ++i) { + if (filters[i](log)) { + return true + } + } + return false + } + } + + throw new TypeError('unsupported `filter`') +} + const createTransport = config => { if (typeof config === 'function') { return config @@ -19,26 +55,15 @@ const createTransport = config => { } } - let { filter } = config - let transport = createTransport(config.transport) const level = resolve(config.level) + const filter = compileFilter([config.filter, level === undefined ? undefined : log => log.level >= level]) + + let transport = createTransport(config.transport) if (filter !== undefined) { - if (typeof filter === 'string') { - const re = compileGlobPattern(filter) - filter = log => re.test(log.namespace) - } - const orig = transport transport = function (log) { - if ((level !== undefined && log.level >= level) || filter(log)) { - return orig.apply(this, arguments) - } - } - } else if (level !== undefined) { - const orig = transport - transport = function (log) { - if (log.level >= level) { + if (filter(log)) { return orig.apply(this, arguments) } } diff --git a/CHANGELOG.unreleased.md b/CHANGELOG.unreleased.md index cf1bf63c7..af056007b 100644 --- a/CHANGELOG.unreleased.md +++ b/CHANGELOG.unreleased.md @@ -31,6 +31,7 @@ > > In case of conflict, the highest (lowest in previous list) `$version` wins. +- @xen-orchestra/log minor - xo-server-auth-ldap patch - xo-server patch - xo-web minor