Hackable console logger for Node.js applications with 17 out-of-the-box logger types and advanced features including integrated timers, scoped loggers, secrets filtering, and custom pluggable loggers.
—
Global and instance-level configuration options for customizing logger behavior, appearance, and output format. Signale provides flexible configuration through package.json global settings and per-instance options.
Configure individual Signale instances with runtime settings.
/**
* Update the configuration of a Signale instance
* @param settingsObj - Configuration options object
*/
function config(settingsObj: ConfigOptions): void;
/**
* Get the current package.json configuration
*/
readonly packageConfiguration: object;
interface ConfigOptions {
displayScope?: boolean; // Show scope names in output (default: true)
displayBadge?: boolean; // Show logger badges/icons (default: true)
displayDate?: boolean; // Show date in output (default: false)
displayFilename?: boolean; // Show calling filename (default: false)
displayLabel?: boolean; // Show logger labels (default: true)
displayTimestamp?: boolean; // Show timestamp in output (default: false)
underlineLabel?: boolean; // Underline logger labels (default: true)
underlineMessage?: boolean; // Underline log messages (default: false)
underlinePrefix?: boolean; // Underline message prefixes (default: false)
underlineSuffix?: boolean; // Underline message suffixes (default: false)
uppercaseLabel?: boolean; // Display labels in uppercase (default: false)
}Configure Signale globally through package.json settings.
package.json Configuration:
{
"signale": {
"displayScope": true,
"displayBadge": true,
"displayDate": false,
"displayFilename": false,
"displayLabel": true,
"displayTimestamp": false,
"underlineLabel": true,
"underlineMessage": false,
"underlinePrefix": false,
"underlineSuffix": false,
"uppercaseLabel": false
}
}Change configuration settings at runtime for existing instances.
Usage Examples:
const signale = require('signale');
// Default appearance
signale.success('Default configuration');
// Output: ✔ success Default configuration
// Update configuration
signale.config({
displayTimestamp: true,
displayDate: true,
displayFilename: true,
uppercaseLabel: true
});
signale.success('Updated configuration');
// Output: [2023-12-07] [14:30:25] [index.js] › ✔ SUCCESS Updated configuration
// Multiple configuration changes
signale.config({
underlineMessage: true,
underlineLabel: true,
displayBadge: false
});
signale.info('Styled message');
// Output: [2023-12-07] [14:30:26] [index.js] › INFO Styled message
// (with underlines applied)Set configuration when creating new Signale instances.
Usage Examples:
const { Signale } = require('signale');
// Instance with custom configuration
const styledLogger = new Signale({
config: {
displayDate: true,
displayTimestamp: true,
uppercaseLabel: true,
underlineMessage: true
}
});
styledLogger.info('Custom styled logger');
// Output: [2023-12-07] [14:30:25] › ℹ INFO Custom styled logger (underlined)
// Minimal configuration
const minimalLogger = new Signale({
config: {
displayBadge: false,
displayLabel: false
}
});
minimalLogger.success('Minimal output');
// Output: Minimal output (no badge or label)Control what elements appear in log output.
Usage Examples:
const { Signale } = require('signale');
// Show all available metadata
const verboseLogger = new Signale({
config: {
displayScope: true,
displayBadge: true,
displayDate: true,
displayFilename: true,
displayLabel: true,
displayTimestamp: true
}
});
const scoped = verboseLogger.scope('app', 'module');
scoped.info('Verbose logging enabled');
// Output: [2023-12-07] [14:30:25] [config-example.js] [app] [module] › ℹ info Verbose logging enabled
// Hide all metadata
const cleanLogger = new Signale({
config: {
displayScope: false,
displayBadge: false,
displayDate: false,
displayFilename: false,
displayLabel: false,
displayTimestamp: false
}
});
cleanLogger.error('Clean output');
// Output: Clean output (no decorations)Control text styling and formatting.
Usage Examples:
const { Signale } = require('signale');
// Underline everything
const underlinedLogger = new Signale({
config: {
underlineLabel: true,
underlineMessage: true,
underlinePrefix: true,
underlineSuffix: true
}
});
underlinedLogger.success({
prefix: '[deploy]',
message: 'Application deployed successfully',
suffix: '(v1.2.0)'
});
// Output: [deploy] ✔ success Application deployed successfully (v1.2.0)
// (with underlines applied to label, message, prefix, and suffix)
// Uppercase labels
const uppercaseLogger = new Signale({
config: {
uppercaseLabel: true
}
});
uppercaseLogger.warn('Uppercase labels enabled');
// Output: ⚠ WARNING Uppercase labels enabledConfiguration inheritance patterns with scoped loggers.
Usage Examples:
const { Signale } = require('signale');
// Parent with configuration
const parent = new Signale({
config: {
displayTimestamp: true,
uppercaseLabel: true
}
});
// Scoped logger inherits configuration
const child = parent.scope('module');
parent.info('Parent logger');
// Output: [14:30:25] › ℹ INFO Parent logger
child.success('Child logger');
// Output: [14:30:25] [module] › ✔ SUCCESS Child logger
// Override configuration in child
child.config({
displayTimestamp: false,
displayDate: true
});
child.warn('Modified child logger');
// Output: [2023-12-07] [module] › ⚠ WARNING Modified child loggerControl filename and time information display.
Usage Examples:
// config-demo.js
const { Signale } = require('signale');
const timestampLogger = new Signale({
config: {
displayDate: true,
displayTimestamp: true,
displayFilename: true
}
});
timestampLogger.info('Time and file information');
// Output: [2023-12-07] [14:30:25] [config-demo.js] › ℹ info Time and file information
// Date only
const dateLogger = new Signale({
config: {
displayDate: true,
displayTimestamp: false,
displayFilename: false
}
});
dateLogger.success('Date only');
// Output: [2023-12-07] › ✔ success Date only
// Filename only
const fileLogger = new Signale({
config: {
displayDate: false,
displayTimestamp: false,
displayFilename: true
}
});
fileLogger.warn('Filename only');
// Output: [config-demo.js] › ⚠ warning Filename onlySignale handles invalid configuration gracefully.
Usage Examples:
const { Signale } = require('signale');
// Invalid options are ignored
const logger = new Signale({
config: {
displayBadge: true,
invalidOption: 'ignored', // This will be ignored
displayLabel: 'not-boolean', // This will be ignored
displayScope: true // This will be applied
}
});
logger.info('Configuration with invalid options');
// Output: [scope] › ℹ info Configuration with invalid options (works normally)
// Null/undefined config is handled safely
const safeLogger = new Signale({
config: null // No error thrown
});
safeLogger.success('Safe configuration');
// Output: ✔ success Safe configuration (uses defaults)Change configuration multiple times during runtime.
Usage Examples:
const signale = require('signale');
// Start with default configuration
signale.info('Default style');
// Output: ℹ info Default style
// Switch to verbose mode
signale.config({
displayDate: true,
displayTimestamp: true,
displayFilename: true
});
signale.info('Verbose mode');
// Output: [2023-12-07] [14:30:25] [dynamic-config.js] › ℹ info Verbose mode
// Switch to minimal mode
signale.config({
displayDate: false,
displayTimestamp: false,
displayFilename: false,
displayBadge: false,
displayLabel: false
});
signale.info('Minimal mode');
// Output: Minimal mode
// Back to styled mode
signale.config({
displayBadge: true,
displayLabel: true,
uppercaseLabel: true,
underlineMessage: true
});
signale.success('Styled mode');
// Output: ✔ SUCCESS Styled mode (with underline)Install with Tessl CLI
npx tessl i tessl/npm-signale