api: pull pino-pretty for better logging
Pedro Lucas Porcellis porcellis@eletrotupi.com · 5 months ago
d3859d7a3aea712c026e40c147d5359d66f841c7 Browse filesParents
2cac61aChanged files
3
Additions
+115
Deletions
-4
api/package-lock.json
1 1
{
2 2
"name": "orbit-api",
3 3
"version": "0.0.0",
4 4
"lockfileVersion": 3,
5 5
"requires": true,
43 43
"@types/node": "^25.5.2",
44 44
"ava": "^6.4.1",
45 45
"cross-var": "^1.1.0",
46 46
"dotenv-cli": "^11.0.0",
47 47
"nodemon": "^3.1.14",
48 +
"pino-pretty": "^13.1.3",
48 49
"prisma": "^7.5.0",
49 50
"supertest": "^7.1.4",
50 51
"ts-node": "^10.9.2",
51 52
"tsc-alias": "^1.8.16",
52 53
"tsconfig-paths": "^4.2.0",
3958 3959
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
3959 3960
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
3960 3961
"dev": true,
3961 3962
"license": "MIT"
3962 3963
},
3964 +
"node_modules/colorette": {
3965 +
"version": "2.0.20",
3966 +
"resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
3967 +
"integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
3968 +
"dev": true,
3969 +
"license": "MIT"
3970 +
},
3963 3971
"node_modules/combined-stream": {
3964 3972
"version": "1.0.8",
3965 3973
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
3966 3974
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
3967 3975
"dev": true,
4306 4314
"dependencies": {
4307 4315
"time-zone": "^1.0.0"
4308 4316
},
4309 4317
"engines": {
4310 4318
"node": ">=6"
4319 +
}
4320 +
},
4321 +
"node_modules/dateformat": {
4322 +
"version": "4.6.3",
4323 +
"resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz",
4324 +
"integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==",
4325 +
"dev": true,
4326 +
"license": "MIT",
4327 +
"engines": {
4328 +
"node": "*"
4311 4329
}
4312 4330
},
4313 4331
"node_modules/debug": {
4314 4332
"version": "4.4.3",
4315 4333
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
4916 4934
"pure-rand": "^6.1.0"
4917 4935
},
4918 4936
"engines": {
4919 4937
"node": ">=8.0.0"
4920 4938
}
4939 +
},
4940 +
"node_modules/fast-copy": {
4941 +
"version": "4.0.3",
4942 +
"resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-4.0.3.tgz",
4943 +
"integrity": "sha512-58apWr0GUiDFM8+3afrO6eYwJBn9ZAhDOzG3L+/9llab/haCARS2UIfffmOurYLwbgDRs8n0rfr6qAAPEAuAQw==",
4944 +
"dev": true,
4945 +
"license": "MIT"
4921 4946
},
4922 4947
"node_modules/fast-diff": {
4923 4948
"version": "1.3.0",
4924 4949
"resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz",
4925 4950
"integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==",
5503 5528
},
5504 5529
"engines": {
5505 5530
"node": ">= 0.4"
5506 5531
}
5507 5532
},
5533 +
"node_modules/help-me": {
5534 +
"version": "5.0.0",
5535 +
"resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz",
5536 +
"integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==",
5537 +
"dev": true,
5538 +
"license": "MIT"
5539 +
},
5508 5540
"node_modules/home-or-tmp": {
5509 5541
"version": "2.0.0",
5510 5542
"resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
5511 5543
"integrity": "sha512-ycURW7oUxE2sNiPVw1HVEFsW+ecOpJ5zaj7eC0RlwhibhRBod20muUN8qu/gzx956YrLolVvs1MTXwKgC2rVEg==",
5512 5544
"dev": true,
5893 5925
"integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==",
5894 5926
"devOptional": true,
5895 5927
"license": "MIT",
5896 5928
"bin": {
5897 5929
"jiti": "lib/jiti-cli.mjs"
5930 +
}
5931 +
},
5932 +
"node_modules/joycon": {
5933 +
"version": "3.1.1",
5934 +
"resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz",
5935 +
"integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==",
5936 +
"dev": true,
5937 +
"license": "MIT",
5938 +
"engines": {
5939 +
"node": ">=10"
5898 5940
}
5899 5941
},
5900 5942
"node_modules/js-string-escape": {
5901 5943
"version": "1.0.1",
5902 5944
"resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz",
7302 7344
"pino": "^10.0.0",
7303 7345
"pino-std-serializers": "^7.0.0",
7304 7346
"process-warning": "^5.0.0"
7305 7347
}
7306 7348
},
7349 +
"node_modules/pino-pretty": {
7350 +
"version": "13.1.3",
7351 +
"resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-13.1.3.tgz",
7352 +
"integrity": "sha512-ttXRkkOz6WWC95KeY9+xxWL6AtImwbyMHrL1mSwqwW9u+vLp/WIElvHvCSDg0xO/Dzrggz1zv3rN5ovTRVowKg==",
7353 +
"dev": true,
7354 +
"license": "MIT",
7355 +
"dependencies": {
7356 +
"colorette": "^2.0.7",
7357 +
"dateformat": "^4.6.3",
7358 +
"fast-copy": "^4.0.0",
7359 +
"fast-safe-stringify": "^2.1.1",
7360 +
"help-me": "^5.0.0",
7361 +
"joycon": "^3.1.1",
7362 +
"minimist": "^1.2.6",
7363 +
"on-exit-leak-free": "^2.1.0",
7364 +
"pino-abstract-transport": "^3.0.0",
7365 +
"pump": "^3.0.0",
7366 +
"secure-json-parse": "^4.0.0",
7367 +
"sonic-boom": "^4.0.1",
7368 +
"strip-json-comments": "^5.0.2"
7369 +
},
7370 +
"bin": {
7371 +
"pino-pretty": "bin.js"
7372 +
}
7373 +
},
7374 +
"node_modules/pino-pretty/node_modules/strip-json-comments": {
7375 +
"version": "5.0.3",
7376 +
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.3.tgz",
7377 +
"integrity": "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==",
7378 +
"dev": true,
7379 +
"license": "MIT",
7380 +
"engines": {
7381 +
"node": ">=14.16"
7382 +
},
7383 +
"funding": {
7384 +
"url": "https://github.com/sponsors/sindresorhus"
7385 +
}
7386 +
},
7307 7387
"node_modules/pino-std-serializers": {
7308 7388
"version": "7.1.0",
7309 7389
"resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz",
7310 7390
"integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==",
7311 7391
"license": "MIT"
8030 8110
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
8031 8111
"integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
8032 8112
"devOptional": true,
8033 8113
"license": "MIT",
8034 8114
"peer": true
8115 +
},
8116 +
"node_modules/secure-json-parse": {
8117 +
"version": "4.1.0",
8118 +
"resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-4.1.0.tgz",
8119 +
"integrity": "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==",
8120 +
"dev": true,
8121 +
"funding": [
8122 +
{
8123 +
"type": "github",
8124 +
"url": "https://github.com/sponsors/fastify"
8125 +
},
8126 +
{
8127 +
"type": "opencollective",
8128 +
"url": "https://opencollective.com/fastify"
8129 +
}
8130 +
],
8131 +
"license": "BSD-3-Clause"
8035 8132
},
8036 8133
"node_modules/semver": {
8037 8134
"version": "7.8.0",
8038 8135
"resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz",
8039 8136
"integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==",
9543 9640
"zod": "^3.25.0 || ^4.0.0"
9544 9641
}
9545 9642
}
9546 9643
}
9547 9644
}
api/package.json
1 1
{
2 2
"name": "orbit-api",
3 3
"version": "0.0.0",
4 4
"description": "",
5 5
"license": "ISC",
53 53
"@types/node": "^25.5.2",
54 54
"ava": "^6.4.1",
55 55
"cross-var": "^1.1.0",
56 56
"dotenv-cli": "^11.0.0",
57 57
"nodemon": "^3.1.14",
58 +
"pino-pretty": "^13.1.3",
58 59
"prisma": "^7.5.0",
59 60
"supertest": "^7.1.4",
60 61
"ts-node": "^10.9.2",
61 62
"tsc-alias": "^1.8.16",
62 63
"tsconfig-paths": "^4.2.0",
63 64
"tsx": "^4.21.0",
64 65
"typescript": "^6.0.2"
65 66
}
66 67
}
api/src/createApp.ts
1 1
import express from 'express';
2 2
import cors from 'cors';
3 3
import bodyParser from 'body-parser';
4 4
import morgan from 'morgan';
5 5
import mainRouter from '@app/routes/main';
7 7
import authRouter from '@app/routes/auth';
8 8
import moodRouter from '@app/routes/moods';
9 9
import { errorHandler } from '@app/middleware/errorHandler';
10 10
import { PrismaClient } from '@prisma/client';
11 11
import { bootWorkers, closeAllWorkers, closeAllQueues } from '@app/lib/queue';
12 +
import pino from 'pino';
13 +
import pinoHttp from 'pino-http';
12 14
13 15
export function createApp() {
14 16
const app = express();
15 17
bootWorkers();
16 18
20 22
credentials: true
21 23
}));
22 24
23 25
app.use(bodyParser.json());
24 26
25 -
// Only use morgan in non-test environments
26 -
if (process.env.NODE_ENV !== 'test') {
27 -
app.use(morgan('combined'));
28 -
}
27 +
// Create Pino logger
28 +
const logger = pino({
29 +
level: process.env.LOG_LEVEL || 'info',
30 +
transport: {
31 +
target: 'pino-pretty', // Human-readable in development
32 +
options: {
33 +
colorize: true,
34 +
singleLine: false,
35 +
messageFormat: '{if levelLabel}{levelLabel} - {end}{msg}',
36 +
},
37 +
},
38 +
});
39 +
40 +
// Use pino-http for HTTP logging (better than Morgan for structured logs)
41 +
app.use(pinoHttp({ logger }));
29 42
30 43
app.get('/', mainRouter);
31 44
app.use("/users", userRouter);
32 45
app.use("/auth", authRouter);
33 46
app.use("/moods", moodRouter);
42 55
43 56
const shutdown = async () => {
44 57
await Promise.all([closeAllWorkers(), closeAllQueues()]);
45 58
process.exit(0);
46 59
};