Advanced logging library for Electron + React applications with automatic context and environment detection.
- Automatic context detection: Main/Renderer process or Node.js
- Automatic environment detection: Development/Production
- Electron support: IPC transports for inter-process communication
- Log file rotation: Automatic file size and count management
- Colored output: Console color support (development only)
- TypeScript: Full type safety
- Flexible architecture: Transport system for extensibility
If you're working in a monorepo or local development:
# In your main project's package.json
{
"dependencies": {
"@OwlDevHub/Logger": "file:../Logger"
}
}
# Install directly from Git repository
yarn add https://github.com/OwlDevHub/Logger.git
# Or in package.json
{
"dependencies": {
"@OwlDevHub/Logger": "github:OwlDevHub/Logger"
}
}
yarn add @OwlDevHub/Logger
Before using the module, make sure it's built:
cd Logger
yarn install
yarn build
import { logger } from '@OwlDevHub/Logger';
// Simple logging
logger.info('Application started');
logger.warn('Warning message');
logger.error('Error occurred', { errorCode: 500 });
import { createLogger, LogLevel } from '@OwlDevHub/Logger';
const customLogger = createLogger({
level: LogLevel.DEBUG,
enableConsoleColors: true,
});
customLogger.debug('Debug information');
The library automatically detects:
- Execution context:
main
,renderer
ornode
- Environment:
development
orproduction
- Log level:
WARN
for production,DEBUG
for development
import { createLogger, LogLevel, Environment, ExecutionContext } from '@OwlDevHub/Logger';
const logger = createLogger({
level: LogLevel.INFO,
context: ExecutionContext.MAIN,
environment: Environment.PRODUCTION,
enableConsoleColors: false,
enableTimestamp: true,
enableProcessInfo: true,
maxLogFileSize: 10 * 1024 * 1024, // 10MB
maxLogFiles: 5,
});
import { LogLevel } from '@OwlDevHub/Logger';
// From most important to least important
LogLevel.ERROR // 0 - Critical errors
LogLevel.WARN // 1 - Warnings
LogLevel.INFO // 2 - Information
LogLevel.DEBUG // 3 - Debug information
LogLevel.TRACE // 4 - Trace information
import { createConsoleTransport } from '@OwlDevHub/Logger';
const logger = createLogger({
transports: [createConsoleTransport(true)] // true for colors
});
import { createFileTransport } from '@OwlDevHub/Logger';
const fileTransport = createFileTransport({
filePath: './logs/app.log',
maxSize: 10 * 1024 * 1024, // 10MB
maxFiles: 5,
format: 'json', // or 'text'
encoding: 'utf8'
});
const logger = createLogger({
transports: [fileTransport]
});
import { createIpcTransport } from '@OwlDevHub/Logger';
// In renderer process
const ipcTransport = createIpcTransport('logger-channel');
const logger = createLogger({
transports: [ipcTransport]
});
// In main process
import { createMainIpcTransport } from '@OwlDevHub/Logger';
const mainIpcTransport = createMainIpcTransport();
const userLogger = logger.child({ userId: '123', session: 'abc' });
userLogger.info('User performed action', { action: 'login' });
// Output: [INFO] User performed action { userId: '123', session: 'abc', action: 'login' }
# Run tests
yarn test
# Run tests with coverage
yarn test --coverage
# Linting
yarn lint
src/
βββ types.ts # Types and interfaces
βββ utils.ts # Context detection utilities
βββ transports.ts # Logging transports
βββ logger.ts # Main logger class
βββ index.ts # Entry point
βββ __tests__/ # Tests
βββ setup.ts
βββ logger.test.ts
createLogger(config?)
- Create new logger instancegetLogger()
- Get global instanceresetLogger()
- Reset global instance (for testing)
logger.error(message, meta?)
- Log errorslogger.warn(message, meta?)
- Log warningslogger.info(message, meta?)
- Log informationlogger.debug(message, meta?)
- Log debug infologger.trace(message, meta?)
- Log trace infologger.setLevel(level)
- Set log levellogger.getLevel()
- Get current levellogger.addTransport(transport)
- Add transportlogger.child(meta)
- Create child logger
import { createLogger, createFileTransport } from '@OwlDevHub/Logger';
import { app } from 'electron';
import path from 'path';
const logger = createLogger({
context: 'main',
transports: [
createFileTransport({
filePath: path.join(app.getPath('userData'), 'logs', 'main.log'),
maxSize: 5 * 1024 * 1024,
maxFiles: 3
})
]
});
app.on('ready', () => {
logger.info('Electron main process started');
});
import { logger } from '@OwlDevHub/Logger';
import { useEffect } from 'react';
function MyComponent() {
useEffect(() => {
logger.info('Component mounted', { component: 'MyComponent' });
return () => {
logger.debug('Component will unmount');
};
}, []);
const handleClick = () => {
logger.trace('Button clicked', { buttonId: 'submit' });
};
return <button onClick={handleClick}>Click me</button>;
}
import { logger } from '@OwlDevHub/Logger';
async function fetchData() {
try {
const response = await fetch('/api/data');
const data = await response.json();
logger.info('Data fetched successfully', {
url: '/api/data',
dataSize: data.length
});
return data;
} catch (error) {
logger.error('Failed to fetch data', {
url: '/api/data',
error: error.message
});
throw error;
}
}
import { createLogger, LogLevel, Environment, ExecutionContext, createFileTransport, createConsoleTransport } from '@OwlDevHub/Logger';
// Development configuration
const devLogger = createLogger({
level: LogLevel.DEBUG,
context: ExecutionContext.RENDERER,
environment: Environment.DEVELOPMENT,
enableConsoleColors: true,
transports: [
createConsoleTransport(true),
createFileTransport({
filePath: './logs/dev.log',
maxSize: 5 * 1024 * 1024,
maxFiles: 3,
format: 'json'
})
]
});
// Production configuration
const prodLogger = createLogger({
level: LogLevel.WARN,
context: ExecutionContext.MAIN,
environment: Environment.PRODUCTION,
enableConsoleColors: false,
transports: [
createFileTransport({
filePath: './logs/prod.log',
maxSize: 50 * 1024 * 1024,
maxFiles: 10,
format: 'json'
})
]
});
import { Transport, LogLevel } from '@OwlDevHub/Logger';
// Custom transport for external logging service
const externalServiceTransport: Transport = async (level, message, meta, context) => {
try {
await fetch('https://api.logging-service.com/logs', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
level: LogLevel[level],
message,
meta,
context,
timestamp: new Date().toISOString()
})
});
} catch (error) {
console.error('External logging service error:', error);
}
};
const logger = createLogger({
transports: [externalServiceTransport]
});
If you encounter ESM-related errors, make sure:
- Your project has
"type": "module"
in package.json - You're using the correct import syntax
- The module is properly built (
yarn build
in Logger directory)
Make sure your tsconfig.json
includes:
{
"compilerOptions": {
"moduleResolution": "node",
"esModuleInterop": true,
"allowSyntheticDefaultImports": true
}
}
MIT License - see LICENSE file 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
If you have questions or issues, create an issue in the repository or contact the author: night3098games@gmail.com