Skip to content

Commit 7c5d632

Browse files
committed
web logger write to file on dev
1 parent 647c816 commit 7c5d632

File tree

4 files changed

+93
-5
lines changed

4 files changed

+93
-5
lines changed

backend/src/util/logger.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ import { mkdirSync } from 'fs'
22
import path from 'path'
33
import { format } from 'util'
44

5+
import { splitData } from '@codebuff/common/util/split-data'
56
import { env } from '@codebuff/internal'
67
import pino from 'pino'
78

8-
import { splitData } from './split-data'
99
import {
1010
getLoggerContext,
1111
withAppContext,
@@ -76,7 +76,10 @@ function splitAndLog(
7676
const availableDataLimit = MAX_LENGTH - BUFFER - formattedMsg.length
7777

7878
// split data recursively into chunks small enough to log
79-
const processedData: any[] = splitData({ data, maxChunkSize: availableDataLimit })
79+
const processedData: any[] = splitData({
80+
data,
81+
maxChunkSize: availableDataLimit,
82+
})
8083

8184
if (processedData.length === 1) {
8285
pinoLogger[level](processedData[0], msg, ...args)
File renamed without changes.

web/src/util/logger.ts

Lines changed: 88 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,90 @@
1+
import fs from 'fs'
2+
import path from 'path'
3+
import { format } from 'util'
4+
5+
import { splitData } from '@codebuff/common/util/split-data'
6+
import { env } from '@codebuff/internal'
17
import pino from 'pino'
28

3-
export const logger = pino({
4-
level: process.env.LOG_LEVEL || 'debug',
5-
})
9+
// --- Constants ---
10+
const MAX_LENGTH = 65535 // Max total log size is sometimes 100k (sometimes 65535?)
11+
const BUFFER = 1000 // Buffer for context, etc.
12+
13+
// Ensure debug directory exists for local environment
14+
const debugDir = path.join(__dirname, '../../../debug')
15+
if (
16+
env.NEXT_PUBLIC_CB_ENVIRONMENT === 'dev' &&
17+
process.env.CODEBUFF_GITHUB_ACTIONS !== 'true'
18+
) {
19+
try {
20+
fs.mkdirSync(debugDir, { recursive: true })
21+
} catch (err) {
22+
console.error('Failed to create debug directory:', err)
23+
}
24+
}
25+
26+
const pinoLogger = pino(
27+
{
28+
level: 'debug',
29+
formatters: {
30+
level: (label) => {
31+
return { level: label.toUpperCase() }
32+
},
33+
},
34+
timestamp: () => `,"timestamp":"${new Date(Date.now()).toISOString()}"`,
35+
},
36+
env.NEXT_PUBLIC_CB_ENVIRONMENT === 'dev' &&
37+
process.env.CODEBUFF_GITHUB_ACTIONS !== 'true'
38+
? pino.transport({
39+
target: 'pino/file',
40+
options: {
41+
destination: path.join(debugDir, 'web.log'),
42+
},
43+
level: 'debug',
44+
})
45+
: undefined,
46+
)
47+
48+
const loggingLevels = ['info', 'debug', 'warn', 'error', 'fatal'] as const
49+
type LogLevel = (typeof loggingLevels)[number]
50+
51+
function splitAndLog(
52+
level: LogLevel,
53+
data: any,
54+
msg?: string,
55+
...args: any[]
56+
): void {
57+
const formattedMsg = format(msg ?? '', ...args)
58+
const availableDataLimit = MAX_LENGTH - BUFFER - formattedMsg.length
59+
60+
// split data recursively into chunks small enough to log
61+
const processedData: any[] = splitData({
62+
data,
63+
maxChunkSize: availableDataLimit,
64+
})
65+
66+
if (processedData.length === 1) {
67+
pinoLogger[level](processedData[0], msg, ...args)
68+
return
69+
}
70+
71+
processedData.forEach((chunk, index) => {
72+
pinoLogger[level](
73+
chunk,
74+
`${formattedMsg} (chunk ${index + 1}/${processedData.length})`,
75+
)
76+
})
77+
}
78+
79+
export const logger: Record<LogLevel, pino.LogFn> =
80+
process.env.NEXT_PUBLIC_CB_ENVIRONMENT === 'dev'
81+
? pinoLogger
82+
: (Object.fromEntries(
83+
loggingLevels.map((level) => {
84+
return [
85+
level,
86+
(data: any, msg?: string, ...args: any[]) =>
87+
splitAndLog(level, data, msg, ...args),
88+
]
89+
}),
90+
) as Record<LogLevel, pino.LogFn>)

0 commit comments

Comments
 (0)