/ proxy / source / logger / Logger.ts
Logger.ts
 1  import pino, { Logger, LoggerOptions, TransportSingleOptions } from 'pino'
 2  import { ConfigManager } from '../config/ConfigManager'
 3  import logSymbols from 'log-symbols'
 4  import { SupportedLoggerType } from './SupportedLoggerType'
 5  
 6  const defaultOptions: LoggerOptions = {
 7      name: 'L2TS Proxy',
 8      level: 'info'
 9  }
10  
11  const prettyOptions: TransportSingleOptions = {
12      target: 'pino-pretty',
13      options: {
14          colorize: true
15      }
16  }
17  
18  export function createLogger( type: string ): Logger {
19  
20      switch ( type ) {
21          case SupportedLoggerType.OpenTelemetry:
22              console.log( logSymbols.info, 'Proxy Server: sending', ConfigManager.logger.getOTLPProtocol(),'logs to OTEL collector', process.env.OTEL_EXPORTER_OTLP_ENDPOINT )
23  
24              // TODO : figure out how to pass these directly instead of using environment variables
25              process.env.OTEL_EXPORTER_OTLP_PROTOCOL = ConfigManager.logger.getOTLPProtocol()
26              process.env.OTEL_EXPORTER_OTLP_ENDPOINT = ConfigManager.logger.getOTLPEndpoint()
27              process.env.OTEL_SERVICE_NAME = ConfigManager.logger.getServiceName() ?? defaultOptions.name
28              process.env.OTEL_EXPORTER_OTLP_HEADERS = ConfigManager.logger.getOTLPHeaders()
29  
30              return pino( {
31                  name: ConfigManager.logger.getServiceName() ?? defaultOptions.name,
32                  level: ConfigManager.logger.getLogLevel() ?? defaultOptions.level,
33                  transport: {
34                      targets: [
35                          prettyOptions,
36                          {
37                              target: 'pino-opentelemetry-transport',
38                              options: {}
39                          }
40                      ]
41                  },
42                  serializers: {
43                      error: pino.stdSerializers.err,
44                  }
45              } )
46  
47          case SupportedLoggerType.Pretty:
48              return pino( {
49                  ...defaultOptions,
50                  transport: prettyOptions,
51                  level: ConfigManager.logger.getLogLevel() ?? defaultOptions.level,
52                  serializers: {
53                      error: pino.stdSerializers.err,
54                  }
55              } )
56  
57          case SupportedLoggerType.Console:
58          default:
59              /*
60                  Fallback method in case no types can be associated with any log transports.
61               */
62              return pino( {
63                  ...defaultOptions,
64                  level: ConfigManager.logger.getLogLevel() ?? defaultOptions.level,
65                  serializers: {
66                      error: pino.stdSerializers.err,
67                  }
68              } )
69      }
70  }
71  
72  export const ServerLog: Logger = createLogger( ConfigManager.logger.getLoggerType() ?? SupportedLoggerType.Pretty )
73  
74  ConfigManager.logger.subscribe( () => {
75      ServerLog.level = ConfigManager.logger.getLogLevel() ?? defaultOptions.level
76  } )