{"_id":"log4js-cloudwatch-appender","_rev":"6-ff9d9ec65b3cef0f4bc35d8dcef39742","name":"log4js-cloudwatch-appender","description":"log4js aws cloudwatch appender","dist-tags":{"latest":"1.1.0"},"versions":{"1.0.0":{"name":"log4js-cloudwatch-appender","version":"1.0.0","description":"log4js aws cloudwatch appender","main":"lib/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/regevbr/log4js-cloudwatch-appender.git"},"keywords":["aws","cloudwatch","log4js","appender","cloud-watch","cloud","watch","logs","log","cw"],"author":{"name":"regevbr"},"license":"GPL-3.0","bugs":{"url":"https://github.com/regevbr/log4js-cloudwatch-appender/issues"},"homepage":"https://github.com/regevbr/log4js-cloudwatch-appender#readme","dependencies":{"lawgs":"^1.0.4"},"gitHead":"37db1f4f4d6688bb7d87ca03456768c24e69666f","_id":"log4js-cloudwatch-appender@1.0.0","_shasum":"2fc10df0f1342356951ce7e1c5b25cc884a67915","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.1","_npmUser":{"name":"regevbr","email":"regevbr@gmail.com"},"dist":{"shasum":"2fc10df0f1342356951ce7e1c5b25cc884a67915","tarball":"https://registry.npmjs.org/log4js-cloudwatch-appender/-/log4js-cloudwatch-appender-1.0.0.tgz","integrity":"sha512-kfwew9fYHkO3RWXMR2w+qV7aFi7HIC2/ol/eL53oAWAE8u1FopKC9MyuZA1zMblWt3ctVaI8XxIRhrDZu18GOg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDbIajNzn8d/giZVdI9lCAFnEGwrOPr4GcJ5aRM05Ew0gIhAK59S8teVKxy0LFsysGK89n2MR0J1r9SzdtayP+4NQ0z"}]},"maintainers":[{"name":"regevbr","email":"regevbr@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/log4js-cloudwatch-appender-1.0.0.tgz_1510524952108_0.6700202042702585"}},"1.0.1":{"name":"log4js-cloudwatch-appender","version":"1.0.1","description":"log4js aws cloudwatch appender","main":"lib/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/regevbr/log4js-cloudwatch-appender.git"},"keywords":["aws","cloudwatch","log4js","appender","cloud-watch","cloud","watch","logs","log","cw"],"author":{"name":"regevbr"},"license":"GPL-3.0","bugs":{"url":"https://github.com/regevbr/log4js-cloudwatch-appender/issues"},"homepage":"https://github.com/regevbr/log4js-cloudwatch-appender#readme","dependencies":{"lawgs":"^1.0.4"},"gitHead":"90a6587d6c7da7ec0f43a3483bdfefc35c7fb5d8","_id":"log4js-cloudwatch-appender@1.0.1","_shasum":"45fa73814b5978b802861299d15aa42ce513d9d3","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.1","_npmUser":{"name":"regevbr","email":"regevbr@gmail.com"},"dist":{"shasum":"45fa73814b5978b802861299d15aa42ce513d9d3","tarball":"https://registry.npmjs.org/log4js-cloudwatch-appender/-/log4js-cloudwatch-appender-1.0.1.tgz","integrity":"sha512-HFPC949ZE+ZeNETYL6i6vqqIXyjjYx+hPz3X+oMA3cG98WpR/ZLPnQYGNTL0Y3b5XhVX5Hmnjnv6quSAk5BoaA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD7RpXaDM3WQ5/Tudgxx2PPYAt13R7tgqW3OCPAyby7dgIhAOkYrlw9v4rAHBeEfb0xjf5k5xcgvsHjYWJW5G1PUDHt"}]},"maintainers":[{"name":"regevbr","email":"regevbr@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/log4js-cloudwatch-appender-1.0.1.tgz_1510525649017_0.6393126216717064"}},"1.0.2":{"name":"log4js-cloudwatch-appender","version":"1.0.2","description":"log4js aws cloudwatch appender","main":"lib/index.js","scripts":{"test":"make test"},"repository":{"type":"git","url":"git+https://github.com/regevbr/log4js-cloudwatch-appender.git"},"keywords":["aws","cloudwatch","log4js","appender","cloud-watch","cloud","watch","logs","log","cw"],"author":{"name":"Regev Brody","email":"regevbr@gmail.com"},"engines":{"node":">=6.11.3"},"license":"GPL-3.0","bugs":{"url":"https://github.com/regevbr/log4js-cloudwatch-appender/issues"},"homepage":"https://github.com/regevbr/log4js-cloudwatch-appender#readme","dependencies":{"lawgs":"^1.0.4"},"devDependencies":{"coveralls":"^3.0.0","expect.js":"^0.3.1","istanbul":"^0.4.5","jshint":"^2.9.5","mocha":"^4.0.1","mocha-lcov-reporter":"^1.3.0","sandboxed-module":"^2.0.3"},"gitHead":"c41f6677097fd4cd30553fc1416ef376fa44ec47","_id":"log4js-cloudwatch-appender@1.0.2","_shasum":"e341442db10d29715f6c1737b074f6d1a591d287","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.1","_npmUser":{"name":"regevbr","email":"regevbr@gmail.com"},"dist":{"shasum":"e341442db10d29715f6c1737b074f6d1a591d287","tarball":"https://registry.npmjs.org/log4js-cloudwatch-appender/-/log4js-cloudwatch-appender-1.0.2.tgz","integrity":"sha512-FbJsEjSu6EB4JwahoGSiaCT2+FH1Ag9/NHKGePw/mdV10LQVLAaxletLKfIDWVisR0rKQG8Gx6QdWChuYGGJsg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCqCFMohyj9KihoBvuiMcOt7+xSc0z0swRQhHhghMcnnQIgAzJQLXa/qT39zdLJaLD6cW7HN8NfLUv9/i/Dp35Y0fU="}]},"maintainers":[{"name":"regevbr","email":"regevbr@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/log4js-cloudwatch-appender-1.0.2.tgz_1510615311356_0.8661921063903719"}},"1.1.0":{"name":"log4js-cloudwatch-appender","version":"1.1.0","description":"log4js aws cloudwatch appender","main":"lib/index.js","scripts":{"test":"make test"},"repository":{"type":"git","url":"git+https://github.com/regevbr/log4js-cloudwatch-appender.git"},"keywords":["aws","cloudwatch","log4js","appender","cloud-watch","npm","npm-package","npm-module","javascript-library","cloud","watch","logs","log","cw","node","nodejs","javascript"],"author":{"name":"Regev Brody","email":"regevbr@gmail.com"},"engines":{"node":">=6.11.3"},"license":"GPL-3.0","bugs":{"url":"https://github.com/regevbr/log4js-cloudwatch-appender/issues"},"homepage":"https://github.com/regevbr/log4js-cloudwatch-appender#readme","dependencies":{"lawgs":"^1.0.4"},"devDependencies":{"coveralls":"^3.0.0","expect.js":"^0.3.1","istanbul":"^0.4.5","jshint":"^2.9.5","mocha":"^4.0.1","mocha-lcov-reporter":"^1.3.0","sandboxed-module":"^2.0.3"},"gitHead":"db3830c3b6ba0322023b722a608eb1054f61a5f8","_id":"log4js-cloudwatch-appender@1.1.0","_shasum":"4eaf9039157fe1021def9e4146d23a0f220a4567","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.1","_npmUser":{"name":"regevbr","email":"regevbr@gmail.com"},"dist":{"shasum":"4eaf9039157fe1021def9e4146d23a0f220a4567","tarball":"https://registry.npmjs.org/log4js-cloudwatch-appender/-/log4js-cloudwatch-appender-1.1.0.tgz","integrity":"sha512-cS7PP7gCOLviJg5gmcaAWMk+yaO3C1SDSyYcP8vkBwoGexM+M6AyzT2NQz2G83KF41AdiyFs6MBFZlQU4n55rA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDagUgHEcJG3//pKMqgJpJtKBkyZOGIVzH4taH3uxzDfAIhAIat+S2B3muRWMuGOw7PACGTMWbTzW7EY6Uo38H92AWe"}]},"maintainers":[{"name":"regevbr","email":"regevbr@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/log4js-cloudwatch-appender-1.1.0.tgz_1512333111303_0.15098517388105392"}}},"readme":"[![Build Status](https://travis-ci.org/regevbr/log4js-cloudwatch-appender.svg?branch=master)](https://travis-ci.org/regevbr/log4js-cloudwatch-appender)\r\n[![Coverage Status](https://coveralls.io/repos/github/regevbr/log4js-cloudwatch-appender/badge.svg?branch=master)](https://coveralls.io/github/regevbr/log4js-cloudwatch-appender?branch=master)\r\n[![bitHound Overall Score](https://www.bithound.io/github/regevbr/log4js-cloudwatch-appender/badges/score.svg)](https://www.bithound.io/github/regevbr/log4js-cloudwatch-appender)\r\n[![Known Vulnerabilities](https://snyk.io/test/github/regevbr/log4js-cloudwatch-appender/badge.svg)](https://snyk.io/test/github/regevbr/log4js-cloudwatch-appender)\r\n[![dependencies Status](https://david-dm.org/regevbr/log4js-cloudwatch-appender/status.svg)](https://david-dm.org/regevbr/log4js-cloudwatch-appender)\r\n[![devDependencies Status](https://david-dm.org/regevbr/log4js-cloudwatch-appender/dev-status.svg)](https://david-dm.org/regevbr/log4js-cloudwatch-appender?type=dev)\r\n[![npm](https://img.shields.io/npm/dt/log4js-cloudwatch-appender.svg)](https://github.com/regevbr/log4js-cloudwatch-appender)\r\n[![HitCount](http://hits.dwyl.io/regevbr/log4js-cloudwatch-appender.svg)](http://hits.dwyl.io/regevbr/log4js-cloudwatch-appender)\r\n\r\n\r\n[![https://nodei.co/npm/log4js-cloudwatch-appender.png?downloads=true&downloadRank=true&stars=true](https://nodei.co/npm/log4js-cloudwatch-appender.png?downloads=true&downloadRank=true&stars=true)](https://www.npmjs.com/package/log4js-cloudwatch-appender)\r\n\r\n# log4js-cloudwatch-appender\r\nSimple appender for log4js to submit logs to AWS cloudwatch based on the [lawgs](https://github.com/mentum/lawgs) module.\r\n\r\n## Installation\r\n\r\nThis module is installed via npm:\r\n\r\n```\r\nnpm install --save log4js-cloudwatch-appender\r\n```\r\n\r\n## Usage\r\n\r\nAdd aws appender to the log4js config file:\r\n```js\r\nconst config = {\r\n    appenders: {\r\n        aws: {\r\n              type: \"log4js-cloudwatch-appender\",\r\n              accessKeyId: '<accessKeyId>',\r\n              secretAccessKey: '<secretAccessKey>',\r\n              region: 'eu-central-1',\r\n              logGroup: 'prod',\r\n              logStream: 'apps',\r\n              layout: '<custom layout object>',\r\n              lawgsConfig: '<optional alwgs config object>'\r\n            }\r\n    },\r\n    categories: {\r\n        default: {appenders: ['aws'], level: 'info'}\r\n    }\r\n}\r\n```\r\n\r\nThis will cause logs to be sent to AWS CloudWatch with the specified group and stream.\r\n\r\n## Configuration\r\n\r\n\r\nIf you are using roles, you will need the following roles:\r\n- logs:DescribeLogGroups\r\n- logs:DescribeLogStreams\r\n- logs:CreateLogGroup\r\n- logs:CreateLogStream\r\n- logs:PutLogEvents\r\n\r\n### mandatory\r\n\r\n- `region` - The CloudWatch region \r\n- `logGroup` - The log group to send the metrics to\r\n- `logStream` - The log stream of the group to send the metrics to\r\n\r\n### optional\r\n\r\n- `accessKeyId` - Optional if credentials are set in `~/.aws/credentials`\r\n- `secretAccessKey` - Optional if credentials are set in `~/.aws/credentials`\r\n- `layout` - Custom layout. See [suggested layout](#suggested-json-layout)\r\n- `lawgsConfig` - Optional vonfig object for lawgs:\r\n    - `showDebugLogs` - Show debug logs. Default: false.\r\n    - `uploadMaxTimer` - After this ms timeout, flush to server. Default: 5000.\r\n    - `uploadBatchSize` - After this amount of logs, flush to server. Default: 500.\r\n\r\n## Suggested json layout\r\n\r\nLogs are easier to query whn they are formatted as json. \r\nFollowing is a suggested json layout to set for this appender. \r\nThe logging style should be:\r\n\r\n```js\r\nconst uuid = require('node-uuid');\r\nconst corr = uuid.v4();\r\nconst logger = logFactory.getLogger('category');\r\n\r\nlogger.info(corr, 'methodName()','part1','part2');\r\n```\r\n\r\nWhich will output:\r\n```json\r\n{\r\n  \"timestamp\": \"2017-06-10T11:55:38.251Z\",\r\n  \"corr\": \"2e2c99aa-7eee-4fd2-ae36-cd9dc9533816\",\r\n  \"app\": \"<appName>\",\r\n  \"host\": \"<ip>\",\r\n  \"pid\": 24532,\r\n  \"level\": \"INFO\",\r\n  \"category\": \"category\",\r\n  \"method\": \"methodName()\",\r\n  \"message\": \"part1 part2\"\r\n}\r\n```\r\n\r\nThe layout:\r\n\r\n```js\r\nconst util = require('util');\r\nconst _ = require('underscore');\r\n\r\nlet processName = path.basename(process.argv[1]);\r\nprocessName = processName.substring(0, processName.length - 3);\r\n\r\nconst publicIp = require('public-ip').v4;\r\nlet ip = '';\r\npublicIp()\r\n  .then(function (_ip) {\r\n    ip = _ip;\r\n  })\r\n  .catch(function (e) {\r\n    console.log(e);\r\n    ip = 'unknown';\r\n  });\r\n\r\nconst jsonLayout = {\r\n  \"type\": \"pattern\",\r\n  \"pattern\": '{\"timestamp\": \"%d{yyyy-MM-ddThh:mm:ss.SSSZ}\", \"app\": \"' + processName + '\", \"ip\": \"%x{my_ip}\", \"host\": \"%h\", \"pid\": %z, \"level\": \"%p\", \"category\": \"%c\"%x{corr}%x{method}, \"message\": \"%x{message}\"}',\r\n  \"tokens\": {\r\n    \"my_ip\": function () {\r\n      return ip;\r\n    },\r\n   \"corr\": function (logEvent) {\r\n      logEvent.__data__ = _.map(logEvent.data, _.clone);\r\n      if (logEvent.__data__) {\r\n        let corr = logEvent.__data__[0];\r\n        if (Array.isArray(corr) && corr.length === 2) {\r\n          corr = corr[0];\r\n          if (typeof corr === 'string' && corr.length === 36 && corr.split(\"-\").length === 5) {\r\n            logEvent.__data__[0] = logEvent.__data__[0][1];\r\n            return ', \"corr\": \"' + corr + '\"';\r\n          }\r\n        }\r\n        if (logEvent.__data__.length > 1 && corr && typeof corr === 'string' && corr.length === 36 && corr.split(\"-\").length === 5) {\r\n          logEvent.__data__.shift();\r\n          return ', \"corr\": \"' + corr + '\"';\r\n        }\r\n      }\r\n      return '';\r\n    },\r\n    \"method\": function (logEvent) {\r\n      if (logEvent.__data__) {\r\n        const method = logEvent.__data__[0];\r\n        if (logEvent.__data__.length > 1 && method && typeof method === 'string' && method.indexOf(\"()\", method.length - 2) !== -1) {\r\n          logEvent.__data__.shift();\r\n          return ', \"method\": \"' + method + '\"';\r\n        }\r\n      }\r\n      return '';\r\n    },\r\n    \"message\": function (logEvent) {\r\n      if (logEvent.__data__) {\r\n        let data = logEvent.__data__;\r\n        data = util.format.apply(util, wrapErrorsWithInspect(data));\r\n        data = escapedStringify(data);\r\n        logEvent.__data__ = undefined;\r\n        return data;\r\n      }\r\n      return '';\r\n    }\r\n  }\r\n};\r\n\r\nfunction wrapErrorsWithInspect(items) {\r\n  return items.map(function (item) {\r\n    if ((item instanceof Error) && item.stack) {\r\n      return {\r\n        inspect: function () {\r\n          return util.format(item) + '\\n' + item.stack;\r\n        }\r\n      };\r\n    } else {\r\n      return item;\r\n    }\r\n  });\r\n}\r\n\r\nfunction escapedStringify(json) {\r\n  return json\r\n    .replace(/[\\\\]/g, '\\\\\\\\')\r\n    .replace(/[\\\"]/g, '\\\\\\\"')\r\n    .replace(/[\\/]/g, '\\\\/')\r\n    .replace(/[\\b]/g, '\\\\b')\r\n    .replace(/[\\f]/g, '\\\\f')\r\n    .replace(/[\\n]/g, '\\\\n')\r\n    .replace(/[\\r]/g, '\\\\r')\r\n    .replace(/[\\t]/g, '\\\\t');\r\n}\r\n```\r\n\r\n## Contributing\r\n\r\nPlease make all pull requests to the `master` branch and ensure tests pass\r\nlocally.\r\n","maintainers":[{"name":"regevbr","email":"regevbr@gmail.com"}],"time":{"modified":"2022-06-19T13:47:08.634Z","created":"2017-11-12T22:15:52.191Z","1.0.0":"2017-11-12T22:15:52.191Z","1.0.1":"2017-11-12T22:27:30.032Z","1.0.2":"2017-11-13T23:21:52.523Z","1.1.0":"2017-12-03T20:31:52.410Z"},"homepage":"https://github.com/regevbr/log4js-cloudwatch-appender#readme","keywords":["aws","cloudwatch","log4js","appender","cloud-watch","npm","npm-package","npm-module","javascript-library","cloud","watch","logs","log","cw","node","nodejs","javascript"],"repository":{"type":"git","url":"git+https://github.com/regevbr/log4js-cloudwatch-appender.git"},"author":{"name":"Regev Brody","email":"regevbr@gmail.com"},"bugs":{"url":"https://github.com/regevbr/log4js-cloudwatch-appender/issues"},"license":"GPL-3.0","readmeFilename":"README.md","users":{"bholbrook73":true}}