{"_id":"@financial-times/n-event-logger","_rev":"36-69951540dd5e54097cc1aa34b2c16d03","name":"@financial-times/n-event-logger","dist-tags":{"latest":"0.0.7"},"versions":{"0.0.2":{"name":"@financial-times/n-event-logger","version":"0.0.2","license":"MIT","_id":"@financial-times/n-event-logger@0.0.2","maintainers":[{"name":"the-ft","email":"strategic.products@ft.com"}],"homepage":"https://github.com/Financial-Times/n-event-logger#readme","bugs":{"url":"https://github.com/Financial-Times/n-event-logger/issues"},"dist":{"shasum":"82185b621d967dd695cdf979d3ca9ac7921ba37f","tarball":"https://registry.npmjs.org/@financial-times/n-event-logger/-/n-event-logger-0.0.2.tgz","integrity":"sha512-JxUvbkFnr0PdNAiWuK3jLnVfV00rpJeEw9OpEqBux0/QCETrDSG3N3I7H4ecCcsmRD8gkMqpk/HJ3q+bNo+u/A==","signatures":[{"sig":"MEUCIQCPKt1V/mk7hex7o+itxhwTFKkCEMACWT7yAXbk3JtktwIgRkGPuk45Y4eP5W33c4TFTciYkR3DzgQBtkNn7fiWIjk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"dist/index.js","_from":".","_shasum":"82185b621d967dd695cdf979d3ca9ac7921ba37f","engines":{"node":">=6.1.0"},"gitHead":"a2bb9c776969ea113d97f37a86674211dd1ee22b","scripts":{"lint":"eslint src","test":"jest","cover":"jest --coverage","watch":"nodemon --watch src -q --exec 'eslint src --fix'","prepush":"make verify -j3","commitmsg":"secret-squirrel-commitmsg","precommit":"secret-squirrel","prepublish":"make build"},"_npmUser":{"name":"the-ft","email":"strategic.products@ft.com"},"deprecated":"This package is no longer supported","repository":{"url":"git+https://github.com/Financial-Times/n-event-logger.git","type":"git"},"_npmVersion":"3.10.10","description":"log all your API service calls and function calls with a single line of code","directories":{},"_nodeVersion":"6.12.3","dependencies":{"@financial-times/n-logger":"^5.5.11"},"devDependencies":{"jest":"^22.1.4","eslint":"^4.16.0","nodemon":"^1.14.11","prettier":"^1.10.2","babel-cli":"^6.26.0","babel-eslint":"^8.2.1","babel-preset-env":"^1.6.1","eslint-plugin-jest":"^21.7.0","eslint-plugin-import":"^2.8.0","eslint-config-prettier":"^2.9.0","eslint-plugin-prettier":"^2.5.0","@financial-times/n-gage":"^1.19.3","eslint-config-airbnb-base":"^12.1.0","babel-plugin-transform-object-rest-spread":"^6.26.0"},"_npmOperationalInternal":{"tmp":"tmp/n-event-logger-0.0.2.tgz_1517310091894_0.6351815923117101","host":"s3://npm-registry-packages"}},"0.0.3":{"name":"@financial-times/n-event-logger","version":"0.0.3","license":"MIT","_id":"@financial-times/n-event-logger@0.0.3","maintainers":[{"name":"ft-internal-products","email":"ip.engineering@ft.com"},{"name":"robinmarr-ft","email":"robin.marr@ft.com"},{"name":"joannaskao","email":"joannaskao@gmail.com"},{"name":"callumlocke","email":"callum.locke@gmail.com"},{"name":"bobhaslett","email":"bob.haslett@ft.com"},{"name":"sdbernard","email":"steve.bernard@ft.com"},{"name":"aendrew","email":"aendrew@aendrew.com"},{"name":"i-like-robots","email":"matt+npm@maketea.co.uk"},{"name":"jakedchampion","email":"me@jakechampion.name"},{"name":"mattandrews","email":"matt@mattandre.ws"},{"name":"rowanmanning","email":"accounts@rowanmanning.co.uk"},{"name":"quarterto","email":"mwr.brennan@gmail.com"},{"name":"the-ft","email":"strategic.products@ft.com"}],"homepage":"https://github.com/Financial-Times/n-event-logger#readme","bugs":{"url":"https://github.com/Financial-Times/n-event-logger/issues"},"dist":{"shasum":"7d053092a5151618f9f1511ae3e6427c34e23c12","tarball":"https://registry.npmjs.org/@financial-times/n-event-logger/-/n-event-logger-0.0.3.tgz","integrity":"sha512-PZzCTmm/o8UbjSG5NkO6l2iobEDRxHlYflZn1CpcV8om7P/gznNVvudVTVSIVrvEXL6uXPgv09A/4GuEOHrttA==","signatures":[{"sig":"MEQCICGiQlhkYSeoHLe8bKcOjCo5EKy3SAt3vUy+a2CSqk8cAiBd/kuCnFhCtGV31ZhBgyjWtKim7cT7EjhOhfbRoViVJg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"dist/index.js","_from":".","_shasum":"7d053092a5151618f9f1511ae3e6427c34e23c12","engines":{"node":">=6.1.0"},"gitHead":"c989c00d64cacce6b713d6397a250fdfb0fcd3d4","scripts":{"lint":"eslint src","test":"jest","cover":"jest --coverage","watch":"nodemon --watch src -q --exec 'eslint src --fix'","prepush":"make verify -j3","commitmsg":"secret-squirrel-commitmsg","precommit":"secret-squirrel","prepublish":"make build"},"_npmUser":{"name":"the-ft","email":"strategic.products@ft.com"},"deprecated":"This package is no longer supported","repository":{"url":"git+https://github.com/Financial-Times/n-event-logger.git","type":"git"},"_npmVersion":"3.10.10","description":"log all your API service calls and function calls with a single line of code","directories":{},"_nodeVersion":"6.12.3","dependencies":{"@financial-times/n-logger":"^5.5.11"},"devDependencies":{"jest":"^22.1.4","eslint":"^4.16.0","nodemon":"^1.14.11","prettier":"^1.10.2","babel-cli":"^6.26.0","babel-eslint":"^8.2.1","babel-preset-env":"^1.6.1","eslint-plugin-jest":"^21.7.0","eslint-plugin-import":"^2.8.0","eslint-config-prettier":"^2.9.0","eslint-plugin-prettier":"^2.5.0","@financial-times/n-gage":"^1.19.3","eslint-config-airbnb-base":"^12.1.0","babel-plugin-transform-object-rest-spread":"^6.26.0"},"_npmOperationalInternal":{"tmp":"tmp/n-event-logger-0.0.3.tgz_1517315841240_0.48610069951973855","host":"s3://npm-registry-packages"}},"0.0.4":{"name":"@financial-times/n-event-logger","version":"0.0.4","license":"MIT","_id":"@financial-times/n-event-logger@0.0.4","maintainers":[{"name":"ft-internal-products","email":"ip.engineering@ft.com"},{"name":"robinmarr-ft","email":"robin.marr@ft.com"},{"name":"joannaskao","email":"joannaskao@gmail.com"},{"name":"callumlocke","email":"callum.locke@gmail.com"},{"name":"bobhaslett","email":"bob.haslett@ft.com"},{"name":"sdbernard","email":"steve.bernard@ft.com"},{"name":"aendrew","email":"aendrew@aendrew.com"},{"name":"i-like-robots","email":"matt+npm@maketea.co.uk"},{"name":"jakedchampion","email":"me@jakechampion.name"},{"name":"mattandrews","email":"matt@mattandre.ws"},{"name":"rowanmanning","email":"accounts@rowanmanning.co.uk"},{"name":"quarterto","email":"mwr.brennan@gmail.com"},{"name":"the-ft","email":"strategic.products@ft.com"}],"homepage":"https://github.com/Financial-Times/n-event-logger#readme","bugs":{"url":"https://github.com/Financial-Times/n-event-logger/issues"},"dist":{"shasum":"b449b0e7f96710ea207cd1f1a2f2fabb1c82666e","tarball":"https://registry.npmjs.org/@financial-times/n-event-logger/-/n-event-logger-0.0.4.tgz","integrity":"sha512-omsg+pYr3rBHWXv45aIOle1wU9mhoM02uwrjrkTaxoULFymZloHJQsw+VGwfHaPIuxsnFgnX+Yc6HvU6LNNIkg==","signatures":[{"sig":"MEUCIGNvM2DI+jIiOCIUL8VQ9fsxtKqZDomHUzP0lcpVKJEFAiEAqoFpJs1cxGja1o6jwuMxojYBJiuPXJsXJlKa93J8yec=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"dist/index.js","_from":".","_shasum":"b449b0e7f96710ea207cd1f1a2f2fabb1c82666e","engines":{"node":">=6.1.0"},"gitHead":"b297f9fcd5b0b16b25547506efac1eb4c64d03f6","scripts":{"lint":"eslint src","test":"jest","cover":"jest --coverage","watch":"nodemon --watch src -q --exec 'eslint src --fix'","prepush":"make verify -j3","commitmsg":"secret-squirrel-commitmsg","precommit":"secret-squirrel","prepublish":"make build"},"_npmUser":{"name":"the-ft","email":"strategic.products@ft.com"},"deprecated":"This package is no longer supported","repository":{"url":"git+https://github.com/Financial-Times/n-event-logger.git","type":"git"},"_npmVersion":"3.10.10","description":"log all your API service calls and function calls with a single line of code","directories":{},"_nodeVersion":"6.12.3","dependencies":{"@financial-times/n-logger":"^5.5.11"},"devDependencies":{"jest":"^22.1.4","eslint":"^4.16.0","nodemon":"^1.14.11","prettier":"^1.10.2","babel-cli":"^6.26.0","node-fetch":"^1.7.3","babel-eslint":"^8.2.1","babel-preset-env":"^1.6.1","eslint-plugin-jest":"^21.7.0","eslint-plugin-json":"^1.2.0","eslint-plugin-import":"^2.8.0","eslint-config-prettier":"^2.9.0","eslint-plugin-prettier":"^2.5.0","@financial-times/n-gage":"^1.19.3","eslint-config-airbnb-base":"^12.1.0","babel-plugin-transform-object-rest-spread":"^6.26.0"},"_npmOperationalInternal":{"tmp":"tmp/n-event-logger-0.0.4.tgz_1517402292447_0.762000797316432","host":"s3://npm-registry-packages"}},"0.0.5":{"name":"@financial-times/n-event-logger","version":"0.0.5","license":"MIT","_id":"@financial-times/n-event-logger@0.0.5","maintainers":[{"name":"ft-internal-products","email":"ip.engineering@ft.com"},{"name":"robinmarr-ft","email":"robin.marr@ft.com"},{"name":"joannaskao","email":"joannaskao@gmail.com"},{"name":"callumlocke","email":"callum.locke@gmail.com"},{"name":"bobhaslett","email":"bob.haslett@ft.com"},{"name":"sdbernard","email":"steve.bernard@ft.com"},{"name":"aendrew","email":"aendrew@aendrew.com"},{"name":"i-like-robots","email":"matt+npm@maketea.co.uk"},{"name":"jakedchampion","email":"me@jakechampion.name"},{"name":"mattandrews","email":"matt@mattandre.ws"},{"name":"rowanmanning","email":"accounts@rowanmanning.co.uk"},{"name":"quarterto","email":"mwr.brennan@gmail.com"},{"name":"the-ft","email":"strategic.products@ft.com"}],"homepage":"https://github.com/Financial-Times/n-event-logger#readme","bugs":{"url":"https://github.com/Financial-Times/n-event-logger/issues"},"dist":{"shasum":"7ee1053e6b43fb585abd810fd05147790be4e091","tarball":"https://registry.npmjs.org/@financial-times/n-event-logger/-/n-event-logger-0.0.5.tgz","integrity":"sha512-DbQbgRThndsl1Xq+WiLLQ5+H3pwW0n/GVl20W5cnvbTY7zE0dCiYU1lusWrlyIa6g6f6LnFQecwys9CcfsJ1hA==","signatures":[{"sig":"MEUCID1S6fHhY4Xh3xZUYRRc6EL+uBCK8pfgfoSOi/ydodhnAiEAi51ULrbocHEnRvtYfe+jVW3UnBBXufHHaIraM90ZIHo=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"dist/index.js","_from":".","_shasum":"7ee1053e6b43fb585abd810fd05147790be4e091","engines":{"node":">=6.1.0"},"gitHead":"a619ddfa9046d3e02df0efd55e903c1d95cb66a5","scripts":{"lint":"eslint src","test":"jest","cover":"jest --coverage","watch":"nodemon --watch src -q --exec 'eslint src --fix'","prepush":"make verify -j3","commitmsg":"secret-squirrel-commitmsg","precommit":"secret-squirrel","prepublish":"make build"},"_npmUser":{"name":"the-ft","email":"strategic.products@ft.com"},"deprecated":"This package is no longer supported","repository":{"url":"git+https://github.com/Financial-Times/n-event-logger.git","type":"git"},"_npmVersion":"3.10.10","description":"log all your API service calls and function calls with a single line of code","directories":{},"_nodeVersion":"6.12.3","dependencies":{"node-fetch":"^2.0.0-alpha.9","@financial-times/n-logger":"^5.5.11"},"devDependencies":{"jest":"^22.1.4","nock":"^9.1.6","eslint":"^4.16.0","nodemon":"^1.14.11","prettier":"^1.10.2","babel-cli":"^6.26.0","coveralls":"^3.0.0","babel-eslint":"^8.2.1","babel-preset-env":"^1.6.1","eslint-plugin-jest":"^21.7.0","eslint-plugin-json":"^1.2.0","eslint-plugin-import":"^2.8.0","eslint-config-prettier":"^2.9.0","eslint-plugin-prettier":"^2.5.0","@financial-times/n-gage":"^1.19.3","eslint-config-airbnb-base":"^12.1.0","babel-plugin-transform-object-rest-spread":"^6.26.0"},"_npmOperationalInternal":{"tmp":"tmp/n-event-logger-0.0.5.tgz_1517507803139_0.027536760084331036","host":"s3://npm-registry-packages"}},"0.0.6":{"name":"@financial-times/n-event-logger","version":"0.0.6","license":"MIT","_id":"@financial-times/n-event-logger@0.0.6","maintainers":[{"name":"ft-internal-products","email":"ip.engineering@ft.com"},{"name":"robinmarr-ft","email":"robin.marr@ft.com"},{"name":"joannaskao","email":"joannaskao@gmail.com"},{"name":"callumlocke","email":"callum.locke@gmail.com"},{"name":"bobhaslett","email":"bob.haslett@ft.com"},{"name":"sdbernard","email":"steve.bernard@ft.com"},{"name":"aendrew","email":"aendrew@aendrew.com"},{"name":"i-like-robots","email":"matt+npm@maketea.co.uk"},{"name":"jakedchampion","email":"me@jakechampion.name"},{"name":"mattandrews","email":"matt@mattandre.ws"},{"name":"rowanmanning","email":"accounts@rowanmanning.co.uk"},{"name":"quarterto","email":"mwr.brennan@gmail.com"},{"name":"the-ft","email":"strategic.products@ft.com"}],"homepage":"https://github.com/Financial-Times/n-event-logger#readme","bugs":{"url":"https://github.com/Financial-Times/n-event-logger/issues"},"dist":{"shasum":"e6fc46d1ce4c08616ed0af20cc45554a98cb8b6c","tarball":"https://registry.npmjs.org/@financial-times/n-event-logger/-/n-event-logger-0.0.6.tgz","integrity":"sha512-7D6rjZwTuaEYN11AeK8ShYnMis1hyAqI8gGe/lEnf+ahPoLqCp7ZVrYJ6xjg1iNqtT7zFNWGAJkHmE0Ilk86MQ==","signatures":[{"sig":"MEQCIHKFIgBzQGqYAnumTFFPAqaVeKFP4/kpv88M/KKO47rwAiA/6hOoS2lkpG4K0kiypCDXpV4gIgpyvi13R81hig/L2A==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"dist/index.js","_from":".","_shasum":"e6fc46d1ce4c08616ed0af20cc45554a98cb8b6c","engines":{"node":">=6.1.0"},"gitHead":"d1664d1fa422f932ec2061a24c6b9bbea8a444ab","scripts":{"lint":"eslint src","test":"jest","cover":"jest --coverage","watch":"nodemon --watch src -q --exec 'eslint src --fix'","prepush":"make verify -j3","commitmsg":"secret-squirrel-commitmsg","precommit":"secret-squirrel","prepublish":"make build"},"_npmUser":{"name":"the-ft","email":"strategic.products@ft.com"},"deprecated":"This package is no longer supported","repository":{"url":"git+https://github.com/Financial-Times/n-event-logger.git","type":"git"},"_npmVersion":"3.10.10","description":"log all your API service calls and function calls with a single line of code","directories":{},"_nodeVersion":"6.12.3","dependencies":{"node-fetch":"^2.0.0-alpha.9","@financial-times/n-logger":"^5.5.11"},"devDependencies":{"jest":"^22.1.4","nock":"^9.1.6","eslint":"^4.16.0","nodemon":"^1.14.11","prettier":"^1.10.2","babel-cli":"^6.26.0","coveralls":"^3.0.0","babel-eslint":"^8.2.1","babel-preset-env":"^1.6.1","eslint-plugin-jest":"^21.7.0","eslint-plugin-json":"^1.2.0","eslint-plugin-import":"^2.8.0","eslint-config-prettier":"^2.9.0","eslint-plugin-prettier":"^2.5.0","@financial-times/n-gage":"^1.19.3","eslint-config-airbnb-base":"^12.1.0","babel-plugin-transform-object-rest-spread":"^6.26.0"},"_npmOperationalInternal":{"tmp":"tmp/n-event-logger-0.0.6.tgz_1517853958329_0.9659919277764857","host":"s3://npm-registry-packages"}},"0.0.7":{"name":"@financial-times/n-event-logger","version":"0.0.7","license":"MIT","_id":"@financial-times/n-event-logger@0.0.7","maintainers":[{"name":"ft-internal-products","email":"ip.engineering@ft.com"},{"name":"robinmarr-ft","email":"robin.marr@ft.com"},{"name":"joannaskao","email":"joannaskao@gmail.com"},{"name":"callumlocke","email":"callum.locke@gmail.com"},{"name":"bobhaslett","email":"bob.haslett@ft.com"},{"name":"sdbernard","email":"steve.bernard@ft.com"},{"name":"aendrew","email":"aendrew@aendrew.com"},{"name":"i-like-robots","email":"matt+npm@maketea.co.uk"},{"name":"jakedchampion","email":"me@jakechampion.name"},{"name":"mattandrews","email":"matt@mattandre.ws"},{"name":"rowanmanning","email":"accounts@rowanmanning.co.uk"},{"name":"quarterto","email":"mwr.brennan@gmail.com"},{"name":"the-ft","email":"strategic.products@ft.com"}],"homepage":"https://github.com/Financial-Times/n-event-logger#readme","bugs":{"url":"https://github.com/Financial-Times/n-event-logger/issues"},"dist":{"shasum":"4d29bfc6c8dd3b3ba89132c6271e4bbe061a670a","tarball":"https://registry.npmjs.org/@financial-times/n-event-logger/-/n-event-logger-0.0.7.tgz","integrity":"sha512-dvPZ05WJXmTSV3jIegEAEM9u97zktgQMTJBi5v5e4AJXqWwLfPC3iPFs6NyvfAMUVFWf15EI2RxpZQFwmgBZbw==","signatures":[{"sig":"MEQCIDCp5oClRA38aCWVzxaR0GihRlU2ScmUsA2FDPIQsHRRAiAfkQbTy5+yn75Ebhq+yuQjVFu/ZxdQZNaB+pSRoiBwPA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"dist/index.js","_from":".","_shasum":"4d29bfc6c8dd3b3ba89132c6271e4bbe061a670a","engines":{"node":">=6.1.0"},"gitHead":"d1664d1fa422f932ec2061a24c6b9bbea8a444ab","scripts":{"lint":"eslint src","test":"jest","cover":"jest --coverage","watch":"nodemon --watch src -q --exec 'eslint src --fix'","prepush":"make verify -j3","commitmsg":"secret-squirrel-commitmsg","precommit":"secret-squirrel","prepublish":"make build"},"_npmUser":{"name":"the-ft","email":"strategic.products@ft.com"},"deprecated":"This package is no longer supported","repository":{"url":"git+https://github.com/Financial-Times/n-event-logger.git","type":"git"},"_npmVersion":"3.10.10","description":"log all your API service calls and function calls with a single line of code","directories":{},"_nodeVersion":"6.12.3","dependencies":{"node-fetch":"^2.0.0-alpha.9","@financial-times/n-logger":"^5.5.11"},"devDependencies":{"jest":"^22.1.4","nock":"^9.1.6","eslint":"^4.16.0","nodemon":"^1.14.11","prettier":"^1.10.2","babel-cli":"^6.26.0","coveralls":"^3.0.0","babel-eslint":"^8.2.1","babel-preset-env":"^1.6.1","eslint-plugin-jest":"^21.7.0","eslint-plugin-json":"^1.2.0","eslint-plugin-import":"^2.8.0","eslint-config-prettier":"^2.9.0","eslint-plugin-prettier":"^2.5.0","@financial-times/n-gage":"^1.19.3","eslint-config-airbnb-base":"^12.1.0","babel-plugin-transform-object-rest-spread":"^6.26.0"},"_npmOperationalInternal":{"tmp":"tmp/n-event-logger-0.0.7.tgz_1517856640135_0.2842980111017823","host":"s3://npm-registry-packages"}}},"time":{"created":"2018-01-30T11:01:33.046Z","modified":"2026-06-23T15:53:08.537Z","0.0.2":"2018-01-30T11:01:33.046Z","0.0.3":"2018-01-30T12:37:22.272Z","0.0.4":"2018-01-31T12:38:12.507Z","0.0.5":"2018-02-01T17:56:50.497Z","0.0.6":"2018-02-05T18:05:59.350Z","0.0.7":"2018-02-05T18:50:41.077Z"},"bugs":{"url":"https://github.com/Financial-Times/n-event-logger/issues"},"license":"MIT","homepage":"https://github.com/Financial-Times/n-event-logger#readme","repository":{"url":"git+https://github.com/Financial-Times/n-event-logger.git","type":"git"},"description":"log all your API service calls and function calls with a single line of code","maintainers":[{"email":"code.management@ft.com","name":"the-ft"},{"email":"info+npm@rowanmanning.com","name":"rowanmanning"},{"email":"yay@chee.party","name":"chee"},{"email":"a@ax.gy","name":"alexwilson"},{"email":"howdy@aendra.com","name":"aendra"},{"email":"emma.lewis@ft.com","name":"emmalewis"},{"email":"lee@leemoody.co.uk","name":"notlee"},{"email":"hamza.samih@ft.com","name":"hamza.samih"},{"email":"robert.boulton@ft.com","name":"robertboulton"},{"email":"leila.micollier@ft.com","name":"leila.micollier"},{"email":"rob.godfrey@ft.com","name":"robgodfrey"}],"readme":"# n-event-logger [![CircleCI](https://circleci.com/gh/Financial-Times/n-event-logger.svg?style=svg)](https://circleci.com/gh/Financial-Times/n-event-logger) [![Coverage Status](https://coveralls.io/repos/github/Financial-Times/n-event-logger/badge.svg?branch=master)](https://coveralls.io/github/Financial-Times/n-event-logger?branch=master)\nlog all your API service calls and function calls with a single line of code\n\n- [quickstart](#quickstart)\n- [before/after](#before/after)\n- [install](#install)\n- [gotcha](#gotcha)\n    * [function args format standard](#function-args-format-standard)\n    * [exception/error format standard](#exception/error-format-standard)\n- [usage](#usage)\n    * [enhance a single API service call](#enhance-a-single-api-service-call)\n    * [enhance a whole series of API service call](#enhance-a-whole-series-of-api-service-call)\n    * [log your operation in structure with loggerEvent](#log-your-operation-in-structure-with-loggerevent)\n    * [auto log non-api-service function with withLogger enhancer](#auto-log-non-api-service-function-with-withlogger-enhancer)\n    * [track some non-api-service function on the fly](#track-some-non-api-service-function-on-the-fly)\n    * [test stub](#test-stub)\n- [development](#development)\n- [todos](#todos)\n\n\n## quickstart\n```javascript\nimport { withLogger, withServiceLogger, eventLogger } from '@financial-times/n-event-logger';\n// enhancer function names might be changed to the following after alpha\nimport { autoLog, autoLogAll, eventLogger } from '@financial-times/n-event-logger';\n```\nauto log different status of a function call (commonly an action under an operation)\n```javascript\nconst data = await withLogger(yourCallFunction)(params, meta);\nconst result = withLogger(someOtherFunction)(params, meta);\n```\nenhance all methods in api service module ensure that it would be logged wherever used\n```javascript\n/*-- some-api-service --*/\nexport default withServiceLogger{ CallA, CallB };\n\n/*-- some-controller-or-middleware --*/\nimport APIService from 'some-api-service';\n\nawait APIService.CallA(params, meta);\nawait APIService.CallB(params, meta);\n```\nmore strcutured operation/action log\n```javascript\nconst meta = { transactionId, userId, operation };\nconst event = eventLogger(meta);\n\ntry {\n    event.action('someAction').success();\n    event.success();\n} catch(e) {\n    event.failure(e);\n}\n\n```\nset key names of fields to be muted in .env to reduce log for development\n```javascript\nLOGGER_MUTE_FIELDS=transactionId, userId\n```\n## before/after\n```javascript\n// before\ntry {\n    logger.info(meta, { action: 'yourCallFunction' }, params);\n    const data = await yourCallFunction(params, metaSubset);\n    logger.info(meta, { action: 'yourCallFunction' }, params, { result: 'success' });\n} catch(e) {\n    // some error handling and parsing...\n    logger.info(meta, { action: 'yourCallFunction' }, params, { result: 'failure' }, parsedError);\n}\n// after: 7+ lines (depends on error parsing) => 1 line\nconst data = await withLogger(yourCallFunction)(params, meta);\n```\n```javascript\nconst meta = { transactionId, userId, operation };\n\n// before\nlogger.info(meta);\ntry {\n    logger.info(meta, { action: 'someAction', result: 'success' });\n    logger.info(meta, { result: 'success' });\n} catch(e) {\n    // some error hanldling and parsing\n    logger.error(meta, { result: 'failure' }, parsedError);\n}\n\n// after: some less key strokes\nconst event = eventLogger(meta);\ntry {\n    event.action('someAction').success();\n    event.success();\n} catch(e) {\n    event.failure(e);\n}\n\n```\n## install\n```shell\nnpm install @financial-times/n-event-logger\n```\n\n## gotcha\n\n### function args format standard\n\nOne opinionated pre-requisite is to have the callFunction input format as (params, meta) so that the callFunction can be invoked correctly with extra meta for logger\n\n### exception/error\n\nout-of-box parse support for the following standard types of errors\n* Fetch Response Error\n* Fetch (Network) Error\n* Node Native Error Objects\n\n> if your custom Error types are extended from native Error class, the logger might not be able to pick up custom information fields well, just use an object not constructed by Error\n\n## usage\n\n### enhance a single API service call\n\n```javascript\n/*-- api-service.js --*/\nimport { withLogger } from '@financial-times/n-event-logger';\n\nexport const callSomeAPIService = (params, meta) => {\n    const options = {\n        headers: {\n            /* some meta data specific headers... */\n        }\n    };\n\n    /* maybe some code before fetch... */\n\n    return fetch(url, options)\n        .then(/* some code for response... */)\n        .catch(/* some error hanlding... */);\n}\n\n// this would record the name of the function 'callSomeAPIService' as action in the logger automatically\nexport const enhancedCallSomeAPIService = (params, meta) => withLogger(callSomeAPIService)(params, meta);\n\n/*\n    currently async/await is needed for the logger to work correctly, update coming soon\n */\n\n/*-- middleware/controller.js --*/\nimport { enhancedCallSomeAPIService } from '../api-service';\n\nconst someOperationFunction = async (req, res, next) => {\n    const meta = {\n        /* some fields for headers */\n        transactionId: req.transactionId,\n        /* extra fields for loggers */\n        operation: 'someOperation',\n        userId: req.userId,\n    };\n\n    try{\n        await enhancedCallSomeAPIService(params, meta);\n    } catch (e) {\n        next(e);\n    }\n}\n```\n---\n\n> info: transactionId: xxxx-xxx, userId: xxxx-xxx, operatoin: someOperation, action: callSomeAPIService\n\n> info: transactionId: xxxx-xxx, userId: xxxx-xxx, operatoin: someOperation, action: callSomeAPIService, status: success\n\n---\n\ndepends on the error status code, it would log as warn for 4XX, and error for 5XX\n\n> warn: transactionId: xxxx-xxx, userId: xxxx-xxx, operatoin: someOperation, action: callSomeAPIService, status: failure, message: some error message\n\n> error: transactionId: xxxx-xxx, userId: xxxx-xxx, operatoin: someOperation, action: callSomeAPIService, status: failure, message: some error message\n\n### enhance a whole series of API service call\n\n```javascript\n/*-- api-service.js --*/\nimport { withServiceLogger } from '@financial-times/n-event-logger';\n\nexport const apiServiceCallA = (params, meta) => {}\nexport const apiServiceCallB = (params, meta) => {}\n\n// helper to enhance all API service call functions as object methods\nexport default withServiceLogger{\n    apiServiceCallA,\n    apiServiceCallB\n};\n\n/*-- middleware/controller.js --*/\nimport SomeAPIService from '../some-api-service';\n\nconst someOperationFunction = async (req, res, next) => {\n    const meta = {\n        transactionId: req.transactionId,\n        userId: req.userId,\n        operation: 'someOperation',\n    };\n\n    try{\n        await someAPIService.apiServiceCallA(params, meta);\n        await someAPIService.apiServiceCallB(params, meta);\n    } catch (e) {\n        next(e);\n    }\n}\n```\n\n### log your operation in structure with loggerEvent\n\n```javascript\n/*-- middleware/controller.js --*/\nimport { loggerEvent } from '@financial-times/n-event-logger';\nimport SomeAPIService from '../some-api-service';\n\nconst someOperationFunction = async (req, res, next) => {\n    const meta = {\n        transactionId: req.transactionId,\n        userId: req.userId,\n        operation: 'someOperation',\n    };\n    const event = loggerEvent(meta);\n\n    try{\n        const a = await someAPIService.apiServiceCallA(params, meta);\n        const b = await someAPIService.apiServiceCallB(params, meta);\n        /* some other code... */\n        const c = someFunction(a, b);\n        event.success({ c });\n        /* some other code... */\n    } catch (e) {\n        event.failure(e);\n        next(e);\n    }\n}\n```\n\n---\n\n> info: transactionId: xxxx-xxx, userId: xxxx-xxx, operatoin: someOperation\n\n> ... some more process info log from various actions\n\n> info: transactionId: xxxx-xxx, userId: xxxx-xxx, operatoin: someOperation, status: success, data: { \"c\": 'values are stringified JSON' }\n\n---\n\n> info: transactionId: xxxx-xxx, userId: xxxx-xxx, operatoin: someOperation\n\n> ... some more process info log from various actions\n\n> error: transactionId: xxxx-xxx, userId: xxxx-xxx, operatoin: someOperation, action: apiServiceCallB, result: failure, message: \"some message\"\n\n> error: transactionId: xxxx-xxx, userId: xxxx-xxx, operatoin: someOperation, status: failure, message: \"error message\"\n\nlogs help you track down exactly which function call leads to the operation failure with what params in call in what context\n\n---\n\n### auto log non-api-service function with withLogger enhancer\n```javascript\nimport { loggerEvent, withLogger } from '@financial-times/n-event-logger';\n\nconst someFunction = (a, b) => {\n    try {\n        /* some code... */\n        return c;\n    } catch(e) {\n        /* some error handling... */\n        // function needs to throw error or return Promise.reject() for failure status to be logged\n        throw e;\n    }\n}\n\nconst someOperationFunction = async (req, res, next) => {\n    const meta = {\n        transactionId: req.transactionId,\n        userId: req.userId,\n        operation: 'someOperation',\n    };\n    const event = loggerEvent(meta);\n\n    try{\n        const a = await someAPIService.apiServiceCallA(params, meta);\n        const b = await someAPIService.apiServiceCallB(params, meta);\n        /* some other code... */\n        // await is needed for the result status logger to work correctly\n        const c = await withLogger(meta)(someFunction)(a, b);\n        event.success({ c });\n        /* some other code... */\n    } catch (e) {\n        event.failure(e);\n        next(e);\n    }\n}\n```\n\n### track some non-api-service function on the fly\n\n```javascript\n/*-- middleware/controller.js --*/\nconst someOperationFunction = async (req, res, next) => {\n    const meta = {\n        transactionId: req.transactionId,\n        userId: req.userId,\n        operation: 'someOperation',\n    };\n    const event = loggerEvent(meta);\n\n    try{\n        const a = await someAPIService.apiServiceCallA(params, meta);\n        const b = await someAPIService.apiServiceCallB(params, meta);\n        /* some other code... */\n        if(someCondition && someCheck){\n            event.action('someAction').success();\n        } else {\n            event.action('someAction').failure();\n            throw ;\n        }\n        /* some other code... */\n        event.success();\n        /* some other code... */\n    } catch (e) {\n        event.failure(e);\n        next(e);\n    }\n}\n```\n\n### test stub\n\n```javascript\nimport * as nEventLogger from '@financial-times/n-event-logger';\n\n//example using sinon sandbox, will look into provide testStub as a module based on sinon/jest\nconst stubLoggerEvent = meta => ({\n    // add more stubs to methods if you want\n    start: () => null,\n    success: () => null,\n    failure: () => null,\n    action: () => stubLoggerEvent(meta)\n});\nsandbox.stub(nEventLogger, 'loggerEvent').callsFake(stubLoggerEvent);\nsandbox.stub(nEventLogger, 'withLogger').callsFake(\n    callFunction => (params, meta) => callFunction(params, meta)\n);\nsandbox.stub(nEventLogger, 'withServiceLogger').callsFake(service => service);\n```\n\n## development\n* `make install`\n* `yarn test --watch` to automatically run test on changing src\n* `yarn watch` to automatically correct code format on saving src\n\n## todos\n* middleware/controller one-line enhancer\n* consider integrating `.addContext()` from `n-logger`\n","readmeFilename":"README.md"}