]> Piment Noir Git Repositories - e-mobility-charging-stations-simulator.git/blob - src/utils/Logger.ts
e8b3af6450e5a3d64ee042413fc3c3677a72ccdd
[e-mobility-charging-stations-simulator.git] / src / utils / Logger.ts
1 import type { FormatWrap } from 'logform'
2
3 import { createLogger, format, type transport, transports as WinstonTransports } from 'winston'
4 import DailyRotateFile from 'winston-daily-rotate-file'
5
6 import { ConfigurationSection, type LogConfiguration } from '../types/index.js'
7 import { Configuration } from './Configuration.js'
8 import { insertAt, isNotEmptyString } from './Utils.js'
9
10 const logConfiguration = Configuration.getConfigurationSection<LogConfiguration>(
11 ConfigurationSection.log
12 )
13 const transports: transport[] = []
14 if (logConfiguration.rotate === true) {
15 const logMaxFiles = logConfiguration.maxFiles
16 const logMaxSize = logConfiguration.maxSize
17 if (isNotEmptyString(logConfiguration.errorFile)) {
18 transports.push(
19 new DailyRotateFile({
20 filename: insertAt(
21 logConfiguration.errorFile,
22 '-%DATE%',
23 logConfiguration.errorFile.indexOf('.log')
24 ),
25 level: 'error',
26 ...(logMaxFiles != null && { maxFiles: logMaxFiles }),
27 ...(logMaxSize != null && { maxSize: logMaxSize }),
28 })
29 )
30 }
31 if (isNotEmptyString(logConfiguration.file)) {
32 transports.push(
33 new DailyRotateFile({
34 filename: insertAt(logConfiguration.file, '-%DATE%', logConfiguration.file.indexOf('.log')),
35 ...(logMaxFiles != null && { maxFiles: logMaxFiles }),
36 ...(logMaxSize != null && { maxSize: logMaxSize }),
37 })
38 )
39 }
40 } else {
41 if (isNotEmptyString(logConfiguration.errorFile)) {
42 transports.push(
43 new WinstonTransports.File({
44 filename: logConfiguration.errorFile,
45 level: 'error',
46 })
47 )
48 }
49 if (isNotEmptyString(logConfiguration.file)) {
50 transports.push(
51 new WinstonTransports.File({
52 filename: logConfiguration.file,
53 })
54 )
55 }
56 }
57
58 const logFormat = format.combine(
59 format.splat(),
60 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
61 (format[logConfiguration.format! as keyof FormatWrap] as FormatWrap)()
62 )
63
64 const logger = createLogger({
65 format: logFormat,
66 level: logConfiguration.level,
67 silent: logConfiguration.enabled === false || transports.length === 0,
68 transports,
69 })
70
71 //
72 // If enabled, log to the `console` with the format:
73 // `${info.level}: ${info.message} JSON.stringify({ ...rest }) `
74 //
75 if (logConfiguration.console === true) {
76 logger.add(
77 new WinstonTransports.Console({
78 format: logFormat,
79 })
80 )
81 }
82
83 export { logger }