Skip to content

Commit a3f3d51

Browse files
authored
feat: map pino log level to AWS severity (#25022)
.
2 parents 63e8535 + cb90097 commit a3f3d51

3 files changed

Lines changed: 47 additions & 4 deletions

File tree

yarn-project/foundation/src/config/env_var.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ export type EnvVar =
100100
| 'NETWORK'
101101
| 'NETWORK_CONFIG_LOCATION'
102102
| 'ALLOW_OVERRIDING_NETWORK_CONFIG'
103+
| 'USE_AWS_LOGGING'
103104
| 'USE_GCLOUD_LOGGING'
104105
| 'OTEL_EXPORTER_OTLP_METRICS_ENDPOINT'
105106
| 'OTEL_EXPORTER_OTLP_TRACES_ENDPOINT'
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import type { pino } from 'pino';
2+
3+
function getSeverity(label: string): { severityText: string; severityNumber: number } {
4+
switch (label) {
5+
case 'trace':
6+
return { severityText: 'TRACE', severityNumber: 1 };
7+
case 'debug':
8+
return { severityText: 'DEBUG', severityNumber: 5 };
9+
case 'verbose':
10+
return { severityText: 'VERBOSE', severityNumber: 7 };
11+
case 'info':
12+
return { severityText: 'INFO', severityNumber: 9 };
13+
case 'warn':
14+
return { severityText: 'WARN', severityNumber: 13 };
15+
case 'error':
16+
return { severityText: 'ERROR', severityNumber: 17 };
17+
case 'fatal':
18+
return { severityText: 'FATAL', severityNumber: 21 };
19+
default:
20+
return { severityText: 'UNSPECIFIED', severityNumber: 0 };
21+
}
22+
}
23+
24+
/** Pino configuration that adds OpenTelemetry severity fields understood by CloudWatch Logs. */
25+
export const AWSCloudLoggerConfig = {
26+
messageKey: 'msg',
27+
formatters: {
28+
level(label: string, level: number): object {
29+
return { level, ...getSeverity(label) };
30+
},
31+
},
32+
} satisfies pino.LoggerOptions;

yarn-project/foundation/src/log/pino-logger.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { inspect } from 'util';
77
import { compactArray } from '../collection/array.js';
88
import type { EnvVar } from '../config/index.js';
99
import { parseBooleanEnv } from '../config/parse-env.js';
10+
import { AWSCloudLoggerConfig } from './aws-logger-config.js';
1011
import { convertBigintsToStrings } from './bigint-utils.js';
1112
import { GoogleCloudLoggerConfig } from './gcloud-logger-config.js';
1213
import { getLogLevelFromFilters, parseLogLevelEnvVar } from './log-filters.js';
@@ -134,8 +135,17 @@ export const [logLevel, logFilters] = parseLogLevelEnvVar(process.env.LOG_LEVEL,
134135
// Define custom logging levels for pino.
135136
const customLevels = { verbose: 25 };
136137

137-
// Global pino options, tweaked for google cloud if running there.
138+
// Global pino options, tweaked for the active cloud logging backend.
138139
const useGcloudLogging = parseBooleanEnv(process.env['USE_GCLOUD_LOGGING' satisfies EnvVar]);
140+
const useAwsLogging = parseBooleanEnv(process.env['USE_AWS_LOGGING' satisfies EnvVar]);
141+
const loggingConfig = useGcloudLogging
142+
? GoogleCloudLoggerConfig
143+
: useAwsLogging
144+
? AWSCloudLoggerConfig
145+
: {
146+
formatters: {},
147+
messageKey: 'msg',
148+
};
139149

140150
const redactedPaths = [
141151
'validatorPrivateKeys',
@@ -156,7 +166,7 @@ const redactedPaths = [
156166

157167
const pinoOpts: pino.LoggerOptions<keyof typeof customLevels> = {
158168
customLevels,
159-
messageKey: 'msg',
169+
messageKey: loggingConfig.messageKey,
160170
useOnlyCustomLevels: false,
161171
level: logLevel,
162172
redact: {
@@ -170,8 +180,8 @@ const pinoOpts: pino.LoggerOptions<keyof typeof customLevels> = {
170180
},
171181
formatters: {
172182
log: obj => convertBigintsToStrings(obj) as Record<string, unknown>,
183+
...loggingConfig.formatters,
173184
},
174-
...(useGcloudLogging ? GoogleCloudLoggerConfig : {}),
175185
};
176186

177187
export const levels = {
@@ -241,7 +251,7 @@ const pinoPrettyBaseOpts = {
241251
destination: 2,
242252
sync: true,
243253
colorize: useColor,
244-
ignore: 'module,actor,instanceId,pid,hostname,trace_id,span_id,trace_flags,severity',
254+
ignore: 'module,actor,instanceId,pid,hostname,trace_id,span_id,trace_flags,severity,severityText,severityNumber',
245255
customLevels: 'fatal:60,error:50,warn:40,info:30,verbose:25,debug:20,trace:10',
246256
customColors: 'fatal:bgRed,error:red,warn:yellow,info:green,verbose:magenta,debug:blue,trace:gray',
247257
minimumLevel: 'trace' as const,

0 commit comments

Comments
 (0)