Pluggable, config-driven logging for the @alt-javascript framework. Provides a category-based logger with configurable levels per category, multiple output backends, and a caching variant for test fixtures.
Inspired by SLF4J + Logback — the same LoggerFactory.getLogger(category) API used throughout the Spring ecosystem.
Part of the @alt-javascript monorepo.
npm install @alt-javascript/loggerimport { LoggerFactory } from '@alt-javascript/logger';
import { Boot } from '@alt-javascript/boot';
import { EphemeralConfig } from '@alt-javascript/config';
const config = new EphemeralConfig({
logging: {
level: {
ROOT: 'info',
'com.myapp.service': 'debug', // category-specific level
},
},
});
Boot.boot({ config });
const logger = LoggerFactory.getLogger('com.myapp.service');
logger.debug('Detailed message'); // logged — category level is debug
logger.info('Normal message'); // logged
logger.warn('Warning message'); // logged
logger.verbose('Very detailed'); // not logged — below debugLevels from most to least verbose: silly → verbose → debug → info → warn → error.
Configure per category hierarchy — com.myapp applies to all loggers whose name starts with com.myapp:
{
"logging": {
"level": {
"ROOT": "warn",
"com.myapp": "info",
"com.myapp.repository": "debug"
}
}
}In CDI components, declare this.logger = null and it is autowired automatically:
class OrderService {
constructor() {
this.logger = null; // autowired — category defaults to the component name
}
processOrder(id) {
this.logger.info(`Processing order ${id}`);
}
}| Backend | How to configure |
|---|---|
| Console (default) | No configuration needed |
| Winston | Boot.boot({ loggerFactory: new WinstonLoggerFactory(winston) }) |
| Multi | Boot.boot({ loggerFactory: new MultiLoggerFactory([...]) }) |
| Caching (test) | Boot.test({ config }) — suppresses output, stores log calls for assertion |
Boot.test() installs CachingLoggerFactory, which stores log calls without printing them:
// test/fixtures/index.js
import { Boot } from '@alt-javascript/boot';
import config from 'config';
Boot.test({ config });| SLF4J / Logback concept | @alt-javascript/logger equivalent |
|---|---|
LoggerFactory.getLogger(Class) |
LoggerFactory.getLogger('category.name') |
| Logger hierarchy (parent categories) | Category-prefix matching in config |
Logger.debug(), .info(), .warn(), .error() |
Same method names |
Log level configuration in logback.xml |
logging.level.* in config |
@Slf4j field injection (Lombok) |
this.logger = null CDI autowiring |
MIT