-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathwinston.ts
92 lines (75 loc) · 2.61 KB
/
winston.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import pretty from 'pretty';
import winston, { format, transports } from 'winston';
import { getAppNow, humanFormat } from '@/libs/datetime';
import { SERVER_CONFIG } from '@/config/server';
import type { Logform, Logger } from 'winston';
const { combine, timestamp, colorize, printf } = format;
// ! because of this cant be used in config
const { nodeEnv, logFilePath } = SERVER_CONFIG;
const printContext = (meta: unknown, addNewline = true) =>
meta && Object.keys(meta).length > 0
? `${addNewline ? '\n' : ''}LOG_CONTEXT: ${JSON.stringify(meta, null, 2)}`
: '';
// todo: add tailwind css
const htmlFormat: Logform.Format = printf(({ timestamp, level, message, ...meta }) => {
const metaString = printContext(meta, false);
const htmlString = `<div class="log-entry">
<span class="level">${level.toUpperCase()}</span>:
<span class="timestamp">${timestamp}</span> -
<span class="message">${message}</span>
${metaString ? `<span class="meta">${metaString}</span>` : ''}
</div>`;
return pretty(htmlString, { ocd: true });
});
const timestampWithTimezone: Logform.Format = timestamp({
format: () => humanFormat(getAppNow()),
});
const consoleFormat: Logform.Format = printf(({ timestamp, level, message, ...meta }) => {
return `${level} ${timestamp} - ${message}${printContext(meta)}`;
});
/**
* important: must level.toUpperCase() before ANSI color codes in colorize
* format(), not printf() from consoleFormat
*/
const uppercaseLevel = format((info: Logform.TransformableInfo) => {
info.level = info.level.toUpperCase();
return info;
})();
const consoleCombinedFormats: Logform.Format = combine(
timestampWithTimezone,
uppercaseLevel, // must be before colorize()
colorize(),
consoleFormat
);
// todo: singleton
const devLogger: Logger = winston.createLogger({
level: 'debug',
format: consoleCombinedFormats,
transports: [new transports.Console()],
});
const prodLogger: Logger = winston.createLogger({
level: 'info',
transports: [
new transports.Console({ format: consoleCombinedFormats }),
new transports.File({
filename: logFilePath,
format: combine(timestampWithTimezone, htmlFormat),
maxFiles: 2,
/**
* 1 line - 30 bytes
* 1 page - 3kB
*/
// ! creates new file, useless
maxsize: 300, // 10kB max file size
}),
],
});
// ! disable prodLogger until resolve rotating single file
// const logger: Logger = nodeEnv === 'production' ? prodLogger : devLogger;
/**
* @example
* logger.info('my message);
* logger.info('my test message', { k: 999, yy: 777 });
*/
const logger: Logger = devLogger;
export default logger;