From 3aaebb58cf407556beca83fb5d019ef44f92e5bd Mon Sep 17 00:00:00 2001 From: Aaron Estrada Date: Thu, 3 Feb 2022 13:59:40 -0600 Subject: [PATCH] chore: updates docs and example to use transports (#49) chore: updates docs and example to use transports Co-authored-by: Bryan Shell --- examples/simple/manifest.json | 43 +++++++++------ examples/simple/readme.md | 61 +++++++++++++++++++++ examples/simple/threads-diagram.drawio.png | Bin 0 -> 23557 bytes lib/config.json | 2 +- package.json | 2 +- 5 files changed, 88 insertions(+), 20 deletions(-) create mode 100644 examples/simple/readme.md create mode 100644 examples/simple/threads-diagram.drawio.png diff --git a/examples/simple/manifest.json b/examples/simple/manifest.json index c989f3c..568215c 100644 --- a/examples/simple/manifest.json +++ b/examples/simple/manifest.json @@ -1,27 +1,34 @@ { "server": { + "debug": false // disable Hapi debug console logging }, "register": { "hapi-pino": { "plugin": "require:hapi-pino", - "options": { - "mergeHapiLogData": false, - // "level": "debug", - "ignorePaths": [ - "/health", - "/alive.txt", - "/private" - ], - "tags": { "GET_items": "info", "GET_error": "error" }, - // transport option is not recomended for prod env - "transport": { - "target": "pino-pretty", - "options": { - "singleLine": true, - "colorize": true, - "mkdir": true, - "append": false, - "destination": "logs/output.log" + "options":{ + "$filter": "env.NODE_ENV", + "$default": { + "logRequestComplete": false, + "ignoredEventTags": { "log": ["client"], "request": "*" }, + "logPayload": false, + "transport": { + "targets": [ + { + "target": "pino/file", + "options": { + "destination": 1 + } + } + ] + } + }, + "development": { + "transport": { + "target": "pino-pretty", + "options": { + "colorize": true, + "translateTime": true + } } } } diff --git a/examples/simple/readme.md b/examples/simple/readme.md new file mode 100644 index 0000000..3577743 --- /dev/null +++ b/examples/simple/readme.md @@ -0,0 +1,61 @@ +# Catalyst server log configuration + +The follow diagram explains how our catalyst server manages logs + +![threads-diagram drawio](https://user-images.githubusercontent.com/88118994/149195822-de5d33ad-f29f-48ff-840b-ce2fb41eb08a.png) + +## [Pino-pretty](https://github.com/pinojs/pino-pretty) logs for development mode: + +install pino-pretty as a development dependency. + +` npm install --save-dev pino-pretty ` + +manifest.json +``` + "hapi-pino": { + "plugin": "require:hapi-pino", + "options": { + "$filter": "env.NODE_ENV", + "$default": {}, + "development": { + "transport": { + "target": "pino-pretty", + "options": { + "colorize": true, + "translateTime": true + } + } + } + } + } +``` + +pass the `NODE_ENV` as following: + +``` +NODE_ENV=development node ./examples/simple/index.js +``` + +## [Pino/file](https://github.com/pinojs/pino/blob/HEAD/docs/transports.md#pinofile) transport logs to stdout or file for production. + +``` + "transport": { + "targets": [ + { + "target": "pino/file", + "options": { + "destination": 1 + } + } + ] + } +``` + +## node js profile review + +``` +clinic doctor --autocannon [ /items ] -- node --max-http-header-size=32768 ./examples/simple/index.js | ./node_modules/.bin/pino-pretty --config=./examples/simple/.pino-prettyrc + +``` + + diff --git a/examples/simple/threads-diagram.drawio.png b/examples/simple/threads-diagram.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..2ca276893ff6819f9d9d2b0740f4d269c3692382 GIT binary patch literal 23557 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