@sentry/core
Version:
Base implementation for all Sentry JavaScript SDKs
173 lines (150 loc) • 4.89 kB
JavaScript
import { getClient } from '../currentScopes.js';
import { _INTERNAL_captureLog } from '../logs/internal.js';
import { formatConsoleArgs } from '../logs/utils.js';
/**
* Options for the Sentry Consola reporter.
*/
const DEFAULT_CAPTURED_LEVELS = ['trace', 'debug', 'info', 'warn', 'error', 'fatal'];
/**
* Creates a new Sentry reporter for Consola that forwards logs to Sentry. Requires the `enableLogs` option to be enabled.
*
* **Note: This integration supports Consola v3.x only.** The reporter interface and log object structure
* may differ in other versions of Consola.
*
* @param options - Configuration options for the reporter.
* @returns A Consola reporter that can be added to consola instances.
*
* @example
* ```ts
* import * as Sentry from '@sentry/node';
* import { consola } from 'consola';
*
* Sentry.init({
* enableLogs: true,
* });
*
* const sentryReporter = Sentry.createConsolaReporter({
* // Optional: filter levels to capture
* levels: ['error', 'warn', 'info'],
* });
*
* consola.addReporter(sentryReporter);
*
* // Now consola logs will be captured by Sentry
* consola.info('This will be sent to Sentry');
* consola.error('This error will also be sent to Sentry');
* ```
*/
function createConsolaReporter(options = {}) {
const levels = new Set(options.levels ?? DEFAULT_CAPTURED_LEVELS);
const providedClient = options.client;
return {
log(logObj) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const { type, level, message: consolaMessage, args, tag, date: _date, ...attributes } = logObj;
// Get client - use provided client or current client
const client = providedClient || getClient();
if (!client) {
return;
}
// Determine the log severity level
const logSeverityLevel = getLogSeverityLevel(type, level);
// Early exit if this level should not be captured
if (!levels.has(logSeverityLevel)) {
return;
}
const { normalizeDepth = 3, normalizeMaxBreadth = 1000 } = client.getOptions();
// Format the log message using the same approach as consola's basic reporter
const messageParts = [];
if (consolaMessage) {
messageParts.push(consolaMessage);
}
if (args && args.length > 0) {
messageParts.push(formatConsoleArgs(args, normalizeDepth, normalizeMaxBreadth));
}
const message = messageParts.join(' ');
// Build attributes
attributes['sentry.origin'] = 'auto.log.consola';
if (tag) {
attributes['consola.tag'] = tag;
}
if (type) {
attributes['consola.type'] = type;
}
// Only add level if it's a valid number (not null/undefined)
if (level != null && typeof level === 'number') {
attributes['consola.level'] = level;
}
_INTERNAL_captureLog({
level: logSeverityLevel,
message,
attributes,
});
},
};
}
// Mapping from consola log types to Sentry log severity levels
const CONSOLA_TYPE_TO_LOG_SEVERITY_LEVEL_MAP = {
// Consola built-in types
silent: 'trace',
fatal: 'fatal',
error: 'error',
warn: 'warn',
log: 'info',
info: 'info',
success: 'info',
fail: 'error',
ready: 'info',
start: 'info',
box: 'info',
debug: 'debug',
trace: 'trace',
verbose: 'debug',
// Custom types that might exist
critical: 'fatal',
notice: 'info',
};
// Mapping from consola log levels (numbers) to Sentry log severity levels
const CONSOLA_LEVEL_TO_LOG_SEVERITY_LEVEL_MAP = {
0: 'fatal', // Fatal and Error
1: 'warn', // Warnings
2: 'info', // Normal logs
3: 'info', // Informational logs, success, fail, ready, start, ...
4: 'debug', // Debug logs
5: 'trace', // Trace logs
};
/**
* Determines the log severity level from Consola type and level.
*
* @param type - The Consola log type (e.g., 'error', 'warn', 'info')
* @param level - The Consola numeric log level (0-5) or null for some types like 'verbose'
* @returns The corresponding Sentry log severity level
*/
function getLogSeverityLevel(type, level) {
// Handle special case for verbose logs (level can be null with infinite level in Consola)
if (type === 'verbose') {
return 'debug';
}
// Handle silent logs - these should be at trace level
if (type === 'silent') {
return 'trace';
}
// First try to map by type (more specific)
if (type) {
const mappedLevel = CONSOLA_TYPE_TO_LOG_SEVERITY_LEVEL_MAP[type];
if (mappedLevel) {
return mappedLevel;
}
}
// Fallback to level mapping (handle null level)
if (typeof level === 'number') {
const mappedLevel = CONSOLA_LEVEL_TO_LOG_SEVERITY_LEVEL_MAP[level];
if (mappedLevel) {
return mappedLevel;
}
}
// Default fallback
return 'info';
}
export { createConsolaReporter };
//# sourceMappingURL=consola.js.map