mcpField
B
b2c-logs

b2c-logs

github.com/salesforcecommercecloudCloud & DevOps5799 installsUpdated today
Repository

About b2c-logs

A skill for retrieving and monitoring logs from Salesforce B2C Commerce instances with the `b2c` CLI. It supports agent-friendly structured output, targeted filters, and discovery of custom and nested-directory logs.

Key features

  1. 01Retrieve logs as JSON
  2. 02Filter by time, level, and text
  3. 03List and tail log files
  4. 04Discover custom logger files
  5. 05Search logs in subdirectories

Use cases

  1. 01Inspecting recent application errors
  2. 02Finding payment or integration log entries
  3. 03Monitoring logs during an incident

MCP support

The skill notes that the same log operations are available through equivalent MCP tools. It also describes how to use `b2c-cli:b2c-webdav` to download full log files.

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/salesforcecommercecloud/b2c-developer-tooling --skill b2c-logs

After installing, type/b2c-logsin Claude Code to confirm it loaded.

Bundled filesevals/trigger-evals.json

Details

From the project README

B2C Logs Skill

Use the b2c CLI to retrieve and monitor log files on Salesforce B2C Commerce instances. The logs get command is designed for agent-friendly, non-interactive log retrieval with structured JSON output.

Tip: If b2c is not installed globally, use npx @salesforce/b2c-cli instead (e.g., npx @salesforce/b2c-cli logs get).

Configuration & Authentication

The CLI auto-discovers the target instance and credentials from SFCC_* environment variables (including project .env), the selected project-local or shared dw.json, and configuration plugins. package.json supplies only non-sensitive defaults. Flags like --server, --client-id, --client-secret, --username, and --password are usually unnecessary — only pass them to override what's auto-detected.

With only a server configured, the first command opens a browser for the user to sign in with their Account Manager account and waits until they do; tell the user to finish signing in. Their Business Manager roles decide access, and a 403 names the missing permission (for example WebDAV_Manage_Customization for Cartridges).

Run b2c setup inspect to see the resolved configuration and which source provided each value (use --json for scripting; secrets stay masked by default). For precedence rules and troubleshooting, see the b2c-cli:b2c-config skill.

Agent-Friendly Log Retrieval

The logs get command is optimized for coding agents:

  • Exits immediately after retrieving logs (non-interactive)
  • Supports --json for structured output
  • Filters by time, level, and text search
  • Auto-normalizes file paths for IDE click-to-open

Examples

Get Recent Logs
# Get last 20 entries from error and customerror logs (default)
b2c logs get

# Get last 50 entries
b2c logs get --count 50

# JSON output for programmatic parsing
b2c logs get --json
Filter by Time
# Entries from the last 5 minutes
b2c logs get --since 5m

# Entries from the last 1 hour
b2c logs get --since 1h

# Entries from the last 2 days
b2c logs get --since 2d

# Entries after a specific time (ISO 8601)
b2c logs get --since "2026-01-25T10:00:00"
Filter by Log Level
# Only ERROR level entries
b2c logs get --level ERROR

# ERROR and FATAL entries
b2c logs get --level ERROR --level FATAL
Search Text
# Search for "OrderMgr" in messages
b2c logs get --search OrderMgr

# Search for payment errors
b2c logs get --search "PaymentProcessor"
Combined Filters
# Recent errors containing "PaymentProcessor"
b2c logs get --since 1h --level ERROR --search "PaymentProcessor" --json

# Last hour of errors and fatals from specific log types
b2c logs get --filter error --filter warn --since 1h --level ERROR --level FATAL
List Available Log Files
# List all log files
b2c logs list

# List specific log types
b2c logs list --filter error --filter customerror

# List logs in a subdirectory (path-like filter)
b2c logs list --filter internal/server

# JSON output
b2c logs list --json
Real-Time Tailing (Human Use)

For interactive log monitoring (not for agents):

# Tail error and customerror logs
b2c logs tail

# Tail specific log types
b2c logs tail --filter debug --filter error

# Tail only ERROR and FATAL level entries
b2c logs tail --level ERROR --level FATAL

# Tail with text search
b2c logs tail --search "PaymentProcessor"

# Combined filtering
b2c logs tail --filter customerror --level ERROR --search "OrderMgr"

# Stop with Ctrl+C

Downloading Full Log Files

To download the complete log file, use the file field from the JSON output with b2c-cli:b2c-webdav:

b2c webdav get error-odspod-0-appserver-20260126.log --root=logs -o -

JSON Output Structure

When using --json, logs get returns:

{
  "count": 1,
  "entries": [
    {
      "file": "error-odspod-0-appserver-20260126.log",
      "timestamp": "2026-01-26 04:38:03.022 GMT",
      "level": "ERROR",
      "message": "PipelineCallServlet|156679877|Sites-Site|...",
      "raw": "[2026-01-26 04:38:03.022 GMT] ERROR PipelineCallServlet|..."
    }
  ]
}
FieldDescription
fileSource log file name (use with b2c-cli:b2c-webdav to download full file)
levelLog level: ERROR, WARN, INFO, DEBUG, FATAL, TRACE
timestampEntry timestamp
messageLog message (paths normalized for IDE click-to-open)
rawRaw unprocessed log line

Log Types

Common log file prefixes:

PrefixDescription
errorSystem errors
customerrorCustom script errors (Logger.error())
warnWarnings
debugDebug output (when enabled)
infoInformational messages
jobsJob execution logs
apiAPI problems and violations
deprecationDeprecated API usage
quotaQuota warnings

The prefixes above are the built-in log files. In addition, any script that logs through a custom logger category writes to its own dedicated file with a custom- prefix — distinct from customerror. Integration and job code (payment gateways, ERP/OMS/CRM syncs, feed and import jobs) almost always logs this way, so the entry you need for a triage is frequently in a custom-* file, not in error/customerror.

Custom log file names follow this pattern:

custom-<prefix>-<hostname>-appserver-<date>.log

The <prefix> segment is the first argument passed to Logger.getLogger(prefix, category) in the emitting code, so it maps a log file straight back to the code that wrote it:

CodeLog fileFilter to read it
Logger.getLogger('PaymentProcessor', 'payment')custom-PaymentProcessor-*.log--filter custom-PaymentProcessor
Logger.getLogger('PimTaxImport', 'tax')custom-PimTaxImport-*.log--filter custom-PimTaxImport
Logger.getLogger('orderexport', 'export')custom-orderexport-*.log--filter custom-orderexport

(The second argument is the log category, used for configuration; it does not appear in the file name.) For the authoring side — how to create these loggers — see the b2c:b2c-logging skill.

Note: --filter does a prefix (starts-with) match on a file's log category, not an exact match — so --filter custom- sweeps every custom-* file, and --filter custom-Payment also matches custom-PaymentProcessor. The filter also matches the start of the file name. The category stops at the second dash, so a file named custom-payment-gateway-*.log has the category custom-payment, but --filter custom-payment-gateway still selects it by file name. To read one specific custom log, filter on its logger name (e.g. --filter custom-PimTaxImport); to sweep them all, use --filter custom-. --filter replaces the default error/customerror set rather than adding to it, and when b2c logs get finds no entries it lists the custom-* logs that exist.

Discovering Custom Log Files

Because custom log files are not covered by the default error/customerror retrieval, discover them explicitly when investigating an integration or job:

# 1. Enumerate all log files, or narrow to just custom ones
b2c logs list
b2c logs list --filter custom

# 2. Scan the output for an unfamiliar custom-* prefix whose size or
#    last-modified time grew when the incident started, then read it
b2c logs get --filter custom-PimTaxImport --since 1h

# 3. Read all custom logs at once when you don't yet know the prefix
b2c logs get --filter custom-

b2c logs list reports each file with its size and last-modified timestamp, which is the fastest way to spot the custom logger that lit up during an incident. Once you have the prefix, --filter custom-<prefix> (or a bare --filter custom- to sweep them all) reads the entries.

If logs list output is incomplete or you want to confirm the raw *.log filenames on the instance, fall back to WebDAV:

# Enumerate log filenames directly over WebDAV
b2c webdav ls --root logs

Logs in Subdirectories

The Logs/ directory contains subdirectories such as internal/ (e.g. server, ccp, health, csrf-violations, internalquota). These are not listed by default. To reach them, pass a path-like --filter (one containing a /): the tooling then recurses into that subdirectory and matches files by their path relative to Logs/.

# All "server" logs under internal/
b2c logs list --filter internal/server

# Everything under internal/ (trailing slash)
b2c logs tail --filter internal/

# Mix a subdirectory filter with normal prefix filters
b2c logs get --filter error --filter internal/server

This works the same across logs list, logs get, and logs tail (and the equivalent MCP tools).

More Commands

See b2c logs --help for all available commands and options.

Related Skills

  • b2c-cli:b2c-webdav - Direct WebDAV file access for downloading full log files
  • b2c-cli:b2c-config - Verify configuration and credentials
  • b2c:b2c-logging - Authoring side: how server-side code creates custom logger categories that produce custom-* log files

Comments

Markdown supported