{"_id":"@doddle/koa-winston","_rev":"3-ad09282f29d9da73a8236b87d4edf1f7","name":"@doddle/koa-winston","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.0":{"name":"@doddle/koa-winston","version":"1.0.0","description":"koa2 version winston logger like express-winston","main":"index.js","engines":{"node":">=8"},"scripts":{"doc":"documentation readme index.js --section=JSDoc","lint":"eslint ./test/*.js ./index.js --fix","release":"standard-version","bench":"node bench/simple.js | grep 'ops'","nyc":"nyc ava && nyc report","test":"nyc ava"},"ava":{"files":["test/**/*"]},"repository":{"type":"git","url":"git+https://github.com/closertb/koa2-winston.git"},"keywords":["koa","koa2","winston","logger","nodejs"],"author":{"name":"closertb"},"license":"MIT","bugs":{"url":"https://github.com/closertb/koa2-winston/issues"},"homepage":"https://github.com/closertb/koa2-winston#readme","dependencies":{"fast-json-stringify":"^1.15.3","lodash.clonedeep":"^4.5.0","lodash.get":"^4.4.2","lodash.mapvalues":"^4.6.0","lodash.set":"^4.3.2","on-finished":"^2.3.0","winston":"^3.2.1"},"devDependencies":{"@types/node":"^12.6.8","ava":"^2.2.0","benchmark":"^2.1.4","documentation":"^12.0.2","eslint":"^6.1.0","eslint-config-airbnb-base":"^13.2.0","eslint-plugin-import":"^2.18.2","koa":"^2.7.0","koa-bodyparser":"^4.2.1","lodash":"^4.17.15","lodash.assign":"^4.2.0","nyc":"^14.1.1","supertest":"^4.0.2","triple-beam":"^1.3.0","winston-transport":"^4.3.0"},"gitHead":"c98fc991472882403a917b553abb1a35c5ac60da","_id":"@doddle/koa-winston@1.0.0","_nodeVersion":"10.21.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-Ro+cTf+YLA/k+jpuf93BOk6I+lqdHWhIVNYcZkX8vvIpSRle69mMYZ92gxcIvyT2juRBSBRQP4Yi7SRz7viK1A==","shasum":"36a447d8580046ceffc2e7763bb1e7fb31b6a05a","tarball":"https://registry.npmjs.org/@doddle/koa-winston/-/koa-winston-1.0.0.tgz","fileCount":10,"unpackedSize":52576,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfM6rQCRA9TVsSAnZWagAAV6gQAJgiKsgtiaQwtWmZmYJF\nBqgAb0dBr52AdcV3s4Eb6hH/8We3n6fwQJPkCiPYpkLKdP9VLEUd98w43eRN\nwf3b0cbfEEqzEucHYaLRkpo7sA8r5ggMzqytzTlxGcOkwFFyD/G0ZkA1/2H7\ng+934oCUewYqvhAkMO1QfanCbP2nlyfjgcWMQtz1rrvIa7xZu0/iG+6Vv4WK\nunOlbAOARJ5EpH4Xh1BWUKJAvJxgfuoTcPcrcdgNqC5vj8qrty7bsjf69zvf\n7f+mmK+A+VQ20CLoLp2KSnVTPo/+g9n8PXzzabDb3Xt0n5dS8wsjNZe5sWwa\nkq6hjWsidibl6b9FHB/fWN5iVZs5lMOLy0NSivsiKG8djXrRBBSWrkyT+kYn\nC9wASGu/FW2lsPwzwtXXUXaPVEDt6Qm4/3YJIbxOnFJZHEVEkL2F+tU3NuWZ\n0jbijGhKcJn4CT4WYa9kVUnvVkg4B8Og9ev4hV7gfoKpDvrjqcFaBzN4edWK\nUl+pp4ekdwObhd7SRBSaa2fKsWNntiAb299tsTxHTjREUbLiTW2WislNi9o2\n5+RyoqGMhDLUNYinlQRX9xPlTGE1MNJ/W/zflVR/G5HNJ8lkZsVr1o3lWPA9\n8byCAZ7EvXmt7kwHbZBwiVdASNGpvEx4hgJrqyINKMSlINGMR8dCktI12PGA\nQQU/\r\n=c863\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDaL2LkkrklHAjjvBckM7wSxnTOG0k3EiV298H7dUp6EwIgXHmgUfQhX6HE+4dB5R63qtFwpZY7l+MQDj0lsrb/WOI="}]},"maintainers":[{"name":"denzelt","email":"closertb@163.com"},{"name":"doddletang","email":"closertb@sina.com"}],"_npmUser":{"name":"denzelt","email":"closertb@163.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/koa-winston_1.0.0_1597221583548_0.8977860468234999"},"_hasShrinkwrap":false},"1.0.1":{"name":"@doddle/koa-winston","version":"1.0.1","description":"koa2 version winston logger like express-winston","main":"index.js","engines":{"node":">=8"},"scripts":{"doc":"documentation readme index.js --section=JSDoc","lint":"eslint ./test/*.js ./index.js --fix","release":"standard-version","bench":"node bench/simple.js | grep 'ops'","nyc":"nyc ava && nyc report","test":"nyc ava"},"ava":{"files":["test/**/*"]},"repository":{"type":"git","url":"git+https://github.com/closertb/koa2-winston.git"},"keywords":["koa","koa2","winston","logger","nodejs"],"author":{"name":"closertb"},"license":"MIT","bugs":{"url":"https://github.com/closertb/koa2-winston/issues"},"homepage":"https://github.com/closertb/koa2-winston#readme","dependencies":{"dayjs":"^1.8.33","fast-json-stringify":"^1.15.3","lodash.clonedeep":"^4.5.0","lodash.get":"^4.4.2","lodash.mapvalues":"^4.6.0","lodash.set":"^4.3.2","on-finished":"^2.3.0","winston":"^3.2.1"},"devDependencies":{"@types/node":"^12.6.8","ava":"^2.2.0","benchmark":"^2.1.4","documentation":"^12.0.2","eslint":"^6.1.0","eslint-config-airbnb-base":"^13.2.0","eslint-plugin-import":"^2.18.2","koa":"^2.7.0","koa-bodyparser":"^4.2.1","lodash":"^4.17.15","lodash.assign":"^4.2.0","nyc":"^14.1.1","supertest":"^4.0.2","triple-beam":"^1.3.0","winston-transport":"^4.3.0"},"gitHead":"44f8ac3b008adb26c0487fb09505a9da57e11894","_id":"@doddle/koa-winston@1.0.1","_nodeVersion":"10.21.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-+464EeIzgBqJtW8iELetaOSSMgsNXYKkC5WDeH37AswfFvH8HL+4ne9xsExR1Yit9nI+UcgCTI0gOfp0+HsF9w==","shasum":"de3225a2d7d3b46947d2c39b7df84d31e17332bd","tarball":"https://registry.npmjs.org/@doddle/koa-winston/-/koa-winston-1.0.1.tgz","fileCount":10,"unpackedSize":54592,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfM8WYCRA9TVsSAnZWagAA2EMP/juEC1WhoXHte6NU0jR5\nfYD5jVxuhI8CFubIIuafEbV9tMrawa0XoCX9ZwOGjjvhsQK+JXRpUheVYWb2\nuDm3XJmSksgOZcQUZF8auJO4UUN0uBluFAAIWmhfUWqP8ZvAvBJdA/mbb/4q\nSJ5e8dMVw13oJKcHT1JDpRuo8O16zhcSJfJKWut2cZvVs6Ya4YGMLjfIJkwj\nan3A+4qcxcBkG8Yjkm4YYEZyow4+UPReuhIW6NjvTJE/vTZGfUOX71PnKRnD\nnxmaFhjFnaa1wumxI7ehNXsOlVkdQJBfUdcB7ggzNgyj3lJC0PveV1MGN6ZN\nkAts2I/Eabcna4yeUX4XDmGjry9ZCiIab3xI99bpAnezkjp0oGXsEi+OUn+G\nHpUlLAxtC+0afmOOY9+1hO0oChKYXuDeQex7kC5QduquLsH5yuf7MMza/RvY\njhDV7y+wgQvZbdFTQDgnymNt6NrwJ5Rm3SE6PvhzCd9xra57YhNB4XVyECuB\n+BHa6ve6QDBCNk72ooX8Otp0GD6QJsr7d/ogImLzuOZgILrWYBF2XvuVX19P\nu7NyyoYoJeH9KKYbwEdrIq90AqS5UzMpJ1MWoohrPOEQXQuxi7LK1aEt5xaW\nHaEujCtlHd7aWmzd0lU3Mnk89VWeLd2iLzEnGod/y3pU4XYBFrMyDDs3iQ/o\nEKVz\r\n=0p+b\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFvlxi4DWV+7Eoj0dZFcVPO8L3dxrAjXNknyf0/az2jIAiB1ZNo9LDM79HaZaD8g7qLE7TpUMjPGY2KAvG6wE0Yt1g=="}]},"maintainers":[{"name":"denzelt","email":"closertb@163.com"},{"name":"doddletang","email":"closertb@sina.com"}],"_npmUser":{"name":"denzelt","email":"closertb@163.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/koa-winston_1.0.1_1597228439920_0.31515254640223245"},"_hasShrinkwrap":false},"1.0.2":{"name":"@doddle/koa-winston","version":"1.0.2","description":"koa2 version winston logger like express-winston","main":"index.js","engines":{"node":">=8"},"scripts":{"doc":"documentation readme index.js --section=JSDoc","lint":"eslint ./test/*.js ./index.js --fix","release":"standard-version","bench":"node bench/simple.js | grep 'ops'","nyc":"nyc ava && nyc report","test":"nyc ava"},"ava":{"files":["test/**/*"]},"repository":{"type":"git","url":"git+https://github.com/closertb/koa2-winston.git"},"keywords":["koa","koa2","winston","logger","nodejs"],"author":{"name":"closertb"},"license":"MIT","bugs":{"url":"https://github.com/closertb/koa2-winston/issues"},"homepage":"https://github.com/closertb/koa2-winston#readme","dependencies":{"dayjs":"^1.8.33","fast-json-stringify":"^1.15.3","lodash.clonedeep":"^4.5.0","lodash.get":"^4.4.2","lodash.mapvalues":"^4.6.0","lodash.set":"^4.3.2","on-finished":"^2.3.0","winston":"^3.2.1"},"devDependencies":{"@types/node":"^12.6.8","ava":"^2.2.0","benchmark":"^2.1.4","documentation":"^12.0.2","eslint":"^6.1.0","eslint-config-airbnb-base":"^13.2.0","eslint-plugin-import":"^2.18.2","koa":"^2.7.0","koa-bodyparser":"^4.2.1","lodash":"^4.17.15","lodash.assign":"^4.2.0","nyc":"^14.1.1","supertest":"^4.0.2","triple-beam":"^1.3.0","winston-transport":"^4.3.0"},"gitHead":"314c09a6ea842836b5c9482b6867ee1018c3e6f3","_id":"@doddle/koa-winston@1.0.2","_nodeVersion":"10.21.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-crDZqfhClAig05efz7swoHelHUM8W3pL9DA6G7J8dLCteG7uUMDIqtvA7TkpxKdbDKHwjgWa3Z9+xTH3U6OUYg==","shasum":"ec214f953de0a1caad74c21b3de2a5f6f5efce53","tarball":"https://registry.npmjs.org/@doddle/koa-winston/-/koa-winston-1.0.2.tgz","fileCount":10,"unpackedSize":54605,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfM8jhCRA9TVsSAnZWagAA3OsP+wZW16E2XZ2Ab2YjQ77u\nRJfePMJYrel3r6bxUJTwncj2O88SFzMxEWyXNxW52Ba70C03lD16UHPoLvkb\nHy0uirLF5ZSgSsSeVfIeUtXlzFueoiOwqu2EAfx0IGIMPGiHFMmtGvdS6pLu\njrBxS8pL+6twAcL6W8ks3xsnERY0Af2uw37S1ITIXZbNmGzlIdJ9DvSFZjtW\nvvRSbMBLPA+CfXlbIQF19INaz6uJ2eloA7SxPuzFeHPHbiTVV0UDno2YXwCm\n3LuTvBj6EYHRJafsAPzVXAjz9q9zqPbGTLtCa1Y9PQkc0OYrejem5eLfZrb7\nOrvnNtPB32DnL+4rXR50tlb91Bl/IqRhpphklLD/3yXCXpowmgENcv8lSfrR\neCBikwjRuHlIHXoX6CepGleB5PPrrCKLVFfRa4xK1yV0gAQ7rImKRpoFo5wf\nT3sDfodQnvggSuzsjaAc7p6726TuhP3R9MwQKLAhTgBdPt2MDnHfA7XsfUE6\nNaPb654S0Xkd9Bi0ks6ZZ3LH1z845/I6yG7L/tNMjzygUJwhqNxV+4+NmyWv\n9FBGp8TYqMu3KNvZTvyLfHoduhj4es008oqWYFeClGOxCgMeWGfcaiEDdB4m\nIRk04ISX1s422amSq6Vp6GAvdGN25V9BliUH12mwHx0WZGrnk0nrOlaDOOLB\n0qZL\r\n=APCZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDwSbcXeQkuDYo5N0qemUMsHFFW5ealHyhvsy2xpB11egIgd4LiqsxQyrZbgovJBOGnR/w7WD7W2dk5kFg5K14q6uI="}]},"maintainers":[{"name":"denzelt","email":"closertb@163.com"},{"name":"doddletang","email":"closertb@sina.com"}],"_npmUser":{"name":"denzelt","email":"closertb@163.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/koa-winston_1.0.2_1597229280794_0.07070111560621051"},"_hasShrinkwrap":false}},"time":{"created":"2020-08-12T08:39:43.345Z","1.0.0":"2020-08-12T08:39:43.712Z","modified":"2022-04-05T05:05:48.519Z","1.0.1":"2020-08-12T10:34:00.147Z","1.0.2":"2020-08-12T10:48:00.917Z"},"maintainers":[{"name":"denzelt","email":"closertb@163.com"},{"name":"doddletang","email":"closertb@sina.com"}],"description":"koa2 version winston logger like express-winston","homepage":"https://github.com/closertb/koa2-winston#readme","keywords":["koa","koa2","winston","logger","nodejs"],"repository":{"type":"git","url":"git+https://github.com/closertb/koa2-winston.git"},"author":{"name":"closertb"},"bugs":{"url":"https://github.com/closertb/koa2-winston/issues"},"license":"MIT","readme":"# @doddle/koa-winston\n\n<font color=\"red\" size=\"5\"></font>\n\n<font color=\"red\" size=\"5\">两个改动点</font>\n\n - 在koa2-winston 基础上，新增了自定义日志信息的功能， [see here](#新增例子)；\n - 将日志日期输出属性`start_at` 打印格式从时间戳换成了 format `YYYY-MM-DD HH:mm:ss`\n\n[![Travis](https://img.shields.io/travis/yidinghan/koa2-winston.svg?style=flat-square)](https://www.npmjs.com/package/@doddle/koa-winston)\n[![npm](https://img.shields.io/npm/l/koa2-winston.svg?style=flat-square)](https://www.npmjs.com/package/@doddle/koa-winston)\n[![npm](https://img.shields.io/npm/v/koa2-winston.svg?style=flat-square)](https://www.npmjs.com/package/@doddle/koa-winston)\n[![npm](https://img.shields.io/npm/dm/koa2-winston.svg?style=flat-square)](https://www.npmjs.com/package/@doddle/koa-winston)\n[![David](https://img.shields.io/david/yidinghan/koa2-winston.svg?style=flat-square)](https://www.npmjs.com/package/@doddle/koa-winston)\n[![David](https://img.shields.io/david/dev/yidinghan/koa2-winston.svg?style=flat-square)](https://www.npmjs.com/package/@doddle/koa-winston)\n[![node](https://img.shields.io/node/v/koa2-winston.svg?style=flat-square)](https://www.npmjs.com/package/@doddle/koa-winston)\n\nkoa2 版本的 winston logger, 和 [express-winston](https://github.com/bithavoc/express-winston) 类似\n\n在3行内将logger添加到koa2服务器\n\n<!-- TOC -->\n\n- [@doddle/koa-winston](#@doddle/koa-winston)\n- [用法](#用法)\n  - [安装](#安装)\n  - [快速开始](#快速开始)\n  - [配置](#配置)\n  - [例子](#例子)\n    - [不记录任何请求内容](#不记录任何请求内容)\n    - [不记录任何响应内容](#不记录任何响应内容)\n    - [不记录 UA](#不记录-ua)\n    - [额外记录一个响应的字段](#额外记录一个响应的字段)\n- [JSDoc](#jsdoc)\n  - [keysRecorder](#keysrecorder)\n  - [logger](#logger)\n\n<!-- /TOC -->\n\n# 用法\n\n## 安装\n\n```shell\nnpm i --save @doddle/koa-winston\n```\n\n## 快速开始\n\n```js\nconst { logger } = require('@doddle/koa-winston');\napp.use(logger());\n```\n\n访问的日志将会如下出现\n```json\n{\n  \"req\": {\n    \"headers\": {\n      \"host\": \"localhost:3000\",\n      \"connection\": \"keep-alive\",\n      \"upgrade-insecure-requests\": \"1\",\n      \"user-agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36\",\n      \"accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\",\n      \"dnt\": \"1\",\n      \"accept-encoding\": \"gzip, deflate, sdch, br\",\n      \"accept-language\": \"zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4,de;q=0.2,ja;q=0.2,it;q=0.2\"\n    },\n    \"url\": \"/hello\",\n    \"method\": \"GET\",\n    \"href\": \"http://localhost:3000/hello\",\n    \"query\": {}\n  },\n  \"started_at\": 1494554053492,\n  \"res\": {\n    \"headers\": {\n      \"content-type\": \"application/json; charset=utf-8\",\n      \"content-length\": \"16\"\n    },\n    \"status\": 200\n  },\n  \"duration\": 8,\n  \"level\": \"info\",\n  \"message\": \"HTTP GET /hello\"\n}\n```\n\n## 配置\n\n每一个变量都有一个默认值，你可以通过配置不同的变量自定义你的日志记录器\n\n```js\napp.use(logger({\n  transports: new winston.transports.Console({ json: true, stringify: true }),\n  level: 'info',\n  reqKeys: ['headers','url','method', 'httpVersion','href','query','length'],\n  reqSelect: [],\n  reqUnselect: ['headers.cookie'],\n  resKeys: ['headers','status'],\n  resSelect: [],\n  resUnselect: [],\n}));\n```\n\n更多配置解析，可以在[logger](#logger)中查看\n\n## 例子\n\n### 不记录任何请求内容\n\n```js\napp.use(logger({\n  reqKeys: []\n}));\n```\n\n`req` 对象将会为空\n\n```json\n{\n  \"req\": {\n  },\n  \"started_at\": 1494486039864,\n  \"res\": {\n    \"headers\": {\n      \"content-type\": \"text/plain; charset=utf-8\",\n      \"content-length\": \"8\"\n    },\n    \"status\": 200\n  },\n  \"duration\": 26,\n  \"level\": \"info\",\n  \"message\": \"HTTP GET /\"\n}\n```\n\n### 不记录任何响应内容\n```js\napp.use(logger({\n  resKeys: []\n}));\n```\n\n`res` 对象将会为空\n\n```json\n{\n  \"req\": {\n    \"headers\": {\n      \"host\": \"127.0.0.1:59534\",\n      \"accept-encoding\": \"gzip, deflate\",\n      \"user-agent\": \"node-superagent/3.5.2\",\n      \"connection\": \"close\"\n    },\n    \"url\": \"/\",\n    \"method\": \"GET\",\n    \"href\": \"http://127.0.0.1:59534/\",\n    \"query\": {}\n  },\n  \"started_at\": 1494486039864,\n  \"res\": {\n  },\n  \"duration\": 26,\n  \"level\": \"info\",\n  \"message\": \"HTTP GET /\"\n}\n```\n\n### 不记录 UA\n\n```js\napp.use(logger({\n  reqUnselect: ['headers.cookies', 'headers.user-agent']\n}));\n```\n\n请求的 UA 将会被忽略\n\n```json\n{\n  \"req\": {\n    \"headers\": {\n      \"host\": \"127.0.0.1:59534\",\n      \"accept-encoding\": \"gzip, deflate\",\n      \"connection\": \"close\"\n    },\n    \"url\": \"/\",\n    \"method\": \"GET\",\n    \"href\": \"http://127.0.0.1:59534/\",\n    \"query\": {}\n  },\n  \"started_at\": 1494486039864,\n  \"res\": {\n    \"headers\": {\n      \"content-type\": \"text/plain; charset=utf-8\",\n      \"content-length\": \"8\"\n    },\n    \"status\": 200\n  },\n  \"duration\": 26,\n  \"level\": \"info\",\n  \"message\": \"HTTP GET /\"\n}\n```\n\n### 额外记录一个响应的字段\n\n```js\napp.use(logger({\n  resSelect: ['body.success']\n}));\n```\n\n`body` 里面的 `success` 字段将会被记录\n\n```json\n{\n  \"req\": {\n    \"headers\": {\n      \"host\": \"127.0.0.1:59534\",\n      \"accept-encoding\": \"gzip, deflate\",\n      \"connection\": \"close\"\n    },\n    \"url\": \"/\",\n    \"method\": \"GET\",\n    \"href\": \"http://127.0.0.1:59534/\",\n    \"query\": {}\n  },\n  \"started_at\": 1494486039864,\n  \"res\": {\n    \"headers\": {\n      \"content-type\": \"text/plain; charset=utf-8\",\n      \"content-length\": \"8\"\n    },\n    \"status\": 200,\n    \"body\": {\n      // 会记录下任何服务器响应的值\n      \"success\": false\n    }\n  },\n  \"duration\": 26,\n  \"level\": \"info\",\n  \"message\": \"HTTP GET /\"\n}\n```\n\n## 新增例子\n### 添加自定义的日志信息\n\n```js\nconst { logger, addExtendProperty } = require('');\n\naddExtendProperty({\n  author_name: { type: 'string' }\n})\n\napp.use(\n  logger({\n    addExtendInfo: (ctx) => ({\n      author_name: ctx.user && ctx.user.name,\n  }),\n  })\n);\n```\n\nThe req object will be empty\n\n```json\n{\n  \"req\": {},\n  \"started_at\": \"YYYY-MM-DD HH:mm:ss\",\n  \"author_name\": \"doddle\",\n  \"res\": {\n    \"header\": {\n      \"content-type\": \"text/plain; charset=utf-8\",\n      \"content-length\": \"8\"\n    },\n    \"status\": 200\n  },\n  \"duration\": 26,\n  \"level\": \"info\",\n  \"message\": \"HTTP GET /\"\n}\n```\n\n# JSDoc\n\n<!-- Generated by documentation.js. Update this documentation by updating the source code. -->\n\n## keysRecorder\n\nkeysRecorder\nuse ldoash pick, get and set to collect data from given target object\n\n**Parameters**\n\n-   `payload` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** input arguments (optional, default `{}`)\n    -   `payload.defaults` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)>?** default keys will be collected\n    -   `payload.selects` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)>?** keys will be collected as\n        additional part\n    -   `payload.unselects` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)>?** keys that will be ignored at last\n\n**Examples**\n\n```javascript\n// without payload\nconst recorder = keysRecorder();\nrecorder() // {}\nrecorder({ foo: 1, bar: 2, foobar: { a: 3, b: 4 } }) // {}\n\n// with defaults\nconst recorder = keysRecorder({ defaults: ['foo'] });\nrecorder() // {}\nrecorder({ foo: 1, bar: 2, foobar: { a: 3, b: 4 } }) // { foo: 1 }\n\n// with defaults and selects\nconst recorder = keysRecorder({ defaults: ['foo'], selects: ['foobar'] });\nrecorder() // {}\nrecorder({\n  foo: 1,\n  bar: 2,\n  foobar: { a: 3, b: 4 }\n}) // { foo: 1, foobar: { a: 3, b: 4 } }\n\n// with defaults and unselects\nconst recorder = keysRecorder({ defaults: ['foobar'], unselects: ['foobar.a'] });\nrecorder() // {}\nrecorder({\n  foo: 1,\n  bar: 2,\n  foobar: { a: 3, b: 4 }\n}) // { foobar: { a: 3 } }\n\n// with defaults and selects and unselects\nconst recorder = keysRecorder({\n  defaults: ['foo'],\n  selects: ['foobar'],\n  unselects: ['foobar.b'],\n});\nrecorder() // {}\nrecorder({\n  foo: 1,\n  bar: 2,\n  foobar: { a: 3, b: 4 }\n}) // { foo: 1, foobar: { a: 3 } }\n```\n\nReturns **[function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function)** closure function, setting by given payload\n\n## logger\n\nlogger middleware for koa2 use winston\n\n**Parameters**\n\n-   `payload` **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** input arguments (optional, default `{}`)\n    -   `payload.transports` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)>** winston transports instance (optional, default `winston.transports.Console`)\n    -   `payload.level` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** default log level of logger (optional, default `'info'`)\n    -   `payload.reqKeys` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** default request fields to be logged (optional, default `['headers','url','method',\n        'httpVersion','href','query','length']`)\n    -   `payload.reqSelect` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** additional request fields to be logged (optional, default `[]`)\n    -   `payload.reqUnselect` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** request field\n                         will be removed from the log (optional, default `['headers.cookie']`)\n    -   `payload.resKeys` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** default response fields to be logged (optional, default `['headers','status']`)\n    -   `payload.resSelect` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** additional response fields to be logged (optional, default `[]`)\n    -   `payload.resUnselect` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** response field will be removed from the log (optional, default `[]`)\n\n**Examples**\n\n```javascript\nconst { logger } = require('@doddle/koa-winston');\napp.use(logger());\n// trrific logger look like down here\n// {\n//   \"req\": {\n//     \"headers\": {\n//       \"host\": \"127.0.0.1:59534\",\n//       \"accept-encoding\": \"gzip, deflate\",\n//       \"user-agent\": \"node-superagent/3.5.2\",\n//       \"connection\": \"close\"\n//     },\n//     \"url\": \"/\",\n//     \"method\": \"GET\",\n//     \"href\": \"http://127.0.0.1:59534/\",\n//     \"query\": {}\n//   },\n//   \"started_at\": 1494486039864,\n//   \"res\": {\n//     \"headers\": {\n//       \"content-type\": \"text/plain; charset=utf-8\",\n//       \"content-length\": \"8\"\n//     },\n//     \"status\": 200\n//   },\n//   \"duration\": 26,\n//   \"level\": \"info\",\n//   \"message\": \"HTTP GET /\"\n// }\n```\n\nReturns **[function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function)** logger middleware\n","readmeFilename":"README.CN.md"}