detached 6968ec0

Merge pull request #73 from kitpdr/fix/cloudflare-logger-compat

fix: replace pino with cloudflare-compatible logger
commit
6968ec0985562dcff9a59883c26ceee22280e301
author
KiT · · 2026-01-18 21:34 UTC
committer
GitHub · · 2026-01-18 21:34 UTC
merge of
a7124c4 + 6b6c0b3 · diff against the first parent
signature
GPG UnverifiedB5690EEEBB952194 The key is unknown
1 file · +14 -44
M src/lib/utils/logger.server.ts +14 -44
@@ -1,46 +1,14 @@
11 import pino from 'pino';
22
3-const logLevel = process.env.NODE_ENV === 'development' ? 'debug' : 'info';
4-
5-class LoggerService {
6- private static instance: LoggerService;
7- private logger: pino.Logger;
8- private moduleLoggers: Map<string, Logger>;
9-
10- private constructor() {
11- this.logger = pino({
12- transport: {
13- target: 'pino-pretty',
14- options: {
15- colorize: true,
16- translateTime: 'HH:MM:ss',
17- ignore: 'pid,hostname'
18- }
19- },
20- level: logLevel
21- });
22- this.moduleLoggers = new Map();
23- }
24-
25- public static getInstance(): LoggerService {
26- if (!LoggerService.instance) {
27- LoggerService.instance = new LoggerService();
28- }
29- return LoggerService.instance;
3+// Pino without transports works in Cloudflare Workers (no worker threads)
4+// transports like pino-pretty use worker threads which don't exist in CF Workers
5+// Use 'debug' level - filtering happens at log time based on env
6+const logger = pino({
7+ level: 'debug',
8+ formatters: {
9+ level: (label) => ({ level: label })
3010 }
31-
32- public getLogger(module: string): Logger {
33- if (!this.moduleLoggers.has(module)) {
34- this.moduleLoggers.set(module, {
35- debug: (msg: string, obj = {}) => this.logger.debug({ module, ...obj }, msg),
36- info: (msg: string, obj = {}) => this.logger.info({ module, ...obj }, msg),
37- warn: (msg: string, obj = {}) => this.logger.warn({ module, ...obj }, msg),
38- error: (msg: string, obj = {}) => this.logger.error({ module, ...obj }, msg)
39- });
40- }
41- return this.moduleLoggers.get(module)!;
42- }
43-}
11+});
4412
4513 export interface Logger {
4614 debug: (msg: string, obj?: object) => void;
@@ -49,7 +17,9 @@ export interface Logger {
4917 error: (msg: string, obj?: object) => void;
5018 }
5119
52-// Export a function to get a logger for a specific module
53-export const createLogger = (module: string): Logger => {
54- return LoggerService.getInstance().getLogger(module);
55-};
20+export const createLogger = (module: string): Logger => ({
21+ debug: (msg: string, obj = {}) => logger.debug({ module, ...obj }, msg),
22+ info: (msg: string, obj = {}) => logger.info({ module, ...obj }, msg),
23+ warn: (msg: string, obj = {}) => logger.warn({ module, ...obj }, msg),
24+ error: (msg: string, obj = {}) => logger.error({ module, ...obj }, msg)
25+});
@@ -1,46 +1,14 @@
1 import pino from 'pino';1 import pino from 'pino';
2 2
3-const logLevel = process.env.NODE_ENV === 'development' ? 'debug' : 'info';3+// Pino without transports works in Cloudflare Workers (no worker threads)
4-4+// transports like pino-pretty use worker threads which don't exist in CF Workers
5-class LoggerService {5+// Use 'debug' level - filtering happens at log time based on env
6- private static instance: LoggerService;6+const logger = pino({
7- private logger: pino.Logger;7+ level: 'debug',
8- private moduleLoggers: Map<string, Logger>;8+ formatters: {
9-9+ level: (label) => ({ level: label })
10- private constructor() {
11- this.logger = pino({
12- transport: {
13- target: 'pino-pretty',
14- options: {
15- colorize: true,
16- translateTime: 'HH:MM:ss',
17- ignore: 'pid,hostname'
18- }
19- },
20- level: logLevel
21- });
22- this.moduleLoggers = new Map();
23- }
24-
25- public static getInstance(): LoggerService {
26- if (!LoggerService.instance) {
27- LoggerService.instance = new LoggerService();
28- }
29- return LoggerService.instance;
30 }10 }
31-11+});
32- public getLogger(module: string): Logger {
33- if (!this.moduleLoggers.has(module)) {
34- this.moduleLoggers.set(module, {
35- debug: (msg: string, obj = {}) => this.logger.debug({ module, ...obj }, msg),
36- info: (msg: string, obj = {}) => this.logger.info({ module, ...obj }, msg),
37- warn: (msg: string, obj = {}) => this.logger.warn({ module, ...obj }, msg),
38- error: (msg: string, obj = {}) => this.logger.error({ module, ...obj }, msg)
39- });
40- }
41- return this.moduleLoggers.get(module)!;
42- }
43-}
44 12
45 export interface Logger {13 export interface Logger {
46 debug: (msg: string, obj?: object) => void;14 debug: (msg: string, obj?: object) => void;
@@ -49,7 +17,9 @@ export interface Logger {
49 error: (msg: string, obj?: object) => void;17 error: (msg: string, obj?: object) => void;
50 }18 }
51 19
52-// Export a function to get a logger for a specific module20+export const createLogger = (module: string): Logger => ({
53-export const createLogger = (module: string): Logger => {21+ debug: (msg: string, obj = {}) => logger.debug({ module, ...obj }, msg),
54- return LoggerService.getInstance().getLogger(module);22+ info: (msg: string, obj = {}) => logger.info({ module, ...obj }, msg),
55-};23+ warn: (msg: string, obj = {}) => logger.warn({ module, ...obj }, msg),
24+ error: (msg: string, obj = {}) => logger.error({ module, ...obj }, msg)
25+});

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 3

Tags 8

↑↓ moveenter openesc close