diff --git a/README.md b/README.md index 09af1cf8..31e5d9c4 100644 --- a/README.md +++ b/README.md @@ -454,6 +454,19 @@ log.overrideNetworkField("msg", null); ``` If you use this override feature in conjunction with a log parser, make sure you will not violate any parsing rules. +## Tracing +### SAP_passport +example: +``` +2a54482a0300e60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a54482a +``` + +SAP Passport is an end to end tracing technology used in many SAP products. +It is a binary format encoded in hex notation. +Applications can add the whole SAP Passport in this field or give its constituents in the respective fields. + +to read up on the possible fields, please look at [fields](https://github.com/SAP/cf-java-logging-support/blob/master/cf-java-logging-support-core/beats/app-logs/docs/fields.asciidoc). + ### Custom sink function Per default the library writes output messages to `stdout`. For debugging purposes it can be useful to redirect the output of the library to another sink (e.g. `console.log()`). You can set a custom sink method as follows: ```js diff --git a/cf-nodejs-logging-support-core/log-core.js b/core/log-core.js similarity index 98% rename from cf-nodejs-logging-support-core/log-core.js rename to core/log-core.js index 9ebd89c9..321bafdf 100644 --- a/cf-nodejs-logging-support-core/log-core.js +++ b/core/log-core.js @@ -38,6 +38,7 @@ var uuidCheck = /[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[0-9a-f]{4}-[0-9a-f]{12}/; var preLogConfig = []; var postLogConfig = []; +var settableConfig = []; var dynLogLevelHeader; var dynLogLevelKey; @@ -119,6 +120,8 @@ var precompileConfig = function (config) { var coreConfig = []; preLogConfig = []; postLogConfig = []; + settableConfig = []; + for (var i = 0; i < config.length; i++) { var obj = config[i]; @@ -134,6 +137,8 @@ var precompileConfig = function (config) { if (obj.core) { coreConfig.push(obj); + } else if (obj.type != null && obj.type == "settable") { + settableConfig.push(obj.name); } else if (obj.source.type == "time") { if (obj.source.pre) preLogConfig.push(obj); @@ -609,7 +614,7 @@ var writeCustomFields = function (logObject, logger, additionalFields) { value = stringifySafe(value); } - if(defaultCustomEnabled || logObject[key] != null) + if(defaultCustomEnabled || logObject[key] != null || isSettable(key)) logObject[key] = value; if (cfCustomEnabled) @@ -637,6 +642,14 @@ var writeCustomFields = function (logObject, logger, additionalFields) { } } +var isSettable = function(key) { + if (settableConfig.length == 0) return false; + for(var i = 0; i < settableConfig.length; i++) { + if(settableConfig[i] == key) return true; + } + return false; +} + // Checks wether the given level passes the logging level threshold extracted from the given logger or its // ancestors. var checkLoggingLevel = function (level, logger) { diff --git a/index.js b/index.js index 1e758a11..2e5010b1 100644 --- a/index.js +++ b/index.js @@ -1,11 +1,11 @@ //loading core logger functionality -var coreLogger = require("./cf-nodejs-logging-support-core/log-core"); +var coreLogger = require("./core/log-core"); var effectiveLogger = null; coreLogger.init(); -effectiveLogger = require("./cf-nodejs-logging-support-express/log-express"); -defaultConfig = require("./config.js"); +effectiveLogger = require("./logger/log-express"); +defaultConfig = require("./config"); effectiveLogger.setCoreLogger(coreLogger); coreLogger.setConfig(defaultConfig.config); @@ -32,17 +32,36 @@ exports.forceLogger = function (name) { switch (name) { //insert your custom framework logger here case "restify": - effectiveLogger = require("./cf-nodejs-logging-support-restify/log-restify"); + effectiveLogger = require("./logger/log-restify"); break; case "plainhttp": - effectiveLogger = require("./cf-nodejs-logging-support-plainhttp/log-plainhttp"); + effectiveLogger = require("./logger/log-plainhttp"); break; default: - effectiveLogger = require("./cf-nodejs-logging-support-express/log-express"); + effectiveLogger = require("./logger/log-express"); } effectiveLogger.setCoreLogger(coreLogger); }; +exports.enableTracing = function (input) { + names = []; + if (typeof input == "string") + names.push(input); + else + names = input; + var config = defaultConfig.config; + for(var i in names) { + switch (names[i].toLowerCase()) { + case "sap_passport": + config.push(...require("./trace/sap_passport").config); + break; + default: + } + } + coreLogger.setConfig(config); + return config; +} + exports.logNetwork = function (req, res, next) { effectiveLogger.logNetwork(req, res, next); @@ -66,7 +85,7 @@ exports.createWinstonTransport = function (options) { }; } options.logMessage = coreLogger.logMessage; - return require("./cf-nodejs-logging-support-winston/winston-transport").createTransport(options); + return require("./winston/winston-transport").createTransport(options); }; exports.createLogger = function (customFields) { diff --git a/cf-nodejs-logging-support-express/log-express.js b/logger/log-express.js similarity index 100% rename from cf-nodejs-logging-support-express/log-express.js rename to logger/log-express.js diff --git a/cf-nodejs-logging-support-plainhttp/log-plainhttp.js b/logger/log-plainhttp.js similarity index 100% rename from cf-nodejs-logging-support-plainhttp/log-plainhttp.js rename to logger/log-plainhttp.js diff --git a/cf-nodejs-logging-support-restify/log-restify.js b/logger/log-restify.js similarity index 100% rename from cf-nodejs-logging-support-restify/log-restify.js rename to logger/log-restify.js diff --git a/package.json b/package.json index 2dcb23fa..369831cc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cf-nodejs-logging-support", - "version": "6.5.4", + "version": "6.6.0", "description": "Logging tool for Cloud Foundry", "keywords": [ "logging", diff --git a/test/test-config.js b/test/test-config.js index efaf70f1..6ae0c346 100644 --- a/test/test-config.js +++ b/test/test-config.js @@ -8,6 +8,7 @@ chai.should(); describe('Test config', function () { var core = null; + var index = null; var httpLogger; beforeEach(function () { // Set env vars to enable logging of sensitive data @@ -15,8 +16,9 @@ describe('Test config', function () { process.env.LOG_REMOTE_USER = true; process.env.LOG_REFERER = true; - core = importFresh("../cf-nodejs-logging-support-core/log-core.js"); - httpLogger = importFresh("../cf-nodejs-logging-support-plainhttp/log-plainhttp.js"); + core = importFresh("../core/log-core.js"); + httpLogger = importFresh("../logger/log-plainhttp.js"); + index = importFresh("../index.js"); httpLogger.setCoreLogger(core); core.setConfig(importFresh("../config.js").config); }); @@ -76,6 +78,28 @@ describe('Test config', function () { logObject.x_forwarded_for.should.equal("testingHeader"); }); + it('Test sap_passport', function () { + var config = index.enableTracing("sap_passport") + core.setConfig(config); + req.headers = {}; + req.headers['sap-passport'] = "testingHeader"; + httpLogger.logNetwork(req, res, next); + fireLog(); + + logObject.sap_passport.should.equal("testingHeader"); + }); + + it('Test sap_passport with array', function () { + var config = index.enableTracing(["SAP_passport"]); + core.setConfig(config); + req.headers = {}; + req.headers['sap-passport'] = "testingHeader"; + httpLogger.logNetwork(req, res, next); + fireLog(); + + logObject.sap_passport.should.equal("testingHeader"); + }); + it('Test remote_user', function () { req.headers = {}; req.headers['remote-user'] = "testingName"; diff --git a/test/test-core.js b/test/test-core.js index 7f1dea77..e4058f4d 100644 --- a/test/test-core.js +++ b/test/test-core.js @@ -12,7 +12,7 @@ var fs = require('fs'); describe('Test log-core', function () { describe('Test init function', function () { var defHeader, envAdress; - var core = rewire("../cf-nodejs-logging-support-core/log-core.js"); + var core = rewire("../core/log-core.js"); before(function () { defHeader = core.__get__("DEFAULT_DYN_LOG_LEVEL_HEADER"); envAdress = core.__get__("ENV_DYN_LOG_HEADER"); @@ -28,7 +28,7 @@ describe('Test log-core', function () { }); describe('Test reduceFields', function () { - var core = rewire("../cf-nodejs-logging-support-core/log-core.js"); + var core = rewire("../core/log-core.js"); var testConfig = [ { name: "test-field-a", @@ -80,7 +80,7 @@ describe('Test log-core', function () { }); describe('Test prepareInitDummy', function () { - var core = rewire("../cf-nodejs-logging-support-core/log-core.js"); + var core = rewire("../core/log-core.js"); var logObj; var prepareDummy; before(function () { @@ -160,6 +160,57 @@ describe('Test log-core', function () { }); }); + describe('Test setConfig assignments', function () { + var core = rewire("../core/log-core.js"); + var logObject = null; + var log = null; + var testConfig = [ + { + name: "test-field-a", + core: true, + source: { + type: "static", + value: "42" + } + },{ + name: "settable_field", + type: "settable" + } + ] + + before(function () { + core.__set__({ + "sendLog": function (logObj) { + logObject = logObj; + } + }); + core.setConfig(testConfig); + core.overrideCustomFieldFormat("application-logging"); + log = core.logMessage; + }); + + it('Test config assignment (settable): ', function () { + log("info","test", {"settable_field":"settable","non_settable":"test"}) + + logObject.settable_field.should.equal("settable"); + assert.equal(logObject.non_settable, null); + + }); + + it('Test settable propagation: ', function () { + + core.__set__({ + "prepareInitDummy": function (config) { + config.length.should.equal(1); + config[0].should.equal(testConfig[0]); + } + }) + + core.__get__("settableConfig").should.deep.equal(["settable_field"]); + + }); + }); + describe('Test setConfig assignments', function () { var core = null; var testConfig = [ @@ -195,7 +246,7 @@ describe('Test log-core', function () { ] beforeEach(function () { - core = rewire("../cf-nodejs-logging-support-core/log-core.js"); + core = rewire("../core/log-core.js"); }); it('Test config assignment (core): ', function () { @@ -251,7 +302,7 @@ describe('Test log-core', function () { ] beforeEach(function () { - core = rewire("../cf-nodejs-logging-support-core/log-core.js"); + core = rewire("../core/log-core.js"); }); it('Test config assignment (core): ', function () { @@ -268,7 +319,7 @@ describe('Test log-core', function () { }); describe('Test setConfig environment var switches', function () { - var core = rewire("../cf-nodejs-logging-support-core/log-core.js"); + var core = rewire("../core/log-core.js"); var coreConfig = null; var testConfig; @@ -358,7 +409,7 @@ describe('Test log-core', function () { describe('Test validateObject', function () { - var core = rewire("../cf-nodejs-logging-support-core/log-core.js"); + var core = rewire("../core/log-core.js"); before(function () { core.setConfig(importFresh("../config.js").config); @@ -389,7 +440,7 @@ describe('Test log-core', function () { }); describe('Test setLoggingLevel', function () { - var core = rewire("../cf-nodejs-logging-support-core/log-core.js"); + var core = rewire("../core/log-core.js"); before(function () { core.setConfig(importFresh("../config.js").config); @@ -440,7 +491,7 @@ describe('Test log-core', function () { var output; before(function () { - core = rewire("../cf-nodejs-logging-support-core/log-core.js"); + core = rewire("../core/log-core.js"); write = core.__get__("writeLogToConsole"); core.setConfig(importFresh("../config.js").config); @@ -529,7 +580,7 @@ describe('Test log-core', function () { var level; before(function () { - core = rewire("../cf-nodejs-logging-support-core/log-core.js"); + core = rewire("../core/log-core.js"); write = core.__get__("writeLogToConsole"); core.setConfig(importFresh("../config.js").config); clock = sinon.useFakeTimers(); @@ -580,7 +631,7 @@ describe('Test log-core', function () { }); describe('Test sendLog', function () { - var core = rewire("../cf-nodejs-logging-support-core/log-core.js"); + var core = rewire("../core/log-core.js"); var logMeta; var sendLog; @@ -625,7 +676,7 @@ describe('Test log-core', function () { }); describe('Test getCorrelationId', function () { - var core = rewire("../cf-nodejs-logging-support-core/log-core.js"); + var core = rewire("../core/log-core.js"); var logObject = null; var getCorrelationId = null; @@ -665,7 +716,7 @@ describe('Test log-core', function () { describe('Test setCorrelationId', function () { - var core = rewire("../cf-nodejs-logging-support-core/log-core.js"); + var core = rewire("../core/log-core.js"); var logObject = null; var setCorrelationId = null; var testRequest; @@ -713,7 +764,7 @@ describe('Test log-core', function () { }); describe('Test getTenantId', function () { - var core = rewire("../cf-nodejs-logging-support-core/log-core.js"); + var core = rewire("../core/log-core.js"); var logObject = null; var getTenantId = null; @@ -752,7 +803,7 @@ describe('Test log-core', function () { }); describe('Test getTenantSubdomain', function () { - var core = rewire("../cf-nodejs-logging-support-core/log-core.js"); + var core = rewire("../core/log-core.js"); var logObject = null; var getTenantSubdomain = null; @@ -791,7 +842,7 @@ describe('Test log-core', function () { }); describe('Test setTenantId', function () { - var core = rewire("../cf-nodejs-logging-support-core/log-core.js"); + var core = rewire("../core/log-core.js"); var setTenantId = null; var testRequest; var testId; @@ -826,7 +877,7 @@ describe('Test log-core', function () { }); describe('Test setTenantSubdomain', function () { - var core = rewire("../cf-nodejs-logging-support-core/log-core.js"); + var core = rewire("../core/log-core.js"); var setTenantSubdomain = null; var testRequest; var testSubdomain; @@ -861,7 +912,7 @@ describe('Test log-core', function () { }); describe('Test createLogger/getLogger', function () { - var core = rewire("../cf-nodejs-logging-support-core/log-core.js"); + var core = rewire("../core/log-core.js"); var createLogger; var uuid; var oldLogMessage; @@ -963,7 +1014,7 @@ describe('Test log-core', function () { }); describe('Test custom fields registration and setter', function () { - var core = rewire("../cf-nodejs-logging-support-core/log-core.js"); + var core = rewire("../core/log-core.js"); before(function () { @@ -1041,7 +1092,7 @@ describe('Test log-core', function () { }); describe('Test timings', function () { - var core = rewire("../cf-nodejs-logging-support-core/log-core.js"); + var core = rewire("../core/log-core.js"); var logObject = null; var log = null; @@ -1115,7 +1166,7 @@ describe('Test log-core', function () { }) describe('Test logMessage', function () { - var core = rewire("../cf-nodejs-logging-support-core/log-core.js"); + var core = rewire("../core/log-core.js"); var logObject = null; var log = null; @@ -1190,7 +1241,7 @@ describe('Test log-core', function () { }); describe("Test custom field logic", function() { - var core = rewire("../cf-nodejs-logging-support-core/log-core.js"); + var core = rewire("../core/log-core.js"); var logObject = null; var log = null; @@ -1632,7 +1683,7 @@ describe('Test log-core', function () { }); describe('Test init', function () { - var core = rewire("../cf-nodejs-logging-support-core/log-core.js"); + var core = rewire("../core/log-core.js"); var header; var defaultHeader; @@ -1679,7 +1730,7 @@ describe('Test log-core', function () { }); describe('Test initLog', function () { - var core = rewire("../cf-nodejs-logging-support-core/log-core.js"); + var core = rewire("../core/log-core.js"); var logObject; var clock; @@ -1773,7 +1824,7 @@ describe('Test log-core', function () { delete process.env.VCAP_APPLICATION; delete process.env.CF_INSTANCE_IP; //resetting inherit memory for fast init - var core2 = rewire("../cf-nodejs-logging-support-core/log-core.js"); + var core2 = rewire("../core/log-core.js"); core2.__set__("initDummy", null); core2.setConfig(importFresh("../config.js").config); //rewrite process to old values @@ -1800,7 +1851,7 @@ describe('Test log-core', function () { }); describe('Test overrideField', function () { - var core = rewire("../cf-nodejs-logging-support-core/log-core.js"); + var core = rewire("../core/log-core.js"); var values = {}; var overrideField = null; @@ -1838,7 +1889,7 @@ describe('Test log-core', function () { }); describe('test DynamicLogLevel', function () { - var core = rewire("../cf-nodejs-logging-support-core/log-core.js"); + var core = rewire("../core/log-core.js"); var req; var levels; @@ -1869,7 +1920,7 @@ describe('Test log-core', function () { }); describe('Test DynlogLevel', function () { - var core = rewire("../cf-nodejs-logging-support-core/log-core.js"); + var core = rewire("../core/log-core.js"); var header; var defaultHeader; diff --git a/test/test-index.js b/test/test-index.js index 35acddf3..412b1cd4 100644 --- a/test/test-index.js +++ b/test/test-index.js @@ -25,7 +25,7 @@ describe('Test index.js', function () { before(function () { Module.prototype.require = function () { var args = Array.prototype.slice.call(arguments); - if (args[0] === "./cf-nodejs-logging-support-express/log-express") { + if (args[0] === "./logger/log-express") { linking = "express"; return { "setCoreLogger": function () {}, @@ -36,7 +36,7 @@ describe('Test index.js', function () { } }; } - else if (args[0] === "./cf-nodejs-logging-support-restify/log-restify") { + else if (args[0] === "./logger/log-restify") { linking = "restify"; return { "setCoreLogger": function () {}, @@ -47,7 +47,7 @@ describe('Test index.js', function () { } }; } - else if (args[0] === "./cf-nodejs-logging-support-plainhttp/log-plainhttp") { + else if (args[0] === "./logger/log-plainhttp") { linking = "plainhttp"; return { "setCoreLogger": function () {}, @@ -57,7 +57,7 @@ describe('Test index.js', function () { } }; } - else if (args[0] === "./cf-nodejs-logging-support-core/log-core") { + else if (args[0] === "./core/log-core") { return { "init": function() {}, "bindConvenienceMethods": function() {}, diff --git a/test/test-log-express.js b/test/test-log-express.js index 5669125c..1d5187e0 100644 --- a/test/test-log-express.js +++ b/test/test-log-express.js @@ -15,8 +15,8 @@ describe('Test log-express', function () { process.env.LOG_REMOTE_USER = true; process.env.LOG_REFERER = true; - core = importFresh("../cf-nodejs-logging-support-core/log-core.js"); - expressLogger = importFresh("../cf-nodejs-logging-support-express/log-express.js"); + core = importFresh("../core/log-core.js"); + expressLogger = importFresh("../logger/log-express.js"); expressLogger.setCoreLogger(core); core.setConfig(importFresh("./allbranchconfig.js").config); }); diff --git a/test/test-log-plainhttp.js b/test/test-log-plainhttp.js index 214ae300..622a3180 100644 --- a/test/test-log-plainhttp.js +++ b/test/test-log-plainhttp.js @@ -15,8 +15,8 @@ describe('Test log-plainhttp', function () { process.env.LOG_REMOTE_USER = true; process.env.LOG_REFERER = true; - core = importFresh("../cf-nodejs-logging-support-core/log-core.js"); - httpLogger = importFresh("../cf-nodejs-logging-support-plainhttp/log-plainhttp"); + core = importFresh("../core/log-core.js"); + httpLogger = importFresh("../logger/log-plainhttp"); httpLogger.setCoreLogger(core); core.setConfig(importFresh("./allbranchconfig.js").config); }); diff --git a/test/test-log-restify.js b/test/test-log-restify.js index 717b91d6..e7156ea6 100644 --- a/test/test-log-restify.js +++ b/test/test-log-restify.js @@ -15,8 +15,8 @@ describe('Test log-restify', function () { process.env.LOG_REMOTE_USER = true; process.env.LOG_REFERER = true; - core = importFresh("../cf-nodejs-logging-support-core/log-core.js"); - restifyLogger = importFresh("../cf-nodejs-logging-support-restify/log-restify.js"); + core = importFresh("../core/log-core.js"); + restifyLogger = importFresh("../logger/log-restify.js"); restifyLogger.setCoreLogger(core); core.setConfig(importFresh("./allbranchconfig.js").config); }); diff --git a/trace/sap_passport.js b/trace/sap_passport.js new file mode 100644 index 00000000..08e4390a --- /dev/null +++ b/trace/sap_passport.js @@ -0,0 +1,50 @@ +var config = [ + { + name: "sap_passport", + mandatory: false, + source: { + type: "header", + name: "sap-passport" + } + }, { + name: "sap_passport_Action", + type: "settable" + }, { + name: "sap_passport_ActionType", + type: "settable" + }, { + name: "sap_passport_ClientNumber", + type: "settable" + }, { + name: "sap_passport_ConnectionCounter", + type: "settable" + }, { + name: "sap_passport_ConnectionId", + type: "settable" + }, { + name: "sap_passport_ComponentName", + type: "settable" + }, { + name: "sap_passport_ComponentType", + type: "settable" + }, { + name: "sap_passport_PreviousComponentName", + type: "settable" + }, { + name: "sap_passport_TraceFlags", + type: "settable" + }, { + name: "sap_passport_TransactionId", + type: "settable" + }, { + name: "sap_passport_RootContextId", + type: "settable" + }, { + name: "sap_passport_UserId", + type: "settable" + } +]; + + +exports.config = config; + diff --git a/cf-nodejs-logging-support-winston/winston-transport.js b/winston/winston-transport.js similarity index 100% rename from cf-nodejs-logging-support-winston/winston-transport.js rename to winston/winston-transport.js