Latest commit

History

History

README.md


SmooAI Logo

About SmooAI

SmooAI is an AI-powered platform for helping businesses multiply their customer, employee, and developer experience.

Learn more on smoo.ai

SmooAI Packages

Check out other SmooAI packages at smoo.ai/open-source

About smooai-logger (Python)

The missing piece for AWS & Browser logging - A contextual logging system that automatically captures the full execution context you need to debug production issues, without the manual setup.

PyPI VersionPyPI DownloadsPyPI Last Update

GitHub LicenseGitHub Actions Workflow StatusGitHub Repo stars

Python Package

This is the Python port of @smooai/logger, mirroring the TypeScript API for backend services. It provides the same contextual logging capabilities with automatic AWS context capture and correlation tracking.

Why smooai-logger?

Ever spent hours debugging an AWS service in production, only to realize you're missing critical context? Traditional loggers give you the message, but not the story.

smooai-logger automatically captures:

For AWS Services:

  • 📍 Exact code location - File, line number, and call stack for every log
  • 🔗 Request journey - Correlation IDs that follow requests across services
  • AWS context - Service-specific metadata and execution details
  • 🌐 HTTP details - Headers, methods, status codes from API Gateway
  • 📬 Message context - SQS attributes, EventBridge events, SNS messages
  • 🔧 Service integration - Lambda, ECS, Fargate, EC2, and more

Install

pip install smooai-logger

or with uv:

uv add smooai-logger

The Power of Automatic Context

See Where Your Logs Come From

Every log entry includes the exact location in your code:

fromsmooai_loggerimportAwsServerLoggerlogger=AwsServerLogger()
logger.info("User created")
# Output includes:
{
"callerContext": {
"stack": [
"at UserService.create_user (/src/services/user_service.py:42:16)",
"at process_request (/src/handlers/user_handler.py:15:23)",
"at handler (/src/index.py:8:10)"
]
}
}

No more guessing which function logged what - the full execution path is right there.

Track Requests Across Services

Correlation IDs automatically flow through your entire system:

# Service A: API Gateway Handlerlogger.add_lambda_context(event, context)
logger.info("Request received") # Correlation ID: abc-123# Service B: SQS Processor (automatically extracts ID)logger.add_sqs_record_context(record)
logger.info("Processing message") # Same Correlation ID: abc-123# Service C: Another Lambda (receives via HTTP header)logger.info("Completing workflow") # Still Correlation ID: abc-123

Production-Ready Examples

AWS Lambda with API Gateway

fromsmooai_loggerimportAwsServerLogger, Levellogger=AwsServerLogger(name="UserAPI")
defhandler(event, context):
logger.add_lambda_context(event, context)
try:
user=create_user(event["body"])
logger.info("User created successfully", {"userId": user.id})
return {"statusCode": 201, "body": json.dumps(user)}
exceptExceptionaserror:
logger.error("Failed to create user", error, {
"body": event["body"],
"headers": event["headers"],
})
raiseerror

AWS ECS/Fargate Services

importosfromsmooai_loggerimportAwsServerLogger, Levellogger=AwsServerLogger(
name="OrderService",
level=Level.INFO,
)
# Automatically captures container metadata@app.post('/orders')asyncdefcreate_order(request):
logger.add_context({
"taskArn": os.environ.get("ECS_TASK_ARN"),
"containerName": os.environ.get("ECS_CONTAINER_NAME"),
})
logger.info("Processing order", {
"orderId": request.json["orderId"],
"amount": request.json["amount"],
})

SQS Message Processing

defsqs_handler(event):
forrecordinevent["Records"]:
logger.add_sqs_record_context(record)
logger.info("Processing order", {
"messageId": record["messageId"],
"attempt": record["attributes"]["ApproximateReceiveCount"],
})
# Logger maintains context throughout async operationsprocess_order(record["body"])

Advanced Features

Smart Error Handling

Errors are automatically serialized with full context:

try:
risky_operation()
exceptExceptionaserror:
logger.error("Operation failed", error, {"context": "additional-info"})
# Includes: error message, stack trace, error type, and your context

Flexible Context Management

# Add user context that persists across logslogger.add_user_context({"id": "user-123", "role": "admin"})
# Add telemetry for performance trackinglogger.add_telemetry_fields({"duration": 150, "operation": "db-query"})
# Add custom context for specific logslogger.info("Payment processed", {
"amount": 99.99,
"currency": "USD",
})

Local Development Features

Pretty Printing

logger=AwsServerLogger(
pretty_print=True# Readable console output for development
)

Automatic Log Rotation

Logs are automatically saved to disk in development with smart rotation:

# Auto-enabled in local environments# Saves to .smooai-logs/ with ANSI colors for easy readinglogger=AwsServerLogger(
rotation={
"size": "10M", # Rotate at 10MB"interval": "1d", # Daily rotation"compress": True, # Gzip old logs
}
)

Configuration

Log Levels

  • TRACE - Detailed debugging information
  • DEBUG - Diagnostic information
  • INFO - General operational information
  • WARN - Warning conditions
  • ERROR - Error conditions
  • FATAL - Critical failures

Context Presets

  • MINIMAL - Essential context only
  • FULL - All available context (default)

Built With

  • Python 3.8+ - Full type hints support
  • AWS SDK Integration - Native support for Lambda, ECS, EC2, and more
  • Automatic environment detection
  • Smart log rotation

Related Packages

Development

uv run poe install-dev
uv run pytest
uv run poe lint
uv run poe lint:fix # optional fixer
uv run poe format
uv run poe typecheck
uv run poe build

Set UV_PUBLISH_TOKEN before running uv run poe publish to upload to PyPI.

(back to top)

Contact

Brent Rager

Smoo Github: https://github.com/SmooAI

(back to top)

License

MIT © SmooAI

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

History

README.md


SmooAI Logo

About SmooAI

SmooAI is an AI-powered platform for helping businesses multiply their customer, employee, and developer experience.

Learn more on smoo.ai

SmooAI Packages

Check out other SmooAI packages at smoo.ai/open-source

About smooai-logger (Python)

The missing piece for AWS & Browser logging - A contextual logging system that automatically captures the full execution context you need to debug production issues, without the manual setup.

PyPI VersionPyPI DownloadsPyPI Last Update

GitHub LicenseGitHub Actions Workflow StatusGitHub Repo stars

Python Package

This is the Python port of @smooai/logger, mirroring the TypeScript API for backend services. It provides the same contextual logging capabilities with automatic AWS context capture and correlation tracking.

Why smooai-logger?

Ever spent hours debugging an AWS service in production, only to realize you're missing critical context? Traditional loggers give you the message, but not the story.

smooai-logger automatically captures:

For AWS Services:

  • 📍 Exact code location - File, line number, and call stack for every log
  • 🔗 Request journey - Correlation IDs that follow requests across services
  • AWS context - Service-specific metadata and execution details
  • 🌐 HTTP details - Headers, methods, status codes from API Gateway
  • 📬 Message context - SQS attributes, EventBridge events, SNS messages
  • 🔧 Service integration - Lambda, ECS, Fargate, EC2, and more

Install

pip install smooai-logger

or with uv:

uv add smooai-logger

The Power of Automatic Context

See Where Your Logs Come From

Every log entry includes the exact location in your code:

fromsmooai_loggerimportAwsServerLoggerlogger=AwsServerLogger()
logger.info("User created")
# Output includes:
{
"callerContext": {
"stack": [
"at UserService.create_user (/src/services/user_service.py:42:16)",
"at process_request (/src/handlers/user_handler.py:15:23)",
"at handler (/src/index.py:8:10)"
]
}
}

No more guessing which function logged what - the full execution path is right there.

Track Requests Across Services

Correlation IDs automatically flow through your entire system:

# Service A: API Gateway Handlerlogger.add_lambda_context(event, context)
logger.info("Request received") # Correlation ID: abc-123# Service B: SQS Processor (automatically extracts ID)logger.add_sqs_record_context(record)
logger.info("Processing message") # Same Correlation ID: abc-123# Service C: Another Lambda (receives via HTTP header)logger.info("Completing workflow") # Still Correlation ID: abc-123

Production-Ready Examples

AWS Lambda with API Gateway

fromsmooai_loggerimportAwsServerLogger, Levellogger=AwsServerLogger(name="UserAPI")
defhandler(event, context):
logger.add_lambda_context(event, context)
try:
user=create_user(event["body"])
logger.info("User created successfully", {"userId": user.id})
return {"statusCode": 201, "body": json.dumps(user)}
exceptExceptionaserror:
logger.error("Failed to create user", error, {
"body": event["body"],
"headers": event["headers"],
})
raiseerror

AWS ECS/Fargate Services

importosfromsmooai_loggerimportAwsServerLogger, Levellogger=AwsServerLogger(
name="OrderService",
level=Level.INFO,
)
# Automatically captures container metadata@app.post('/orders')asyncdefcreate_order(request):
logger.add_context({
"taskArn": os.environ.get("ECS_TASK_ARN"),
"containerName": os.environ.get("ECS_CONTAINER_NAME"),
})
logger.info("Processing order", {
"orderId": request.json["orderId"],
"amount": request.json["amount"],
})

SQS Message Processing

defsqs_handler(event):
forrecordinevent["Records"]:
logger.add_sqs_record_context(record)
logger.info("Processing order", {
"messageId": record["messageId"],
"attempt": record["attributes"]["ApproximateReceiveCount"],
})
# Logger maintains context throughout async operationsprocess_order(record["body"])

Advanced Features

Smart Error Handling

Errors are automatically serialized with full context:

try:
risky_operation()
exceptExceptionaserror:
logger.error("Operation failed", error, {"context": "additional-info"})
# Includes: error message, stack trace, error type, and your context

Flexible Context Management

# Add user context that persists across logslogger.add_user_context({"id": "user-123", "role": "admin"})
# Add telemetry for performance trackinglogger.add_telemetry_fields({"duration": 150, "operation": "db-query"})
# Add custom context for specific logslogger.info("Payment processed", {
"amount": 99.99,
"currency": "USD",
})

Local Development Features

Pretty Printing

logger=AwsServerLogger(
pretty_print=True# Readable console output for development
)

Automatic Log Rotation

Logs are automatically saved to disk in development with smart rotation:

# Auto-enabled in local environments# Saves to .smooai-logs/ with ANSI colors for easy readinglogger=AwsServerLogger(
rotation={
"size": "10M", # Rotate at 10MB"interval": "1d", # Daily rotation"compress": True, # Gzip old logs
}
)

Configuration

Log Levels

  • TRACE - Detailed debugging information
  • DEBUG - Diagnostic information
  • INFO - General operational information
  • WARN - Warning conditions
  • ERROR - Error conditions
  • FATAL - Critical failures

Context Presets

  • MINIMAL - Essential context only
  • FULL - All available context (default)

Built With

  • Python 3.8+ - Full type hints support
  • AWS SDK Integration - Native support for Lambda, ECS, EC2, and more
  • Automatic environment detection
  • Smart log rotation

Related Packages

Development

uv run poe install-dev
uv run pytest
uv run poe lint
uv run poe lint:fix # optional fixer
uv run poe format
uv run poe typecheck
uv run poe build

Set UV_PUBLISH_TOKEN before running uv run poe publish to upload to PyPI.

(back to top)

Contact

Brent Rager

Smoo Github: https://github.com/SmooAI

(back to top)

License

MIT © SmooAI

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History

README.md


SmooAI Logo

About SmooAI

SmooAI is an AI-powered platform for helping businesses multiply their customer, employee, and developer experience.

Learn more on smoo.ai

SmooAI Packages

Check out other SmooAI packages at smoo.ai/open-source

About smooai-logger (Python)

The missing piece for AWS & Browser logging - A contextual logging system that automatically captures the full execution context you need to debug production issues, without the manual setup.

PyPI VersionPyPI DownloadsPyPI Last Update

GitHub LicenseGitHub Actions Workflow StatusGitHub Repo stars

Python Package

This is the Python port of @smooai/logger, mirroring the TypeScript API for backend services. It provides the same contextual logging capabilities with automatic AWS context capture and correlation tracking.

Why smooai-logger?

Ever spent hours debugging an AWS service in production, only to realize you're missing critical context? Traditional loggers give you the message, but not the story.

smooai-logger automatically captures:

For AWS Services:

  • 📍 Exact code location - File, line number, and call stack for every log
  • 🔗 Request journey - Correlation IDs that follow requests across services
  • AWS context - Service-specific metadata and execution details
  • 🌐 HTTP details - Headers, methods, status codes from API Gateway
  • 📬 Message context - SQS attributes, EventBridge events, SNS messages
  • 🔧 Service integration - Lambda, ECS, Fargate, EC2, and more

Install

pip install smooai-logger

or with uv:

uv add smooai-logger

The Power of Automatic Context

See Where Your Logs Come From

Every log entry includes the exact location in your code:

fromsmooai_loggerimportAwsServerLoggerlogger=AwsServerLogger()
logger.info("User created")
# Output includes:
{
"callerContext": {
"stack": [
"at UserService.create_user (/src/services/user_service.py:42:16)",
"at process_request (/src/handlers/user_handler.py:15:23)",
"at handler (/src/index.py:8:10)"
]
}
}

No more guessing which function logged what - the full execution path is right there.

Track Requests Across Services

Correlation IDs automatically flow through your entire system:

# Service A: API Gateway Handlerlogger.add_lambda_context(event, context)
logger.info("Request received") # Correlation ID: abc-123# Service B: SQS Processor (automatically extracts ID)logger.add_sqs_record_context(record)
logger.info("Processing message") # Same Correlation ID: abc-123# Service C: Another Lambda (receives via HTTP header)logger.info("Completing workflow") # Still Correlation ID: abc-123

Production-Ready Examples

AWS Lambda with API Gateway

fromsmooai_loggerimportAwsServerLogger, Levellogger=AwsServerLogger(name="UserAPI")
defhandler(event, context):
logger.add_lambda_context(event, context)
try:
user=create_user(event["body"])
logger.info("User created successfully", {"userId": user.id})
return {"statusCode": 201, "body": json.dumps(user)}
exceptExceptionaserror:
logger.error("Failed to create user", error, {
"body": event["body"],
"headers": event["headers"],
})
raiseerror

AWS ECS/Fargate Services

importosfromsmooai_loggerimportAwsServerLogger, Levellogger=AwsServerLogger(
name="OrderService",
level=Level.INFO,
)
# Automatically captures container metadata@app.post('/orders')asyncdefcreate_order(request):
logger.add_context({
"taskArn": os.environ.get("ECS_TASK_ARN"),
"containerName": os.environ.get("ECS_CONTAINER_NAME"),
})
logger.info("Processing order", {
"orderId": request.json["orderId"],
"amount": request.json["amount"],
})

SQS Message Processing

defsqs_handler(event):
forrecordinevent["Records"]:
logger.add_sqs_record_context(record)
logger.info("Processing order", {
"messageId": record["messageId"],
"attempt": record["attributes"]["ApproximateReceiveCount"],
})
# Logger maintains context throughout async operationsprocess_order(record["body"])

Advanced Features

Smart Error Handling

Errors are automatically serialized with full context:

try:
risky_operation()
exceptExceptionaserror:
logger.error("Operation failed", error, {"context": "additional-info"})
# Includes: error message, stack trace, error type, and your context

Flexible Context Management

# Add user context that persists across logslogger.add_user_context({"id": "user-123", "role": "admin"})
# Add telemetry for performance trackinglogger.add_telemetry_fields({"duration": 150, "operation": "db-query"})
# Add custom context for specific logslogger.info("Payment processed", {
"amount": 99.99,
"currency": "USD",
})

Local Development Features

Pretty Printing

logger=AwsServerLogger(
pretty_print=True# Readable console output for development
)

Automatic Log Rotation

Logs are automatically saved to disk in development with smart rotation:

# Auto-enabled in local environments# Saves to .smooai-logs/ with ANSI colors for easy readinglogger=AwsServerLogger(
rotation={
"size": "10M", # Rotate at 10MB"interval": "1d", # Daily rotation"compress": True, # Gzip old logs
}
)

Configuration

Log Levels

  • TRACE - Detailed debugging information
  • DEBUG - Diagnostic information
  • INFO - General operational information
  • WARN - Warning conditions
  • ERROR - Error conditions
  • FATAL - Critical failures

Context Presets

  • MINIMAL - Essential context only
  • FULL - All available context (default)

Built With

  • Python 3.8+ - Full type hints support
  • AWS SDK Integration - Native support for Lambda, ECS, EC2, and more
  • Automatic environment detection
  • Smart log rotation

Related Packages

Development

uv run poe install-dev
uv run pytest
uv run poe lint
uv run poe lint:fix # optional fixer
uv run poe format
uv run poe typecheck
uv run poe build

Set UV_PUBLISH_TOKEN before running uv run poe publish to upload to PyPI.

(back to top)

Contact

Brent Rager

Smoo Github: https://github.com/SmooAI

(back to top)

License

MIT © SmooAI

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History

README.md


SmooAI Logo

About SmooAI

SmooAI is an AI-powered platform for helping businesses multiply their customer, employee, and developer experience.

Learn more on smoo.ai

SmooAI Packages

Check out other SmooAI packages at smoo.ai/open-source

About smooai-logger (Python)

The missing piece for AWS & Browser logging - A contextual logging system that automatically captures the full execution context you need to debug production issues, without the manual setup.

PyPI VersionPyPI DownloadsPyPI Last Update

GitHub LicenseGitHub Actions Workflow StatusGitHub Repo stars

Python Package

This is the Python port of @smooai/logger, mirroring the TypeScript API for backend services. It provides the same contextual logging capabilities with automatic AWS context capture and correlation tracking.

Why smooai-logger?

Ever spent hours debugging an AWS service in production, only to realize you're missing critical context? Traditional loggers give you the message, but not the story.

smooai-logger automatically captures:

For AWS Services:

  • 📍 Exact code location - File, line number, and call stack for every log
  • 🔗 Request journey - Correlation IDs that follow requests across services
  • AWS context - Service-specific metadata and execution details
  • 🌐 HTTP details - Headers, methods, status codes from API Gateway
  • 📬 Message context - SQS attributes, EventBridge events, SNS messages
  • 🔧 Service integration - Lambda, ECS, Fargate, EC2, and more

Install

pip install smooai-logger

or with uv:

uv add smooai-logger

The Power of Automatic Context

See Where Your Logs Come From

Every log entry includes the exact location in your code:

fromsmooai_loggerimportAwsServerLoggerlogger=AwsServerLogger()
logger.info("User created")
# Output includes:
{
"callerContext": {
"stack": [
"at UserService.create_user (/src/services/user_service.py:42:16)",
"at process_request (/src/handlers/user_handler.py:15:23)",
"at handler (/src/index.py:8:10)"
]
}
}

No more guessing which function logged what - the full execution path is right there.

Track Requests Across Services

Correlation IDs automatically flow through your entire system:

# Service A: API Gateway Handlerlogger.add_lambda_context(event, context)
logger.info("Request received") # Correlation ID: abc-123# Service B: SQS Processor (automatically extracts ID)logger.add_sqs_record_context(record)
logger.info("Processing message") # Same Correlation ID: abc-123# Service C: Another Lambda (receives via HTTP header)logger.info("Completing workflow") # Still Correlation ID: abc-123

Production-Ready Examples

AWS Lambda with API Gateway

fromsmooai_loggerimportAwsServerLogger, Levellogger=AwsServerLogger(name="UserAPI")
defhandler(event, context):
logger.add_lambda_context(event, context)
try:
user=create_user(event["body"])
logger.info("User created successfully", {"userId": user.id})
return {"statusCode": 201, "body": json.dumps(user)}
exceptExceptionaserror:
logger.error("Failed to create user", error, {
"body": event["body"],
"headers": event["headers"],
})
raiseerror

AWS ECS/Fargate Services

importosfromsmooai_loggerimportAwsServerLogger, Levellogger=AwsServerLogger(
name="OrderService",
level=Level.INFO,
)
# Automatically captures container metadata@app.post('/orders')asyncdefcreate_order(request):
logger.add_context({
"taskArn": os.environ.get("ECS_TASK_ARN"),
"containerName": os.environ.get("ECS_CONTAINER_NAME"),
})
logger.info("Processing order", {
"orderId": request.json["orderId"],
"amount": request.json["amount"],
})

SQS Message Processing

defsqs_handler(event):
forrecordinevent["Records"]:
logger.add_sqs_record_context(record)
logger.info("Processing order", {
"messageId": record["messageId"],
"attempt": record["attributes"]["ApproximateReceiveCount"],
})
# Logger maintains context throughout async operationsprocess_order(record["body"])

Advanced Features

Smart Error Handling

Errors are automatically serialized with full context:

try:
risky_operation()
exceptExceptionaserror:
logger.error("Operation failed", error, {"context": "additional-info"})
# Includes: error message, stack trace, error type, and your context

Flexible Context Management

# Add user context that persists across logslogger.add_user_context({"id": "user-123", "role": "admin"})
# Add telemetry for performance trackinglogger.add_telemetry_fields({"duration": 150, "operation": "db-query"})
# Add custom context for specific logslogger.info("Payment processed", {
"amount": 99.99,
"currency": "USD",
})

Local Development Features

Pretty Printing

logger=AwsServerLogger(
pretty_print=True# Readable console output for development
)

Automatic Log Rotation

Logs are automatically saved to disk in development with smart rotation:

# Auto-enabled in local environments# Saves to .smooai-logs/ with ANSI colors for easy readinglogger=AwsServerLogger(
rotation={
"size": "10M", # Rotate at 10MB"interval": "1d", # Daily rotation"compress": True, # Gzip old logs
}
)

Configuration

Log Levels

  • TRACE - Detailed debugging information
  • DEBUG - Diagnostic information
  • INFO - General operational information
  • WARN - Warning conditions
  • ERROR - Error conditions
  • FATAL - Critical failures

Context Presets

  • MINIMAL - Essential context only
  • FULL - All available context (default)

Built With

  • Python 3.8+ - Full type hints support
  • AWS SDK Integration - Native support for Lambda, ECS, EC2, and more
  • Automatic environment detection
  • Smart log rotation

Related Packages

Development

uv run poe install-dev
uv run pytest
uv run poe lint
uv run poe lint:fix # optional fixer
uv run poe format
uv run poe typecheck
uv run poe build

Set UV_PUBLISH_TOKEN before running uv run poe publish to upload to PyPI.

(back to top)

Contact

Brent Rager

Smoo Github: https://github.com/SmooAI

(back to top)

License

MIT © SmooAI

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

History

README.md


SmooAI Logo

About SmooAI

SmooAI is an AI-powered platform for helping businesses multiply their customer, employee, and developer experience.

Learn more on smoo.ai

SmooAI Packages

Check out other SmooAI packages at smoo.ai/open-source

About smooai-logger (Python)

The missing piece for AWS & Browser logging - A contextual logging system that automatically captures the full execution context you need to debug production issues, without the manual setup.

PyPI VersionPyPI DownloadsPyPI Last Update

GitHub LicenseGitHub Actions Workflow StatusGitHub Repo stars

Python Package

This is the Python port of @smooai/logger, mirroring the TypeScript API for backend services. It provides the same contextual logging capabilities with automatic AWS context capture and correlation tracking.

Why smooai-logger?

Ever spent hours debugging an AWS service in production, only to realize you're missing critical context? Traditional loggers give you the message, but not the story.

smooai-logger automatically captures:

For AWS Services:

  • 📍 Exact code location - File, line number, and call stack for every log
  • 🔗 Request journey - Correlation IDs that follow requests across services
  • AWS context - Service-specific metadata and execution details
  • 🌐 HTTP details - Headers, methods, status codes from API Gateway
  • 📬 Message context - SQS attributes, EventBridge events, SNS messages
  • 🔧 Service integration - Lambda, ECS, Fargate, EC2, and more

Install

pip install smooai-logger

or with uv:

uv add smooai-logger

The Power of Automatic Context

See Where Your Logs Come From

Every log entry includes the exact location in your code:

fromsmooai_loggerimportAwsServerLoggerlogger=AwsServerLogger()
logger.info("User created")
# Output includes:
{
"callerContext": {
"stack": [
"at UserService.create_user (/src/services/user_service.py:42:16)",
"at process_request (/src/handlers/user_handler.py:15:23)",
"at handler (/src/index.py:8:10)"
]
}
}

No more guessing which function logged what - the full execution path is right there.

Track Requests Across Services

Correlation IDs automatically flow through your entire system:

# Service A: API Gateway Handlerlogger.add_lambda_context(event, context)
logger.info("Request received") # Correlation ID: abc-123# Service B: SQS Processor (automatically extracts ID)logger.add_sqs_record_context(record)
logger.info("Processing message") # Same Correlation ID: abc-123# Service C: Another Lambda (receives via HTTP header)logger.info("Completing workflow") # Still Correlation ID: abc-123

Production-Ready Examples

AWS Lambda with API Gateway

fromsmooai_loggerimportAwsServerLogger, Levellogger=AwsServerLogger(name="UserAPI")
defhandler(event, context):
logger.add_lambda_context(event, context)
try:
user=create_user(event["body"])
logger.info("User created successfully", {"userId": user.id})
return {"statusCode": 201, "body": json.dumps(user)}
exceptExceptionaserror:
logger.error("Failed to create user", error, {
"body": event["body"],
"headers": event["headers"],
})
raiseerror

AWS ECS/Fargate Services

importosfromsmooai_loggerimportAwsServerLogger, Levellogger=AwsServerLogger(
name="OrderService",
level=Level.INFO,
)
# Automatically captures container metadata@app.post('/orders')asyncdefcreate_order(request):
logger.add_context({
"taskArn": os.environ.get("ECS_TASK_ARN"),
"containerName": os.environ.get("ECS_CONTAINER_NAME"),
})
logger.info("Processing order", {
"orderId": request.json["orderId"],
"amount": request.json["amount"],
})

SQS Message Processing

defsqs_handler(event):
forrecordinevent["Records"]:
logger.add_sqs_record_context(record)
logger.info("Processing order", {
"messageId": record["messageId"],
"attempt": record["attributes"]["ApproximateReceiveCount"],
})
# Logger maintains context throughout async operationsprocess_order(record["body"])

Advanced Features

Smart Error Handling

Errors are automatically serialized with full context:

try:
risky_operation()
exceptExceptionaserror:
logger.error("Operation failed", error, {"context": "additional-info"})
# Includes: error message, stack trace, error type, and your context

Flexible Context Management

# Add user context that persists across logslogger.add_user_context({"id": "user-123", "role": "admin"})
# Add telemetry for performance trackinglogger.add_telemetry_fields({"duration": 150, "operation": "db-query"})
# Add custom context for specific logslogger.info("Payment processed", {
"amount": 99.99,
"currency": "USD",
})

Local Development Features

Pretty Printing

logger=AwsServerLogger(
pretty_print=True# Readable console output for development
)

Automatic Log Rotation

Logs are automatically saved to disk in development with smart rotation:

# Auto-enabled in local environments# Saves to .smooai-logs/ with ANSI colors for easy readinglogger=AwsServerLogger(
rotation={
"size": "10M", # Rotate at 10MB"interval": "1d", # Daily rotation"compress": True, # Gzip old logs
}
)

Configuration

Log Levels

  • TRACE - Detailed debugging information
  • DEBUG - Diagnostic information
  • INFO - General operational information
  • WARN - Warning conditions
  • ERROR - Error conditions
  • FATAL - Critical failures

Context Presets

  • MINIMAL - Essential context only
  • FULL - All available context (default)

Built With

  • Python 3.8+ - Full type hints support
  • AWS SDK Integration - Native support for Lambda, ECS, EC2, and more
  • Automatic environment detection
  • Smart log rotation

Related Packages

Development

uv run poe install-dev
uv run pytest
uv run poe lint
uv run poe lint:fix # optional fixer
uv run poe format
uv run poe typecheck
uv run poe build

Set UV_PUBLISH_TOKEN before running uv run poe publish to upload to PyPI.

(back to top)

Contact

Brent Rager

Smoo Github: https://github.com/SmooAI

(back to top)

License

MIT © SmooAI

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History

README.md


SmooAI Logo

About SmooAI

SmooAI is an AI-powered platform for helping businesses multiply their customer, employee, and developer experience.

Learn more on smoo.ai

SmooAI Packages

Check out other SmooAI packages at smoo.ai/open-source

About smooai-logger (Python)

The missing piece for AWS & Browser logging - A contextual logging system that automatically captures the full execution context you need to debug production issues, without the manual setup.

PyPI VersionPyPI DownloadsPyPI Last Update

GitHub LicenseGitHub Actions Workflow StatusGitHub Repo stars

Python Package

This is the Python port of @smooai/logger, mirroring the TypeScript API for backend services. It provides the same contextual logging capabilities with automatic AWS context capture and correlation tracking.

Why smooai-logger?

Ever spent hours debugging an AWS service in production, only to realize you're missing critical context? Traditional loggers give you the message, but not the story.

smooai-logger automatically captures:

For AWS Services:

  • 📍 Exact code location - File, line number, and call stack for every log
  • 🔗 Request journey - Correlation IDs that follow requests across services
  • AWS context - Service-specific metadata and execution details
  • 🌐 HTTP details - Headers, methods, status codes from API Gateway
  • 📬 Message context - SQS attributes, EventBridge events, SNS messages
  • 🔧 Service integration - Lambda, ECS, Fargate, EC2, and more

Install

pip install smooai-logger

or with uv:

uv add smooai-logger

The Power of Automatic Context

See Where Your Logs Come From

Every log entry includes the exact location in your code:

fromsmooai_loggerimportAwsServerLoggerlogger=AwsServerLogger()
logger.info("User created")
# Output includes:
{
"callerContext": {
"stack": [
"at UserService.create_user (/src/services/user_service.py:42:16)",
"at process_request (/src/handlers/user_handler.py:15:23)",
"at handler (/src/index.py:8:10)"
]
}
}

No more guessing which function logged what - the full execution path is right there.

Track Requests Across Services

Correlation IDs automatically flow through your entire system:

# Service A: API Gateway Handlerlogger.add_lambda_context(event, context)
logger.info("Request received") # Correlation ID: abc-123# Service B: SQS Processor (automatically extracts ID)logger.add_sqs_record_context(record)
logger.info("Processing message") # Same Correlation ID: abc-123# Service C: Another Lambda (receives via HTTP header)logger.info("Completing workflow") # Still Correlation ID: abc-123

Production-Ready Examples

AWS Lambda with API Gateway

fromsmooai_loggerimportAwsServerLogger, Levellogger=AwsServerLogger(name="UserAPI")
defhandler(event, context):
logger.add_lambda_context(event, context)
try:
user=create_user(event["body"])
logger.info("User created successfully", {"userId": user.id})
return {"statusCode": 201, "body": json.dumps(user)}
exceptExceptionaserror:
logger.error("Failed to create user", error, {
"body": event["body"],
"headers": event["headers"],
})
raiseerror

AWS ECS/Fargate Services

importosfromsmooai_loggerimportAwsServerLogger, Levellogger=AwsServerLogger(
name="OrderService",
level=Level.INFO,
)
# Automatically captures container metadata@app.post('/orders')asyncdefcreate_order(request):
logger.add_context({
"taskArn": os.environ.get("ECS_TASK_ARN"),
"containerName": os.environ.get("ECS_CONTAINER_NAME"),
})
logger.info("Processing order", {
"orderId": request.json["orderId"],
"amount": request.json["amount"],
})

SQS Message Processing

defsqs_handler(event):
forrecordinevent["Records"]:
logger.add_sqs_record_context(record)
logger.info("Processing order", {
"messageId": record["messageId"],
"attempt": record["attributes"]["ApproximateReceiveCount"],
})
# Logger maintains context throughout async operationsprocess_order(record["body"])

Advanced Features

Smart Error Handling

Errors are automatically serialized with full context:

try:
risky_operation()
exceptExceptionaserror:
logger.error("Operation failed", error, {"context": "additional-info"})
# Includes: error message, stack trace, error type, and your context

Flexible Context Management

# Add user context that persists across logslogger.add_user_context({"id": "user-123", "role": "admin"})
# Add telemetry for performance trackinglogger.add_telemetry_fields({"duration": 150, "operation": "db-query"})
# Add custom context for specific logslogger.info("Payment processed", {
"amount": 99.99,
"currency": "USD",
})

Local Development Features

Pretty Printing

logger=AwsServerLogger(
pretty_print=True# Readable console output for development
)

Automatic Log Rotation

Logs are automatically saved to disk in development with smart rotation:

# Auto-enabled in local environments# Saves to .smooai-logs/ with ANSI colors for easy readinglogger=AwsServerLogger(
rotation={
"size": "10M", # Rotate at 10MB"interval": "1d", # Daily rotation"compress": True, # Gzip old logs
}
)

Configuration

Log Levels

  • TRACE - Detailed debugging information
  • DEBUG - Diagnostic information
  • INFO - General operational information
  • WARN - Warning conditions
  • ERROR - Error conditions
  • FATAL - Critical failures

Context Presets

  • MINIMAL - Essential context only
  • FULL - All available context (default)

Built With

  • Python 3.8+ - Full type hints support
  • AWS SDK Integration - Native support for Lambda, ECS, EC2, and more
  • Automatic environment detection
  • Smart log rotation

Related Packages

Development

uv run poe install-dev
uv run pytest
uv run poe lint
uv run poe lint:fix # optional fixer
uv run poe format
uv run poe typecheck
uv run poe build

Set UV_PUBLISH_TOKEN before running uv run poe publish to upload to PyPI.

(back to top)

Contact

Brent Rager

Smoo Github: https://github.com/SmooAI

(back to top)

License

MIT © SmooAI

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History

README.md


SmooAI Logo

About SmooAI

SmooAI is an AI-powered platform for helping businesses multiply their customer, employee, and developer experience.

Learn more on smoo.ai

SmooAI Packages

Check out other SmooAI packages at smoo.ai/open-source

About smooai-logger (Python)

The missing piece for AWS & Browser logging - A contextual logging system that automatically captures the full execution context you need to debug production issues, without the manual setup.

PyPI VersionPyPI DownloadsPyPI Last Update

GitHub LicenseGitHub Actions Workflow StatusGitHub Repo stars

Python Package

This is the Python port of @smooai/logger, mirroring the TypeScript API for backend services. It provides the same contextual logging capabilities with automatic AWS context capture and correlation tracking.

Why smooai-logger?

Ever spent hours debugging an AWS service in production, only to realize you're missing critical context? Traditional loggers give you the message, but not the story.

smooai-logger automatically captures:

For AWS Services:

  • 📍 Exact code location - File, line number, and call stack for every log
  • 🔗 Request journey - Correlation IDs that follow requests across services
  • AWS context - Service-specific metadata and execution details
  • 🌐 HTTP details - Headers, methods, status codes from API Gateway
  • 📬 Message context - SQS attributes, EventBridge events, SNS messages
  • 🔧 Service integration - Lambda, ECS, Fargate, EC2, and more

Install

pip install smooai-logger

or with uv:

uv add smooai-logger

The Power of Automatic Context

See Where Your Logs Come From

Every log entry includes the exact location in your code:

fromsmooai_loggerimportAwsServerLoggerlogger=AwsServerLogger()
logger.info("User created")
# Output includes:
{
"callerContext": {
"stack": [
"at UserService.create_user (/src/services/user_service.py:42:16)",
"at process_request (/src/handlers/user_handler.py:15:23)",
"at handler (/src/index.py:8:10)"
]
}
}

No more guessing which function logged what - the full execution path is right there.

Track Requests Across Services

Correlation IDs automatically flow through your entire system:

# Service A: API Gateway Handlerlogger.add_lambda_context(event, context)
logger.info("Request received") # Correlation ID: abc-123# Service B: SQS Processor (automatically extracts ID)logger.add_sqs_record_context(record)
logger.info("Processing message") # Same Correlation ID: abc-123# Service C: Another Lambda (receives via HTTP header)logger.info("Completing workflow") # Still Correlation ID: abc-123

Production-Ready Examples

AWS Lambda with API Gateway

fromsmooai_loggerimportAwsServerLogger, Levellogger=AwsServerLogger(name="UserAPI")
defhandler(event, context):
logger.add_lambda_context(event, context)
try:
user=create_user(event["body"])
logger.info("User created successfully", {"userId": user.id})
return {"statusCode": 201, "body": json.dumps(user)}
exceptExceptionaserror:
logger.error("Failed to create user", error, {
"body": event["body"],
"headers": event["headers"],
})
raiseerror

AWS ECS/Fargate Services

importosfromsmooai_loggerimportAwsServerLogger, Levellogger=AwsServerLogger(
name="OrderService",
level=Level.INFO,
)
# Automatically captures container metadata@app.post('/orders')asyncdefcreate_order(request):
logger.add_context({
"taskArn": os.environ.get("ECS_TASK_ARN"),
"containerName": os.environ.get("ECS_CONTAINER_NAME"),
})
logger.info("Processing order", {
"orderId": request.json["orderId"],
"amount": request.json["amount"],
})

SQS Message Processing

defsqs_handler(event):
forrecordinevent["Records"]:
logger.add_sqs_record_context(record)
logger.info("Processing order", {
"messageId": record["messageId"],
"attempt": record["attributes"]["ApproximateReceiveCount"],
})
# Logger maintains context throughout async operationsprocess_order(record["body"])

Advanced Features

Smart Error Handling

Errors are automatically serialized with full context:

try:
risky_operation()
exceptExceptionaserror:
logger.error("Operation failed", error, {"context": "additional-info"})
# Includes: error message, stack trace, error type, and your context

Flexible Context Management

# Add user context that persists across logslogger.add_user_context({"id": "user-123", "role": "admin"})
# Add telemetry for performance trackinglogger.add_telemetry_fields({"duration": 150, "operation": "db-query"})
# Add custom context for specific logslogger.info("Payment processed", {
"amount": 99.99,
"currency": "USD",
})

Local Development Features

Pretty Printing

logger=AwsServerLogger(
pretty_print=True# Readable console output for development
)

Automatic Log Rotation

Logs are automatically saved to disk in development with smart rotation:

# Auto-enabled in local environments# Saves to .smooai-logs/ with ANSI colors for easy readinglogger=AwsServerLogger(
rotation={
"size": "10M", # Rotate at 10MB"interval": "1d", # Daily rotation"compress": True, # Gzip old logs
}
)

Configuration

Log Levels

  • TRACE - Detailed debugging information
  • DEBUG - Diagnostic information
  • INFO - General operational information
  • WARN - Warning conditions
  • ERROR - Error conditions
  • FATAL - Critical failures

Context Presets

  • MINIMAL - Essential context only
  • FULL - All available context (default)

Built With

  • Python 3.8+ - Full type hints support
  • AWS SDK Integration - Native support for Lambda, ECS, EC2, and more
  • Automatic environment detection
  • Smart log rotation

Related Packages

Development

uv run poe install-dev
uv run pytest
uv run poe lint
uv run poe lint:fix # optional fixer
uv run poe format
uv run poe typecheck
uv run poe build

Set UV_PUBLISH_TOKEN before running uv run poe publish to upload to PyPI.

(back to top)

Contact

Brent Rager

Smoo Github: https://github.com/SmooAI

(back to top)

License

MIT © SmooAI

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

History

README.md


SmooAI Logo

About SmooAI

SmooAI is an AI-powered platform for helping businesses multiply their customer, employee, and developer experience.

Learn more on smoo.ai

SmooAI Packages

Check out other SmooAI packages at smoo.ai/open-source

About smooai-logger (Python)

The missing piece for AWS & Browser logging - A contextual logging system that automatically captures the full execution context you need to debug production issues, without the manual setup.

PyPI VersionPyPI DownloadsPyPI Last Update

GitHub LicenseGitHub Actions Workflow StatusGitHub Repo stars

Python Package

This is the Python port of @smooai/logger, mirroring the TypeScript API for backend services. It provides the same contextual logging capabilities with automatic AWS context capture and correlation tracking.

Why smooai-logger?

Ever spent hours debugging an AWS service in production, only to realize you're missing critical context? Traditional loggers give you the message, but not the story.

smooai-logger automatically captures:

For AWS Services:

  • 📍 Exact code location - File, line number, and call stack for every log
  • 🔗 Request journey - Correlation IDs that follow requests across services
  • AWS context - Service-specific metadata and execution details
  • 🌐 HTTP details - Headers, methods, status codes from API Gateway
  • 📬 Message context - SQS attributes, EventBridge events, SNS messages
  • 🔧 Service integration - Lambda, ECS, Fargate, EC2, and more

Install

pip install smooai-logger

or with uv:

uv add smooai-logger

The Power of Automatic Context

See Where Your Logs Come From

Every log entry includes the exact location in your code:

fromsmooai_loggerimportAwsServerLoggerlogger=AwsServerLogger()
logger.info("User created")
# Output includes:
{
"callerContext": {
"stack": [
"at UserService.create_user (/src/services/user_service.py:42:16)",
"at process_request (/src/handlers/user_handler.py:15:23)",
"at handler (/src/index.py:8:10)"
]
}
}

No more guessing which function logged what - the full execution path is right there.

Track Requests Across Services

Correlation IDs automatically flow through your entire system:

# Service A: API Gateway Handlerlogger.add_lambda_context(event, context)
logger.info("Request received") # Correlation ID: abc-123# Service B: SQS Processor (automatically extracts ID)logger.add_sqs_record_context(record)
logger.info("Processing message") # Same Correlation ID: abc-123# Service C: Another Lambda (receives via HTTP header)logger.info("Completing workflow") # Still Correlation ID: abc-123

Production-Ready Examples

AWS Lambda with API Gateway

fromsmooai_loggerimportAwsServerLogger, Levellogger=AwsServerLogger(name="UserAPI")
defhandler(event, context):
logger.add_lambda_context(event, context)
try:
user=create_user(event["body"])
logger.info("User created successfully", {"userId": user.id})
return {"statusCode": 201, "body": json.dumps(user)}
exceptExceptionaserror:
logger.error("Failed to create user", error, {
"body": event["body"],
"headers": event["headers"],
})
raiseerror

AWS ECS/Fargate Services

importosfromsmooai_loggerimportAwsServerLogger, Levellogger=AwsServerLogger(
name="OrderService",
level=Level.INFO,
)
# Automatically captures container metadata@app.post('/orders')asyncdefcreate_order(request):
logger.add_context({
"taskArn": os.environ.get("ECS_TASK_ARN"),
"containerName": os.environ.get("ECS_CONTAINER_NAME"),
})
logger.info("Processing order", {
"orderId": request.json["orderId"],
"amount": request.json["amount"],
})

SQS Message Processing

defsqs_handler(event):
forrecordinevent["Records"]:
logger.add_sqs_record_context(record)
logger.info("Processing order", {
"messageId": record["messageId"],
"attempt": record["attributes"]["ApproximateReceiveCount"],
})
# Logger maintains context throughout async operationsprocess_order(record["body"])

Advanced Features

Smart Error Handling

Errors are automatically serialized with full context:

try:
risky_operation()
exceptExceptionaserror:
logger.error("Operation failed", error, {"context": "additional-info"})
# Includes: error message, stack trace, error type, and your context

Flexible Context Management

# Add user context that persists across logslogger.add_user_context({"id": "user-123", "role": "admin"})
# Add telemetry for performance trackinglogger.add_telemetry_fields({"duration": 150, "operation": "db-query"})
# Add custom context for specific logslogger.info("Payment processed", {
"amount": 99.99,
"currency": "USD",
})

Local Development Features

Pretty Printing

logger=AwsServerLogger(
pretty_print=True# Readable console output for development
)

Automatic Log Rotation

Logs are automatically saved to disk in development with smart rotation:

# Auto-enabled in local environments# Saves to .smooai-logs/ with ANSI colors for easy readinglogger=AwsServerLogger(
rotation={
"size": "10M", # Rotate at 10MB"interval": "1d", # Daily rotation"compress": True, # Gzip old logs
}
)

Configuration

Log Levels

  • TRACE - Detailed debugging information
  • DEBUG - Diagnostic information
  • INFO - General operational information
  • WARN - Warning conditions
  • ERROR - Error conditions
  • FATAL - Critical failures

Context Presets

  • MINIMAL - Essential context only
  • FULL - All available context (default)

Built With

  • Python 3.8+ - Full type hints support
  • AWS SDK Integration - Native support for Lambda, ECS, EC2, and more
  • Automatic environment detection
  • Smart log rotation

Related Packages

Development

uv run poe install-dev
uv run pytest
uv run poe lint
uv run poe lint:fix # optional fixer
uv run poe format
uv run poe typecheck
uv run poe build

Set UV_PUBLISH_TOKEN before running uv run poe publish to upload to PyPI.

(back to top)

Contact

Brent Rager

Smoo Github: https://github.com/SmooAI

(back to top)

License

MIT © SmooAI