Logging for Kotlin SDK
This page explains how to configure logging in the PubNub Kotlin Software Development Kit (SDK) using SLF4J and custom loggers.
Logging architecture
You can configure logging for different environments and use cases:
- SLF4J integration: All logs route through SLF4J, allowing you to use any SLF4J-compatible backend (
logback
,log4j
,slf4j-simple
,commons-logging
,java.util.logging
) - Custom loggers: Optionally add custom logger implementations via the
customLoggers
configuration parameter to route logs to external systems - Structured logging: Logs include structured data with instance IDs, timestamps, log levels, and typed content
The SDK sends all log entries to both SLF4J and any configured custom loggers simultaneously.
Log levels
SLF4J uses standard log levels:
Level | Purpose |
---|---|
TRACE | Internal operations: serialization, encryption, subscription lifecycle, and detailed execution flow |
DEBUG | User inputs, API parameters, HTTP requests and responses, and configuration properties |
INFO | Significant events like successful initialization and configuration changes |
WARN | Deprecation warnings, unusual conditions, and non-breaking validation warnings |
ERROR | Errors, exceptions with stack traces, and failed operations |
The SDK logs all configuration properties at DEBUG
level during initialization. Sensitive values such as secret keys are masked.
Custom loggers
Beyond SLF4J, you can implement the CustomLogger
interface to route logs to external monitoring services, databases, or analytics platforms alongside your SLF4J backend.
CustomLogger interface
The CustomLogger
interface supports string messages and structured LogMessage
objects:
1interface CustomLogger {
2 val name: String get() = "CustomLogger"
3
4 // String-based logging methods
5 fun trace(message: String?)
6 fun debug(message: String?)
7 fun info(message: String?)
8 fun warn(message: String?)
9 fun error(message: String?)
10
11 // Structured logging methods
12 fun trace(logMessage: LogMessage)
13 fun debug(logMessage: LogMessage)
14 fun info(logMessage: LogMessage)
15 fun warn(logMessage: LogMessage)
show all 17 linesThe SDK calls both overloads for each log entry:
- String version - a simplified, human-readable message
- LogMessage version - structured data including instance ID, timestamp, location, and typed content
You only need to implement the methods you plan to use. The default implementations do nothing.
Structured logging with LogMessage
LogMessage
provides structured information for each log entry:
Field | Description |
---|---|
message | The log content (one of: Text, Object, Error, NetworkRequest, or NetworkResponse) |
details | Optional additional context |
type | Automatically inferred from message content (TEXT, OBJECT, ERROR, NETWORK_REQUEST, NETWORK_RESPONSE) |
location | Source class or method generating the log |
pubNubId | PubNub instance identifier |
logLevel | The SLF4J log level (TRACE , DEBUG , INFO , WARN , ERROR ) |
timestamp | When the log was created with millisecond precision (format: HH:mm:ss.SSS ) |
Custom logger example
1
Configure the SDK with your custom logger:
1
SLF4J backend configuration
The following sections explain how to configure different SLF4J backends. Choose the backend that best fits your environment and logging requirements.
For more information about configuration parameters, refer to Configuration.
Implement logging on Android
Add the following dependency to the project and configure it.
Example configuration:
1
The logs will appear in Logcat.
Implement logging using log4j
To implement logging using log4j
you need to add the following references to the project. Using log4j
you can log to console or a file or both.
log4j-slf4j2
file which acts as a bridge betweenslf4j
andlog4j
.log4j-api
file, which provides the underlying logging framework API.log4j-core
file, which provides the underlying logging framework Implementation.
1
See this example:
1
Implement logging using slf4j-simple
To implement logging using slf4j-simple
you need to add the following references to the project.
SLF4J API
dependencySLF4J-Simple
dependency which provides the underlying logging framework
Along with these references you need to add the simplelogger.properties
file in the CLASSPATH
.
See this example:
1
Example usage of slf4j-simple
1
Implement logging using logback-classic
To implement logging using logback, you need to add the following references to the project.
Logback classic
andlogback-core
jar files which provide the underlying logging frameworkLogback core
dependency which provides the underlying logging framework
See an sample logback.xml
logback config file:
1
See this example:
1
Implement logging using java.util.logging
To implement logging using java.util.logging
you need to add the following references to the project.
SLF4J API
dependencySLF4J-JDK14
dependency which acts as a bridge betweenslf4j
andjava
JVM runtime provides the underlying logging framework.
Implement logging using commons-logging
To implement logging using commons-logging
you need to add the following references to the project.
SLF4J API
dependencySLF4J-JCL
dependency which acts as a bridge between slf4j and common-loggingcommons-logging
dependency which acts as an abstraction layer
The underlying logging framework is chosen dynamically by commons-logging
.
No logging
To implement no logging you have two options:
-
Add the
SLF4J API
dependency which is the SLF4J API and nothing else. -
Add the
SLF4J API
dependency and then add a reference toSLF4J-nop
dependency.