On this page

Logging for JavaScript SDK

This page explains how to configure logging in the PubNub JavaScript Software Development Kit (SDK) using log levels and custom loggers.

Logging architecture

The JavaScript SDK provides a flexible logging system. You can configure the logging system for different environments and use cases:

  • Log levels control logging verbosity from detailed trace logs to errors only
  • Built-in console logger automatically outputs to the browser console or Node.js console
  • Custom loggers allow you to add custom logger implementations via the loggers configuration parameter
  • Structured logging includes instance IDs, timestamps, log levels, and typed content

The SDK sends all log entries to both the built-in console logger and any configured custom loggers simultaneously.

Log levels

The SDK uses six log levels. The levels range from most verbose to least verbose:

LevelPurpose
LogLevel.Trace
Logs every detail including function calls, full payloads, internal variables, and state-machine transitions
LogLevel.Debug
Logs SDK logic including inputs and outputs to public methods, HTTP (Hypertext Transfer Protocol) requests and responses, and configuration properties
LogLevel.Info
Logs significant events such as successful initialization and connection status changes
LogLevel.Warn
Logs non-fatal events including deprecation warnings, request retries, and unusual conditions
LogLevel.Error
Logs errors, exceptions with stack traces, and HTTP failures
LogLevel.None
Disables logging (default)

Enable logging

Set the logLevel parameter during SDK initialization to enable console logging:

1import PubNub from 'pubnub';
2
3// Initialize PubNub with debug-level logging
4const pubnub = new PubNub({
5 subscribeKey: 'mySubscribeKey',
6 publishKey: 'myPublishKey',
7 userId: 'myUniqueUserId',
8 logLevel: PubNub.LogLevel.Debug
9});
Required User ID

Always set the userId to uniquely identify the user or device that connects to PubNub. This userId should be persisted and should remain unchanged for the lifetime of the user or the device. If you don't set the userId, you won't be able to connect to PubNub.

Configure detailed network logging

Use LogLevel.Trace to log detailed network information. This log level includes full HTTP request and response bodies:

1const pubnub = new PubNub({
2 subscribeKey: 'mySubscribeKey',
3 publishKey: 'myPublishKey',
4 userId: 'myUniqueUserId',
5 logLevel: PubNub.LogLevel.Trace
6});
Contact support

When troubleshooting issues, set logLevel to LogLevel.Debug or LogLevel.Trace. Reproduce the issue, copy the console output, and submit the output to support@pubnub.com.

Custom loggers

Implement the Logger interface to route logs to external monitoring services, databases, or analytics platforms. Custom loggers work alongside the built-in console logger.

Logger interface structure

The Logger interface provides methods for all log levels:

1/**
2 * Custom logger interface
3 */
4interface Logger {
5 /**
6 * Process a trace-level message
7 * @param message - Structured log message
8 */
9 trace(message: LogMessage): void;
10
11 /**
12 * Process a debug-level message
13 * @param message - Structured log message
14 */
15 debug(message: LogMessage): void;
show all 34 lines

The SDK calls only the methods that correspond to the configured log level and above. For example, if you set logLevel to LogLevel.Warn, the SDK calls only the warn() and error() methods.

Structured logging with LogMessage

Each LogMessage object provides structured information. The following table describes the common fields present in all log messages (the BaseLogMessage interface):

FieldDescription
timestamp
JavaScript Date object representing when the log was created
pubNubId
PubNub instance identifier (hash of instance ID)
level
Log level as a LogLevel enum value
minimumLevel
Minimum configured log level (useful for conditional detailed logging)
location
Source class or method that generated the log (when available)
messageType
Type of message content: 'text', 'object', 'error', 'network-request', or 'network-response'
message
Actual log content (type depends on messageType)

Custom logger example

The following example shows a custom logger that sends errors and failed requests to a monitoring service. When using TypeScript, type narrowing enables IDE autocomplete for type-specific fields:

1import { Logger, LogMessage } from 'pubnub'
2
3class MonitoringLogger implements Logger {
4 /**
5 * Process error-level messages
6 */
7 error(logMessage: LogMessage) {
8 const { timestamp, pubNubId, location, messageType } = logMessage;
9
10 if (messageType === 'error') {
11 // TypeScript narrows type to ErrorLogMessage
12 // IDE provides autocomplete for PubNubError fields
13 monitoringService.reportError({
14 message: logMessage.message.message,
15 name: logMessage.message.name,
show all 86 lines

Multiple custom loggers

You can add multiple custom loggers for different purposes:

1const pubnub = new PubNub({
2 subscribeKey: 'mySubscribeKey',
3 publishKey: 'myPublishKey',
4 userId: 'myUniqueUserId',
5 logLevel: PubNub.LogLevel.Debug,
6 loggers: [
7 new MonitoringLogger(), // Send errors to monitoring service
8 new AnalyticsLogger(), // Track usage patterns
9 new FileLogger() // Write detailed logs to file (Node.js)
10 ]
11});

Log message types

The SDK generates five types of log messages. Each type has a corresponding TypeScript interface with specific fields.

Text messages (TextLogMessage)

Text messages provide simple text for general logging. The message field contains a string:

{
timestamp: Date,
pubNubId: 'pn-abc123',
level: LogLevel.Info,
minimumLevel: LogLevel.Debug,
location: 'PubNub',
messageType: 'text',
message: 'PubNub client initialized successfully'
}

Object messages (ObjectLogMessage)

Object messages provide structured objects such as configuration or internal state. The message field contains an object, array, or other value. Optional details and ignoredKeys fields provide additional context:

{
timestamp: Date,
pubNubId: 'pn-abc123',
level: LogLevel.Debug,
minimumLevel: LogLevel.Debug,
location: 'Configuration',
messageType: 'object',
message: { subscribeKey: 'sub-c-...', ssl: true, ... },
details: 'Client configuration:'
}

Error messages (ErrorLogMessage)

Error messages provide exception and error information. The message field contains a PubNubError object with error details and optional status information:

{
timestamp: Date,
pubNubId: 'pn-abc123',
level: LogLevel.Error,
minimumLevel: LogLevel.Debug,
location: 'PublishRequest',
messageType: 'error',
message: {
name: 'PubNubError',
message: 'Publish failed',
stack: '...',
status: { category: 'PNNetworkIssuesCategory', ... }
}
}

Network request messages (NetworkRequestLogMessage)

Network request messages provide HTTP request details. The message field contains a TransportRequest object. Optional details, canceled, and failed fields provide additional context about the request status:

{
timestamp: Date,
pubNubId: 'pn-abc123',
level: LogLevel.Debug,
minimumLevel: LogLevel.Debug,
location: 'PublishRequest',
messageType: 'network-request',
message: {
method: 'POST',
origin: 'https://ps.pndsn.com',
path: '/publish/...',
headers: { 'Content-Type': 'application/json' },
body: '{"message":"Hello"}',
queryParameters: { uuid: 'myUserId' }
},
show all 18 lines

Network response messages (NetworkResponseLogMessage)

Network response messages provide HTTP response details. The message field contains a TransportResponse object with status code, headers, and response body:

{
timestamp: Date,
pubNubId: 'pn-abc123',
level: LogLevel.Debug,
minimumLevel: LogLevel.Debug,
location: 'PublishRequest',
messageType: 'network-response',
message: {
status: 200,
url: 'https://ps.pndsn.com/publish/...',
headers: { 'content-type': 'application/json' },
body: '[1,"Sent","15234567890123456"]'
}
}

Logging in different environments

Browser

The built-in console logger outputs to the browser JavaScript console:

1// Browser environment
2const pubnub = new PubNub({
3 subscribeKey: 'mySubscribeKey',
4 publishKey: 'myPublishKey',
5 userId: 'myUniqueUserId',
6 logLevel: PubNub.LogLevel.Debug
7});
8
9// Logs appear in browser console (F12 Developer Tools)

Node.js environment

The console logger outputs to the Node.js console:

1import PubNub from 'pubnub';
2
3const pubnub = new PubNub({
4 subscribeKey: 'mySubscribeKey',
5 publishKey: 'myPublishKey',
6 userId: 'myUniqueUserId',
7 logLevel: PubNub.LogLevel.Debug
8});
9
10// Logs appear in terminal or console

Node.js file logging

Implement a custom logger for Node.js file logging:

1import { Logger, LogLevel, LogMessage } from 'pubnub'
2import * as fs from 'fs';
3import path from 'path';
4
5class FileLogger {
6 constructor(private readonly logFilePath: string) {
7 this.stream = fs.createWriteStream(logFilePath, { flags: 'a' });
8 }
9
10 log(logMessage: LogMessage) {
11 const level = LogLevel[logMessage.level];
12 const timestamp = logMessage.timestamp.toISOString();
13 const location = logMessage.location || 'Unknown';
14 const message = this.formatMessage(logMessage);
15
show all 47 lines

Migrate from logVerbosity

Best practices

Production environments

In production environments, use LogLevel.Warn or LogLevel.Error. These log levels minimize performance impact while capturing important issues.

Development environments

During development, use LogLevel.Debug or LogLevel.Trace. These log levels provide detailed information for debugging.

Custom logger performance

Implement custom loggers efficiently to avoid blocking the main thread. This consideration is especially important for network requests to external services.

Protect sensitive data

Use the ignoredKeys field in object log messages to filter sensitive data. Filter data such as secret keys or user credentials.

Implement log rotation

If you use file logging in Node.js, implement log rotation. Log rotation prevents unbounded log file growth.

Use structured logging

Take advantage of structured LogMessage objects. Structured logging enables searchable and queryable logs in your monitoring systems.

For more information about configuration parameters, refer to Configuration.

Last updated on