UNPKG

2.78 kBJavaScriptView Raw
1"use strict";
2
3var ensureArray = require("type/array/ensure")
4 , isValue = require("type/value/is")
5 , ensureString = require("type/string/ensure")
6 , includes = require("es5-ext/array/#/contains")
7 , endsWith = require("es5-ext/string/#/ends-with")
8 , logger = require("./private/logger-prototype")
9 , emitter = require("./emitter")
10 , levels = require("../levels");
11
12var resolveDebugNamespaces = function (debugNamespacesTokens, debugNamespacesSettings) {
13 ensureArray(debugNamespacesTokens).forEach(function (ns) {
14 ns = ensureString(ns).trim();
15 if (!ns) return;
16 var isEnabled = ns[0] !== "-";
17 if (!isEnabled) ns = ns.slice(1);
18 if (endsWith.call(ns, ":*")) ns = ns.slice(0, -2);
19 ns = ns.split(":").filter(Boolean).join(":");
20 debugNamespacesSettings[ns] = isEnabled;
21 });
22};
23
24module.exports = function (thresholdLevelName, debugNamespacesTokens) {
25 // Resolve intended logging level configuration
26 // On this level and above all logs will be exposed
27 if (!thresholdLevelName || !includes.call(levels, thresholdLevelName)) {
28 thresholdLevelName = "notice";
29 }
30 var thresholdLevelIndex = levels.indexOf(thresholdLevelName);
31
32 // Resolve namespace based debug logging configuration
33 // Applies only to logs below level threshold (will expose logs just for chosen namespaces)
34 var debugNamespacesSettings = Object.create(null);
35 resolveDebugNamespaces(debugNamespacesTokens, debugNamespacesSettings);
36 var debugNamespacesList = Object.keys(debugNamespacesSettings);
37
38 // Apply resolved settings on existing loggers
39 levels.forEach(function (levelName, levelIndex) {
40 // If logger for given level not initialized yet, skip
41 if (!logger.isLevelInitialized(levelName)) return;
42 // If logs of given level are meant to be exposed, skip (default is to expose)
43 if (levelIndex <= thresholdLevelIndex) return;
44
45 // Hide logs for given level
46 var levelLogger = logger[levelName];
47 levelLogger.isEnabled = false;
48
49 // Eventually expose logs for some namespaces according to passed configuration
50 debugNamespacesList.forEach(function (ns) {
51 if (ns === "*") {
52 levelLogger.isEnabled = debugNamespacesSettings[ns];
53 } else if (levelLogger.isNamespaceInitialized(ns)) {
54 levelLogger.get(ns).isEnabled = debugNamespacesSettings[ns];
55 }
56 });
57 });
58
59 // Ensure settings are applied on any new logger
60 emitter.on("init", function (event) {
61 var newLogger = event.logger;
62 if (!newLogger.namespace && newLogger.levelIndex > thresholdLevelIndex) {
63 // Root level logger, apply threshold level settings
64 newLogger.isEnabled = false;
65 }
66
67 // Apply eventual debug namespace visibility
68 var isEnabled = debugNamespacesSettings[newLogger.namespace || "*"];
69 if (isValue(isEnabled)) newLogger.isEnabled = isEnabled;
70 });
71};