Единый слой абстракций логирования для nfjs.
- предоставляет singleton API
getLogger(name)(без доступа через container); - по умолчанию пишет в
consolebackend в стабильном JSON (1 событие = 1 строка); - применяет статическую политику логирования по namespace:
- включение/выключение;
- уровни;
- наследование по префиксу (
project.main.authнаследуетproject.main).
- поддерживает
child-контекст; - поддерживает interceptor pipeline:
- глобальные interceptor'ы (для всех логгеров),
- scoped interceptor'ы (по имени/префиксу логгера);
- поддерживает redaction секретов;
- сериализует
Error(name/message/stack/cause/code + дополнительные поля); - пишет
warn/error/fatalвstderr, остальное вstdout.
{
"@nfjs/logger": {
"console": {
"base": {
"service": "nfjs-demo",
"env": "local"
},
"redact": {
"paths": [
"*.password",
"*.token",
"*.access_token",
"*.refresh_token",
"*.client_secret"
],
"censor": "[REDACTED]",
"remove": false
},
"maxDepth": 8,
"includeStack": true,
"messageKey": "msg",
"loggerKey": "logger_name",
"timeKey": "time",
"levelKey": "level",
"stderrLevels": ["warn", "error", "fatal"]
},
"policy": {
"default": {
"enabled": true,
"level": "info"
},
"rules": {
"project.main": {
"enabled": true,
"level": "debug"
},
"project.main.auth": {
"enabled": true,
"level": "trace"
},
"mdm.import": {
"enabled": false
}
}
}
}
}{
"time": 1772672801000,
"level": "info",
"logger_name": "project.main",
"service": "nfjs-demo",
"env": "local",
"msg": "init started",
"module": "project/main"
}import { getLogger, addGlobalLoggerInterceptor } from '@nfjs/logger';
const logger = getLogger('project.main', {
beforeWrite(ctx) {
return {
meta: {
...(ctx.meta || {}),
source: 'main'
}
};
}
});
logger.info('init started');
const authLogger = logger.scope('auth').child({ module: 'project/main' });
authLogger.debug('token exchange');
addGlobalLoggerInterceptor({
name: 'global-extra',
beforeWrite(ctx) {
return {
meta: {
...(ctx.meta || {}),
app_part: 'backend'
}
};
}
});Модуль поддерживает переключение backend через экземпляр Loggers внутри @nfjs/logger.
Unified logging abstraction layer for nfjs.
- exposes singleton API
getLogger(name)(no container access); - uses
consolebackend by default with stable JSON output (1 event = 1 line); - applies static namespace policy:
- enable/disable;
- level filtering;
- prefix inheritance (
project.main.authinheritsproject.main).
- supports
childcontext; - supports interceptor pipeline:
- global interceptors (for all loggers),
- scoped interceptors (by logger name/prefix);
- supports secret redaction;
- serializes
Errorconsistently (name/message/stack/cause/code + extra fields); - writes
warn/error/fataltostderr, other levels tostdout.
{
"@nfjs/logger": {
"console": {
"base": {
"service": "nfjs-demo",
"env": "local"
},
"redact": {
"paths": [
"*.password",
"*.token",
"*.access_token",
"*.refresh_token",
"*.client_secret"
],
"censor": "[REDACTED]",
"remove": false
},
"maxDepth": 8,
"includeStack": true,
"messageKey": "msg",
"loggerKey": "logger_name",
"timeKey": "time",
"levelKey": "level",
"stderrLevels": ["warn", "error", "fatal"]
},
"policy": {
"default": {
"enabled": true,
"level": "info"
},
"rules": {
"project.main": {
"enabled": true,
"level": "debug"
},
"project.main.auth": {
"enabled": true,
"level": "trace"
},
"mdm.import": {
"enabled": false
}
}
}
}
}{
"time": 1772672801000,
"level": "info",
"logger_name": "project.main",
"service": "nfjs-demo",
"env": "local",
"msg": "init started",
"module": "project/main"
}import { getLogger, addGlobalLoggerInterceptor } from '@nfjs/logger';
const logger = getLogger('project.main', {
beforeWrite(ctx) {
return {
meta: {
...(ctx.meta || {}),
source: 'main'
}
};
}
});
logger.info('init started');
const authLogger = logger.scope('auth').child({ module: 'project/main' });
authLogger.debug('token exchange');
addGlobalLoggerInterceptor({
name: 'global-extra',
beforeWrite(ctx) {
return {
meta: {
...(ctx.meta || {}),
app_part: 'backend'
}
};
}
});Backend can be switched through the internal Loggers instance in @nfjs/logger.