π A modern structured logging library with functional programming, duck-typing, and comprehensive third-party integrations
Strogger is a modern, developer-friendly structured logging library built with functional programming principles, dependency injection, and duck-typing for maximum flexibility and extensibility.
This library is built around the principle that all logs should be structured data. Every log entry is automatically formatted as structured JSON with a consistent schema, making logs easy to parse, search, and analyze.
- π Searchable: JSON format enables powerful log searching and filtering
- π Analyzable: Structured data can be easily aggregated and analyzed
- π Correlatable: Consistent schema enables correlation across services
- π€ Machine-readable: Perfect for log aggregation systems and monitoring tools
- π Scalable: Efficient parsing and storage in modern logging systems
- π Structured JSON Logging - All logs automatically formatted as structured JSON with consistent schema
- π Functional Programming - Pure functions with dependency injection and duck-typing
- π Multiple Transports - Console, DataDog, Splunk, Elasticsearch, New Relic, CloudWatch, File
- π Environment-aware - Automatic configuration based on environment variables
- π TypeScript Support - Full TypeScript support with comprehensive type definitions
- β‘ AWS Lambda Optimized - Designed to work seamlessly in AWS Lambda environments
- π§ Extensible - Easy to add custom transports and formatters using duck-typing
- π Performance Monitoring - Built-in performance tracking and metrics
- π‘οΈ Comprehensive Error Handling - Clear, actionable error messages with solutions
- π Advanced Features - Log filtering, validation, redaction, sampling, rate limiting, enrichment, and batching
- π Security - Built-in support for forbidden keys filtering and redaction
- π Correlation Tracking - Distributed tracing support
npm install strogger
import { strogger } from 'strogger';
// Simple logging
strogger.info('Application started');
strogger.debug('Processing request', { requestId: '123' });
strogger.warn('Deprecated feature used');
strogger.error('Something went wrong', { userId: '456' }, new Error('Database connection failed'));
import {
createLogger,
createConsoleTransport,
createJsonFormatter,
getEnvironment,
LogLevel
} from 'strogger';
// Get environment configuration
const env = getEnvironment();
// Create dependencies
const formatter = createJsonFormatter();
const transport = createConsoleTransport({
formatter,
level: LogLevel.DEBUG
});
// Create logger with dependency injection
const logger = createLogger({
config: {
serviceName: 'my-service',
stage: 'dev'
},
transports: [transport],
formatter,
env,
});
// Use the logger
logger.info('Application started with functional approach');
Method | Install Command | Import Statement | Best For |
---|---|---|---|
NPM | npm install strogger |
import { strogger } from 'strogger' |
Production projects |
Yarn | yarn add strogger |
import { strogger } from 'strogger' |
Yarn-based projects |
PNPM | pnpm add strogger |
import { strogger } from 'strogger' |
PNPM-based projects |
Strogger provides both conventional and branded function names:
// Conventional approach (recommended for most users)
import { createLogger, createConsoleTransport } from 'strogger';
// Branded approach (for brand consistency)
import { createStrogger, createStroggerConsoleTransport } from 'strogger';
// Both work identically:
const logger = createLogger({...});
const strogger = createStrogger({...});
// Logger creation
createLogger(config)
createStrogger(config)
// Transport creation
createConsoleTransport(options)
createStroggerConsoleTransport(options)
createCloudWatchTransport(options)
createDataDogTransport(options)
createSplunkTransport(options)
createElasticsearchTransport(options)
createNewRelicTransport(options)
createFileTransport(options)
// Formatter creation
createJsonFormatter(options)
// Environment utilities
getEnvironment()
getEnvironmentVariables()
import { LogLevel } from 'strogger';
// Available levels
LogLevel.DEBUG // 0
LogLevel.INFO // 1
LogLevel.WARN // 2
LogLevel.ERROR // 3
LogLevel.FATAL // 4
import { createConsoleTransport, createJsonFormatter } from 'strogger';
const formatter = createJsonFormatter();
const transport = createConsoleTransport({
formatter,
level: LogLevel.DEBUG,
useColors: true
});
import { createCloudWatchTransport, createJsonFormatter } from 'strogger';
const formatter = createJsonFormatter();
const transport = createCloudWatchTransport({
formatter,
logGroupName: '/aws/lambda/my-function',
logStreamName: 'production',
region: 'us-east-1'
});
import { createDataDogTransport, createJsonFormatter } from 'strogger';
const formatter = createJsonFormatter();
const transport = createDataDogTransport({
formatter,
apiKey: process.env.DATADOG_API_KEY,
service: 'my-service',
source: 'nodejs'
});
import { strogger } from 'strogger';
// Function lifecycle logging
strogger.logFunctionStart('processOrder', { orderId: 'order-123' });
// ... function logic ...
strogger.logFunctionEnd('processOrder', 150, { orderId: 'order-123' });
// Database operations
strogger.logDatabaseOperation('SELECT', 'users', { table: 'users' });
// API requests
strogger.logApiRequest('POST', '/api/orders', 201, { orderId: 'order-123' });
The logger automatically configures itself based on environment variables:
# Log level (DEBUG, INFO, WARN, ERROR, FATAL)
LOG_LEVEL=INFO
# Environment stage
STAGE=dev
# Service name
SERVICE_NAME=my-service
# Enable structured logging (default: true)
ENABLE_STRUCTURED_LOGGING=true
# Third-party integrations
DATADOG_API_KEY=your-datadog-api-key
SPLUNK_HEC_URL=https://your-splunk-instance:8088/services/collector
SPLUNK_HEC_TOKEN=your-splunk-hec-token
ELASTICSEARCH_URL=http://localhost:9200
ELASTICSEARCH_API_KEY=your-elasticsearch-api-key
NEW_RELIC_LICENSE_KEY=your-newrelic-license-key
NEW_RELIC_ACCOUNT_ID=your-newrelic-account-id
import {
createLogger,
LogLevel,
createConsoleTransport,
createJsonFormatter,
getEnvironment
} from 'strogger';
const env = getEnvironment();
const formatter = createJsonFormatter();
const transport = createConsoleTransport({
formatter,
useColors: false
});
const customLogger = createLogger({
config: {
level: LogLevel.DEBUG,
serviceName: 'my-service',
stage: 'production',
enableStructuredLogging: true
},
transports: [transport],
formatter,
env
});
Strogger provides built-in support for popular logging and monitoring services:
- Automatic log group and stream management
- Lambda-optimized with minimal cold start impact
- Batch logging for cost efficiency
- Structured JSON logs with automatic parsing
- Service and source tagging
- Performance metrics integration
- HEC (HTTP Event Collector) support
- Structured data with source types
- Index management and routing
- Direct indexing with bulk operations
- Mapping templates for optimal search
- Cluster health monitoring
- Distributed tracing integration
- Custom attributes and metrics
- Error tracking and alerting
- Rotating log files with compression
- Size and time-based rotation
- Structured JSON output
// β
Good - Structured data
strogger.info('User login successful', {
userId: '123',
method: 'oauth',
provider: 'google'
});
// β Avoid - Unstructured strings
strogger.info('User 123 logged in via Google OAuth');
const context = {
requestId: 'req-123',
userId: 'user-456',
sessionId: 'sess-789'
};
strogger.info('Processing payment', context, {
amount: 100.50,
currency: 'USD'
});
// DEBUG - Detailed information for debugging
strogger.debug('Database query executed', { query: 'SELECT * FROM users' });
// INFO - General application flow
strogger.info('User registration completed', { userId: '123' });
// WARN - Potentially harmful situations
strogger.warn('Deprecated API endpoint called', { endpoint: '/api/v1/users' });
// ERROR - Error events that might still allow the application to continue
strogger.error('Database connection failed', { retryCount: 3 });
// FATAL - Very severe error events that will presumably lead to application failure
strogger.fatal('Application cannot start due to missing configuration');
try {
const result = await processPayment(paymentData);
strogger.info('Payment processed successfully', {
paymentId: result.id,
amount: paymentData.amount
});
} catch (error) {
strogger.error('Payment processing failed', {
paymentId: paymentData.id,
error: error.message
}, error);
}
We welcome contributions! Please see our Contributing Guide for details.
# Clone the repository
git clone https://github.com/TheLeePriest/strogger.git
cd strogger
# Install dependencies
npm install
# Run tests
npm test
# Run linting
npm run lint
# Build the project
npm run build
This project is licensed under the MIT License - see the LICENSE file for details.
- Documentation: GitHub README
- Issues: GitHub Issues
- NPM Package: strogger on NPM
- Changelog: CHANGELOG.md
Made with β€οΈ by the Strogger Team
Strogger supports several environment variables for configuration. All are optionalβsensible defaults are provided for a smooth developer experience.
Variable | Default | Description |
---|---|---|
LOG_LEVEL |
DEBUG (dev/test), INFO (prod) |
Minimum log level (DEBUG , INFO , WARN , ERROR , FATAL ) |
STAGE |
dev |
Environment stage (dev , prod , test ) |
SERVICE_NAME |
(none) | Name of the service/application |
ENABLE_STRUCTURED_LOGGING |
true |
Output logs as structured JSON (true /false ) |
You do not need to set any environment variables to use strogger. Defaults are chosen for a smooth developer experience.
You can set environment variables in your shell or .env
file:
export LOG_LEVEL=INFO
export STAGE=prod
export SERVICE_NAME=my-service
export ENABLE_STRUCTURED_LOGGING=true
If you do not set any variables, strogger will use the defaults above.