- π High Performance - Built on top of Pino, one of the fastest JSON loggers
- π¨ Beautiful Output - Clean, readable console logs with customizable formatting
- π§ TypeScript Native - Full TypeScript support with comprehensive type definitions
- π Environment Aware - Different configurations for development, production, and testing
- π Structured Logging - JSON logging with customizable serializers
- π― Context Support - Add request IDs, user IDs, and custom context data
- π Multiple Transports - Console, file, rotating files, and custom transports
- π‘οΈ Security First - Built-in redaction for sensitive information
- π¦ Framework Integration - Seamlessly integrates with HestJS framework
# npm
npm install @hest/logger
# yarn
yarn add @hest/logger
# pnpm
pnpm add @hest/logger
# bun
bun add @hest/logger
import { createLogger, logger } from '@hest/logger';
// Use global logger
logger.info('Hello, World!');
logger.error('Something went wrong!', { error: 'details' });
// Create named logger
const apiLogger = createLogger('API');
apiLogger.info('API server started');
import { HestFactory, logger } from '@hest/core';
async function bootstrap() {
logger.info('π Starting HestJS application...');
const app = await HestFactory.create(AppModule);
logger.info('β
Application ready!');
}
import { createLogger, LogLevel } from '@hest/logger';
const customLogger = createLogger('MyService', {
level: LogLevel.DEBUG,
transport: {
target: 'pino-pretty',
options: {
colorize: true,
translateTime: 'yyyy-mm-dd HH:MM:ss.l',
}
}
});
customLogger.debug('Debug information');
customLogger.info('Service initialized');
customLogger.warn('Warning message');
customLogger.error('Error occurred');
Creates a new logger instance with optional name and configuration.
const logger = createLogger('ServiceName', {
level: LogLevel.INFO,
// ... other options
});
Pre-configured global logger instance.
import { logger } from '@hest/logger';
logger.info('Global log message');
logger.fatal('Fatal error');
logger.error('Error message');
logger.warn('Warning message');
logger.info('Info message');
logger.debug('Debug message');
logger.trace('Trace message');
// Set context for all subsequent logs
logger.setContext({ requestId: '123', userId: 'user456' });
logger.info('User action performed');
// Create child logger with context
const childLogger = logger.child({ module: 'auth' });
childLogger.info('Authentication successful');
The logger automatically adapts based on NODE_ENV
:
- Development: Pretty-printed colored output
- Production: JSON format optimized for log aggregation
- Test: Minimal logging to reduce noise
import { createLogger, LogLevel } from '@hest/logger';
const logger = createLogger('MyApp', {
level: LogLevel.INFO,
redact: ['password', 'token'], // Hide sensitive fields
formatters: {
level: (label, number) => ({ level: number }),
bindings: (bindings) => ({ service: 'MyApp', ...bindings })
},
serializers: {
req: (req) => ({ method: req.method, url: req.url }),
res: (res) => ({ statusCode: res.statusCode })
}
});
[2025-07-27 14:08:19.149] INFO (MyService): User login successful
[2025-07-27 14:08:19.150] ERROR (Auth): Invalid credentials provided
error: "Invalid username or password"
requestId: "req_123456"
{"level":30,"time":1643299699149,"name":"MyService","msg":"User login successful","requestId":"req_123456"}
{"level":50,"time":1643299699150,"name":"Auth","msg":"Invalid credentials provided","err":{"type":"AuthError","message":"Invalid username or password"}}
import { createConsoleTransport } from '@hest/logger';
const transport = createConsoleTransport({
colorize: true,
translateTime: 'yyyy-mm-dd HH:MM:ss.l'
});
import { createFileTransport } from '@hest/logger';
const transport = createFileTransport({
destination: './logs/app.log',
mkdir: true
});
import { createRotatingFileTransport } from '@hest/logger';
const transport = createRotatingFileTransport({
filename: './logs/app-%DATE%.log',
frequency: 'daily',
maxSize: '10M',
maxFiles: '7'
});
const logger = createLogger('SecureApp', {
redact: ['password', 'token', 'authorization', 'cookie']
});
// This will automatically redact sensitive fields
logger.info('User data', {
username: 'john_doe',
password: 'secret123' // This will be redacted
});
All serializers include error handling to prevent logging failures from crashing your application.
import { createLogger, LogLevel } from '@hest/logger';
// Create test logger with minimal output
const testLogger = createLogger('Test', {
level: LogLevel.WARN // Only log warnings and errors in tests
});
- Zero-cost abstractions when logging is disabled
- Fast serialization with Pino's optimized JSON stringification
- Minimal memory footprint with streaming architecture
- Benchmark: Up to 35,000 logs/second in production mode
We welcome contributions! Please see our Contributing Guide for details.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes (
git commit -m 'Add amazing feature'
) - Push to the branch (
git push origin feature/amazing-feature
) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
Built with β€οΈ for the HestJS ecosystem
β Star us on GitHub β’ π Report Bug β’ π‘ Request Feature