@sanjay-sde/cap-js-log-control
v0.3.0
Published
CAP plugin for controlling CDS logger verbosity and OpenTelemetry DiagLogger noise — reduce log clutter, surface real errors
Maintainers
Readme
cap-js-log-control
CAP plugin for controlling CDS logger verbosity and OpenTelemetry DiagLogger noise — reduce log clutter, surface real errors.
Problem
SAP CAP applications on Cloud Foundry generate excessive log noise that buries real errors:
odatalogger — logs every incoming OData request with full HTTP headers JSON blobsremotelogger — logs every outgoing remote service call with full headers- OpenTelemetry DiagLogger —
@cap-js/telemetryOTLP gRPC exporters emit diagnostic logs that bypasscds.logentirely
Before:
STDOUT {"level":"info","logger":"odata","msg":"POST /assets/$batch",...<3KB of headers>}
STDOUT {"level":"debug","logger":"remote","msg":"GET <api>/... Executing via @sap-cloud-sdk",...}
STDERR ExporterError: Export... failed [repeated 50x from OTel gRPC]
STDERR Error: The request has no query ← REAL error, buriedAfter:
STDERR Error: The request has no query ← now visible immediatelyInstallation
npm install cap-js-log-controlCAP auto-discovers the plugin via cds-plugin.js — no code changes needed.
Configuration
Quick Start (zero config)
The plugin works out of the box with sensible defaults:
odata→warnremote→warntelemetry→warn- OpenTelemetry DiagLogger →
ERROR
Plugin Config (cds.logControl)
Add to package.json or .cdsrc.json:
{
"cds": {
"logControl": {
"enabled": true,
"otelDiagLevel": "ERROR",
"levels": {
"odata": "warn",
"remote": "warn",
"telemetry": "warn"
}
}
}
}Native CDS Log Levels (also supported)
You can also use the standard CDS log.levels format — the plugin reads both:
{
"cds": {
"[development]": {
"log": {
"levels": {
"odata": "error",
"remote": "error"
}
}
}
}
}Priority:
cds.logControl.levelsoverridescds.log.levelswhen both are set for the same logger.
Per-Profile Overrides
Use CAP profiles to tune log levels per environment:
{
"cds": {
"logControl": {
"enabled": true,
"levels": {
"odata": "warn",
"remote": "warn"
}
},
"[development]": {
"logControl": {
"levels": {
"odata": "error",
"remote": "error"
}
}
},
"[production]": {
"logControl": {
"otelDiagLevel": "WARN"
}
}
}
}Disable the Plugin
{
"cds": {
"logControl": {
"enabled": false
}
}
}Config Reference
| Option | Type | Default | Description |
|--------|------|---------|-------------|
| logControl.enabled | boolean | true | Master switch — set false to disable all log control |
| logControl.levels | Record<string, string> | { odata: 'warn', remote: 'warn', telemetry: 'warn' } | Map of CDS logger names to log levels |
| logControl.otelDiagLevel | string | 'ERROR' | OpenTelemetry DiagLogger level |
CDS Log Levels
silent | error | warn | info | debug | verbose | silly
OTel DiagLogger Levels
NONE | ERROR | WARN | INFO | DEBUG | VERBOSE | ALL
How It Works
- Runs at module load time — not inside a lifecycle hook — because logger noise starts during CDS bootstrap before
cds.once('served')fires. - Controls CDS loggers — calls
cds.log(name).setLevel(level)for each configured logger. - Controls OTel DiagLogger — sets
diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.ERROR)to suppress OTLP exporter retry chatter. - Does NOT redirect stdout/stderr — all logs still flow to CF Loggregator for cloud logging.
- Does NOT patch
console.log— only reduces log generation at the source.
What This Plugin Does NOT Do
- Does NOT redirect or wrap
process.stdout/process.stderr - Does NOT patch
console.log/console.error - Does NOT affect cloud logging — all generated logs still flow to CF Loggregator
- Does NOT disable
@cap-js/telemetryor OTLP exporters — only reduces their diagnostic output
Development
npm install
npm run build
npm test