diff --git a/packages/backend/package.json b/packages/backend/package.json index 5bd58bb9..f5866d9a 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -22,6 +22,8 @@ }, "dependencies": { "@gitbeaker/rest": "^40.5.1", + "@logtail/node": "^0.5.2", + "@logtail/winston": "^0.5.2", "@octokit/rest": "^21.0.2", "@sentry/cli": "^2.42.2", "@sentry/node": "^9.3.0", @@ -47,4 +49,4 @@ "strip-json-comments": "^5.0.1", "winston": "^3.15.0" } -} \ No newline at end of file +} diff --git a/packages/backend/src/environment.ts b/packages/backend/src/environment.ts index c92dec49..d35dbdb5 100644 --- a/packages/backend/src/environment.ts +++ b/packages/backend/src/environment.ts @@ -43,3 +43,6 @@ export const REDIS_URL = getEnv(process.env.REDIS_URL, 'redis://localhost:6379') export const SENTRY_BACKEND_DSN = getEnv(process.env.SENTRY_BACKEND_DSN); export const SENTRY_ENVIRONMENT = getEnv(process.env.SENTRY_ENVIRONMENT, 'unknown')!; + +export const LOGTAIL_TOKEN = getEnv(process.env.LOGTAIL_TOKEN); +export const LOGTAIL_HOST = getEnv(process.env.LOGTAIL_HOST); \ No newline at end of file diff --git a/packages/backend/src/logger.ts b/packages/backend/src/logger.ts index 25763090..a6631ce4 100644 --- a/packages/backend/src/logger.ts +++ b/packages/backend/src/logger.ts @@ -1,8 +1,11 @@ import winston, { format } from 'winston'; -import { SOURCEBOT_LOG_LEVEL } from './environment.js'; +import { SOURCEBOT_LOG_LEVEL, LOGTAIL_TOKEN, LOGTAIL_HOST } from './environment.js'; +import { Logtail } from '@logtail/node'; +import { LogtailTransport } from '@logtail/winston'; const { combine, colorize, timestamp, prettyPrint, errors, printf, label: labelFn } = format; + const createLogger = (label: string) => { return winston.createLogger({ level: SOURCEBOT_LOG_LEVEL, @@ -28,6 +31,13 @@ const createLogger = (label: string) => { }), ), }), + ...(LOGTAIL_TOKEN && LOGTAIL_HOST ? [ + new LogtailTransport( + new Logtail(LOGTAIL_TOKEN, { + endpoint: LOGTAIL_HOST, + }) + ) + ] : []), ] }); } diff --git a/yarn.lock b/yarn.lock index d0d28210..50ddcc79 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1413,6 +1413,51 @@ "@lezer/highlight" "^1.0.0" "@lezer/lr" "^1.4.0" +"@logtail/core@^0.5.2": + version "0.5.2" + resolved "https://registry.npmjs.org/@logtail/core/-/core-0.5.2.tgz#a5fb36731848fbb47a3b1176c643a405e40d674d" + integrity sha512-mkQqGFwtZ06x2xsj6kOiEZeLSlPeTDArNOEeB9Q1VHxduRHJFInG7soix8+P8xeaoJx+7itvbUySB0XBlnmLSA== + dependencies: + "@logtail/tools" "^0.5.2" + "@logtail/types" "^0.5.2" + serialize-error "8.1.0" + +"@logtail/node@^0.5.2": + version "0.5.2" + resolved "https://registry.npmjs.org/@logtail/node/-/node-0.5.2.tgz#f0d2462b6c43f6d7334858cb8769bf23162fe2e9" + integrity sha512-pSleAsbq61WdaMzYkmW+kdCfptIWmjhSvNoyAtFFuaIGNXFS2UEmnHPrvzrPxsFgBswePSGl/m1teHTeBxA+qg== + dependencies: + "@logtail/core" "^0.5.2" + "@logtail/types" "^0.5.2" + "@msgpack/msgpack" "^2.5.1" + "@types/stack-trace" "^0.0.33" + cross-fetch "^4.0.0" + minimatch "^9.0.5" + serialize-error "8.1.0" + stack-trace "0.0.10" + +"@logtail/tools@^0.5.2": + version "0.5.2" + resolved "https://registry.npmjs.org/@logtail/tools/-/tools-0.5.2.tgz#b24f96f2bc65f86a928f915aa841f1ec15da2ff9" + integrity sha512-1Vg0rznoDYXWYDkz8orjKNTjK5f2eUubHN6tfJ2hHKCRRHy7y+TJpIlCQg3BilVcOvMIfiy4RbrcaFTHvDQWTQ== + dependencies: + "@logtail/types" "^0.5.2" + cross-fetch "^4.0.0" + +"@logtail/types@^0.5.2": + version "0.5.2" + resolved "https://registry.npmjs.org/@logtail/types/-/types-0.5.2.tgz#f5a53963df56a0dbed3e665f39ac1c2a092071d3" + integrity sha512-G3C3XjJPW/LJS0+sanzsNLLqXHAJkhdBR8h4zFUylOtUOevtlneenGNZFjEil+h/GOb3tUySvBuP2wl51gvf0A== + +"@logtail/winston@^0.5.2": + version "0.5.2" + resolved "https://registry.npmjs.org/@logtail/winston/-/winston-0.5.2.tgz#d667fc4303732ecc4baf3b40f0daa486877c7e66" + integrity sha512-eKbtw0RB1d0Cxs9qLxQskmcDjlyUolKJJluia0uNXK190SDavIY6VW/193BLSy5S7gn32V6T4kQ9yC0W6g9C9A== + dependencies: + "@logtail/node" "^0.5.2" + "@logtail/types" "^0.5.2" + winston-transport "^4.3.0" + "@mapbox/node-pre-gyp@^1.0.11": version "1.0.11" resolved "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz#417db42b7f5323d79e93b34a6d7a2a12c0df43fa" @@ -1428,6 +1473,11 @@ semver "^7.3.5" tar "^6.1.11" +"@msgpack/msgpack@^2.5.1": + version "2.8.0" + resolved "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-2.8.0.tgz#4210deb771ee3912964f14a15ddfb5ff877e70b9" + integrity sha512-h9u4u/jiIRKbq25PM+zymTyW6bhTzELvOoUd+AvYriWOAKpLGnIamaET3pnHYoI5iYphAHBI4ayx0MehR+VVPQ== + "@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3": version "3.0.3" resolved "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz" @@ -3773,6 +3823,11 @@ resolved "https://registry.yarnpkg.com/@types/shimmer/-/shimmer-1.2.0.tgz#9b706af96fa06416828842397a70dfbbf1c14ded" integrity sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg== +"@types/stack-trace@^0.0.33": + version "0.0.33" + resolved "https://registry.npmjs.org/@types/stack-trace/-/stack-trace-0.0.33.tgz#979a3fde9e721e78603b781e468ef30f0df0f049" + integrity sha512-O7in6531Bbvlb2KEsJ0dq0CHZvc3iWSR5ZYMtvGgnHA56VgriAN/AU2LorfmcvAl2xc9N5fbCTRyMRRl8nd74g== + "@types/tedious@^4.0.14": version "4.0.14" resolved "https://registry.yarnpkg.com/@types/tedious/-/tedious-4.0.14.tgz#868118e7a67808258c05158e9cad89ca58a2aec1" @@ -7360,6 +7415,18 @@ logform@^2.6.0, logform@^2.6.1: safe-stable-stringify "^2.3.1" triple-beam "^1.3.0" +logform@^2.7.0: + version "2.7.0" + resolved "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz#cfca97528ef290f2e125a08396805002b2d060d1" + integrity sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ== + dependencies: + "@colors/colors" "1.6.0" + "@types/triple-beam" "^1.3.2" + fecha "^4.2.0" + ms "^2.1.1" + safe-stable-stringify "^2.3.1" + triple-beam "^1.3.0" + loglevel@^1.9.1: version "1.9.2" resolved "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz" @@ -7608,7 +7675,7 @@ minimatch@^8.0.2: dependencies: brace-expansion "^2.0.1" -minimatch@^9.0.1, minimatch@^9.0.4: +minimatch@^9.0.1, minimatch@^9.0.4, minimatch@^9.0.5: version "9.0.5" resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== @@ -8755,7 +8822,7 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" -readable-stream@^3.4.0, readable-stream@^3.6.0: +readable-stream@^3.4.0, readable-stream@^3.6.0, readable-stream@^3.6.2: version "3.6.2" resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -9068,6 +9135,13 @@ send@0.19.0: range-parser "~1.2.1" statuses "2.0.1" +serialize-error@8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz#3a069970c712f78634942ddd50fbbc0eaebe2f67" + integrity sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ== + dependencies: + type-fest "^0.20.2" + serve-static@1.16.2: version "1.16.2" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" @@ -9357,7 +9431,7 @@ split@0.3: dependencies: through "2" -stack-trace@0.0.x: +stack-trace@0.0.10, stack-trace@0.0.x: version "0.0.10" resolved "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz" integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== @@ -9532,14 +9606,7 @@ stringify-entities@^4.0.0: character-entities-html4 "^2.0.0" character-entities-legacy "^3.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -10389,6 +10456,15 @@ wide-align@^1.1.2: dependencies: string-width "^1.0.2 || 2 || 3 || 4" +winston-transport@^4.3.0: + version "4.9.0" + resolved "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz#3bba345de10297654ea6f33519424560003b3bf9" + integrity sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A== + dependencies: + logform "^2.7.0" + readable-stream "^3.6.2" + triple-beam "^1.3.0" + winston-transport@^4.7.0: version "4.8.0" resolved "https://registry.npmjs.org/winston-transport/-/winston-transport-4.8.0.tgz"