Overview
TikTokLive includes a built-in logging system that helps you debug connection issues, track events, and monitor your client’s behavior. The library uses Python’s standard logging module with a custom handler.
Quick Start
Enable debug logging to see detailed information about your client:
from TikTokLive import TikTokLiveClient
from TikTokLive.client.logger import LogLevel
client = TikTokLiveClient(
unique_id = "@username" ,
debug = True # Enable debug mode
)
This will automatically set the log level to DEBUG and output logs to stderr.
Log Levels
TikTokLive supports all standard Python logging levels through the LogLevel enum:
from TikTokLive.client.logger import LogLevel
# Available log levels
LogLevel. CRITICAL # 50 - Critical errors only
LogLevel. ERROR # 40 - Errors and above
LogLevel. WARNING # 30 - Warnings and above (default)
LogLevel. INFO # 20 - Info and above
LogLevel. DEBUG # 10 - Debug and above (most verbose)
LogLevel. NOTSET # 0 - All messages
Custom Logger Configuration
You can configure the logger manually for more control:
import sys
from TikTokLive.client.logger import TikTokLiveLogHandler, LogLevel
# Get or create the logger
logger = TikTokLiveLogHandler.get_logger(
level = LogLevel. DEBUG ,
stream = sys.stdout # Output to stdout instead of stderr
)
# The logger is now configured
logger.info( "Logger is ready" )
logger.debug( "Debug information" )
logger.warning( "Warning message" )
logger.error( "Error occurred" )
The TikTokLive logger uses a custom format inspired by SpringBoot:
[TikTokLive] INFO from c.w.routes.fetch_room_info:42 — Fetching room info
[TikTokLive] DEBUG from c.w.web_client:156 — Request completed
[TikTokLive] ERROR from c.client:89 — Connection failed
Format breakdown:
[TikTokLive] - Logger name
INFO/DEBUG/ERROR - Log level
c.w.routes.fetch_room_info - Compressed file path
42 - Line number
Message content
Using Debug Mode
Basic Debug Mode
Enable debug mode when creating your client:
from TikTokLive import TikTokLiveClient
client = TikTokLiveClient(
unique_id = "@username" ,
debug = True
)
if __name__ == '__main__' :
client.run()
Debug Mode with Custom Level
Set a specific log level even with debug mode:
from TikTokLive import TikTokLiveClient
from TikTokLive.client.logger import TikTokLiveLogHandler, LogLevel
# Configure logger before creating client
logger = TikTokLiveLogHandler.get_logger( level = LogLevel. INFO )
client = TikTokLiveClient( unique_id = "@username" )
Advanced Logger Configuration
Custom Stream Output
Redirect logs to a file:
import sys
from TikTokLive.client.logger import TikTokLiveLogHandler, LogLevel
# Write logs to a file
with open ( 'tiktok_live.log' , 'w' ) as log_file:
logger = TikTokLiveLogHandler.get_logger(
level = LogLevel. DEBUG ,
stream = log_file
)
# Your client code here
client = TikTokLiveClient( unique_id = "@username" )
client.run()
Create a logger with a custom formatter:
import logging
import sys
from TikTokLive.client.logger import TikTokLiveLogHandler, LogLevel
# Create custom formatter
custom_format = " %(asctime)s - %(name)s - %(levelname)s - %(message)s "
custom_formatter = logging.Formatter(custom_format, "%Y-%m- %d %H:%M:%S" )
# Create logger handler
handler = TikTokLiveLogHandler( stream = sys.stdout, formatter = custom_formatter)
# Get logger and configure
logger = logging.getLogger( "TikTokLive" )
logger.addHandler(handler)
logger.setLevel(LogLevel. DEBUG .value)
Logging in Event Handlers
Use the logger within your event handlers for consistent logging:
import logging
from TikTokLive import TikTokLiveClient
from TikTokLive.events import ConnectEvent, CommentEvent
from TikTokLive.client.logger import TikTokLiveLogHandler, LogLevel
# Get the logger
logger = TikTokLiveLogHandler.get_logger( level = LogLevel. DEBUG )
client = TikTokLiveClient( unique_id = "@username" )
@client.on (ConnectEvent)
async def on_connect ( event : ConnectEvent):
logger.info( f "Connected to @ { event.unique_id } " )
logger.debug( f "Room ID: { event.room_id } " )
@client.on (CommentEvent)
async def on_comment ( event : CommentEvent):
logger.debug( f "Comment from { event.user.nickname } : { event.comment } " )
if __name__ == '__main__' :
client.run()
Debugging Connection Issues
When troubleshooting connection problems, enable debug logging:
from TikTokLive import TikTokLiveClient
from TikTokLive.client.logger import TikTokLiveLogHandler, LogLevel
from TikTokLive.client.errors import TikTokLiveError
import traceback
# Enable detailed logging
logger = TikTokLiveLogHandler.get_logger( level = LogLevel. DEBUG )
client = TikTokLiveClient(
unique_id = "@username" ,
debug = True
)
try :
client.run()
except TikTokLiveError as e:
logger.error( f "TikTokLive error: { e } " )
logger.error(traceback.format_exc())
except Exception as e:
logger.critical( f "Unexpected error: { e } " )
logger.critical(traceback.format_exc())
The TikTokLiveLogHandler automatically compresses file paths for cleaner output:
# Full path: /path/to/project/TikTokLive/client/web/routes/fetch_room_info.py
# Compressed: c.w.routes.fetch_room_info.py
This is done using the format_path method:
from TikTokLive.client.logger import TikTokLiveLogHandler
import logging
# Access the formatter
record = logging.LogRecord(
name = "TikTokLive" ,
level = logging. INFO ,
pathname = "/home/user/project/TikTokLive/client/client.py" ,
lineno = 42 ,
msg = "Test message" ,
args = (),
exc_info = None
)
formatted_path = TikTokLiveLogHandler.format_path(record)
print (formatted_path) # "c.client.py"
Complete Logging Example
import sys
import logging
from TikTokLive import TikTokLiveClient
from TikTokLive.client.logger import TikTokLiveLogHandler, LogLevel
from TikTokLive.events import ConnectEvent, DisconnectEvent, CommentEvent
from TikTokLive.client.errors import TikTokLiveError
# Configure logging
logger = TikTokLiveLogHandler.get_logger(
level = LogLevel. DEBUG ,
stream = sys.stdout
)
client = TikTokLiveClient( unique_id = "@username" )
@client.on (ConnectEvent)
async def on_connect ( event : ConnectEvent):
logger.info( f "✓ Successfully connected to @ { event.unique_id } " )
logger.debug( f "Room ID: { event.room_id } " )
@client.on (DisconnectEvent)
async def on_disconnect ( event : DisconnectEvent):
logger.warning( "Disconnected from stream" )
@client.on (CommentEvent)
async def on_comment ( event : CommentEvent):
logger.debug( f " { event.user.nickname } : { event.comment } " )
if __name__ == '__main__' :
try :
logger.info( "Starting TikTokLive client..." )
client.run()
except TikTokLiveError as e:
logger.error( f "Client error: { e } " )
except KeyboardInterrupt :
logger.info( "Client stopped by user" )
except Exception as e:
logger.critical( f "Unexpected error: { e } " )
Best Practices
Use Debug Mode Always enable debug mode during development to catch issues early.
Production Logging Use WARNING or ERROR level in production to avoid log spam.
Log Files Write logs to files in production for later analysis and debugging.
Structured Logging Include context in log messages (username, room_id, etc.) for easier debugging.
The logger singleton is created once and reused. Calling get_logger() multiple times returns the same instance unless you explicitly pass a new level parameter.