View and analyze Frappe bench logs with filtering and search capabilities
View, filter, and analyze Frappe bench logs including web server, background workers, scheduler, and error logs.
/plugin marketplace add Venkateshvenki404224/frappe-apps-manager/plugin install frappe-apps-manager@frappe-marketplaceView, filter, and analyze Frappe bench logs including web server, background workers, scheduler, and error logs.
logs/ directoryAsk user which logs to view:
A. Web Server Logs
logs/web.log - Werkzeug development server logslogs/web.error.log - Web server error logsB. Worker Logs
logs/worker.log - Background job worker logslogs/worker.error.log - Worker errorsC. Scheduler Logs
logs/schedule.log - Scheduled task logsD. Site-specific Logs
sites/[site-name]/logs/ - Per-site logsE. All Logs
Offer filtering and display options:
Time-based:
Level-based:
Pattern-based:
Based on user choice, execute appropriate command:
View Recent Web Logs:
tail -n 50 logs/web.log
View Error Logs Only:
tail -n 100 logs/web.error.log
Follow Logs in Real-time:
tail -f logs/web.log
Search for Specific Pattern:
grep "pattern" logs/web.log | tail -n 50
View Logs with Timestamps:
tail -n 50 logs/web.log | grep -E '^\[.*\]'
Multiple Log Files:
tail -n 20 logs/web.log logs/worker.log logs/schedule.log
Parse and display logs in readable format:
Standard Format:
[2025-12-15 14:30:45] ERROR: ValidationError in Document Customer
File: frappe/model/document.py, Line: 234
User: user@example.com
Message: Email is required
Structured Display:
Identify and highlight common error patterns:
Database Errors:
Permission Errors:
Validation Errors:
API Errors:
For each error found:
Generate summary statistics:
Error Count by Type:
ValidationError: 15
PermissionError: 8
DatabaseError: 3
TimeoutError: 1
Error Frequency Timeline:
14:00-14:30: 5 errors
14:30-15:00: 12 errors
15:00-15:30: 2 errors
Top Error Sources:
1. frappe.model.document (10 errors)
2. erpnext.accounts.doctype.sales_invoice (5 errors)
3. custom_app.api (3 errors)
Offer advanced analysis:
Trace Request Flow:
Performance Analysis:
User Activity:
Provide log management options:
Archive Old Logs:
# Rotate logs
bench --site [site-name] rotate-logs
# Archive logs older than 30 days
find logs/ -name "*.log" -mtime +30 -exec gzip {} \;
Clear Logs:
# Clear specific log
> logs/web.log
# Clear all logs (with confirmation)
rm logs/*.log
Export Logs:
# Export filtered logs
grep "ERROR" logs/web.log > error_report.txt
# Export with timestamp range
awk '/2025-12-15 14:00/,/2025-12-15 15:00/' logs/web.log > incident_logs.txt
Development Logs:
logs/
├── web.log # Werkzeug dev server logs
├── web.error.log # Web server errors
├── worker.log # Background worker logs
├── worker.error.log # Worker errors
├── schedule.log # Scheduled tasks
└── redis_cache.log # Redis cache operations
Production Logs (with Nginx/Supervisor):
logs/
├── nginx-access.log # Nginx access logs
├── nginx-error.log # Nginx errors
├── frappe-web.log # Gunicorn web logs
├── frappe-worker.log # RQ worker logs
└── supervisor.log # Supervisor process logs
Site-specific Logs:
sites/[site-name]/
├── logs/
│ ├── request.log # HTTP request logs
│ └── error.log # Site-specific errors
└── site_config.json
Web Server Log Entry:
[2025-12-15 14:30:45,123] INFO in app: 127.0.0.1 - - [15/Dec/2025 14:30:45] "GET /api/resource/Customer/CUST-001 HTTP/1.1" 200 -
Error Log Entry:
[2025-12-15 14:30:45] ERROR:
Traceback (most recent call last):
File "frappe/app.py", line 82, in application
response = frappe.api.handle()
File "frappe/api.py", line 51, in handle
return frappe.handler.handle()
ValidationError: Email is required in row 1
Worker Log Entry:
[2025-12-15 14:30:45] INFO Worker rq:worker:worker-1 started
[2025-12-15 14:30:46] INFO Job frappe.email.queue.flush queued
[2025-12-15 14:30:47] INFO Job frappe.email.queue.flush finished
Pattern:
ERROR: could not connect to server: Connection refused
ERROR: OperationalError: (2002, "Can't connect to local MySQL server")
Solution:
Pattern:
PermissionError: You need {permission} permission for {doctype}
frappe.exceptions.PermissionError: Insufficient Permission for Customer
Solution:
bench --site [site] consolePattern:
ERROR in import: frappe.exceptions.DataImportError
ERROR: Duplicate entry 'CUST-001' for key 'PRIMARY'
Solution:
Frappe Logging Implementation:
ERPNext Logging Patterns:
Real Logging Examples from Core:
# See: frappe/utils/logger.py
import frappe
from frappe.utils.logger import get_logger
logger = get_logger("my_app")
logger.info("Processing started")
logger.error("Error occurred", exc_info=True)
# See: erpnext/accounts/doctype/payment_entry/payment_entry.py
try:
doc.submit()
except Exception as e:
frappe.log_error(
title="Payment Entry Submission Failed",
message=frappe.get_traceback()
)
# See: frappe/integrations/doctype/webhook/webhook.py
if frappe.conf.developer_mode:
frappe.logger().debug(f"Webhook payload: {payload}")
Parse Logs with Python:
import re
from datetime import datetime
# Parse Frappe log entries
log_pattern = r'\[(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})\] (\w+): (.+)'
with open('logs/web.log', 'r') as f:
for line in f:
match = re.match(log_pattern, line)
if match:
timestamp, level, message = match.groups()
if level == 'ERROR':
print(f"{timestamp}: {message}")
Monitor Multiple Logs:
# Watch all error logs
watch -n 1 'tail -n 5 logs/*.error.log'
# Monitor specific pattern
tail -f logs/web.log | grep --line-buffered "ERROR"
# Colored output
tail -f logs/web.log | grep --color=always -E "ERROR|WARNING|$"
Combine and Sort Logs:
# Merge logs by timestamp
cat logs/web.log logs/worker.log | sort
# Count errors by type
grep "ERROR" logs/*.log | cut -d: -f3 | sort | uniq -c | sort -rn
Find Slow API Calls:
# Look for requests taking > 1 second
grep "completed in" logs/web.log | awk '$NF > 1.0'
Database Query Performance:
# Find slow queries in logs
grep "query took" logs/web.log | sort -k4 -rn | head -20
Monitor Worker Memory:
# Check worker logs for memory issues
grep -i "memory" logs/worker.log
.gz) to save spaceNo logs appearing:
Logs too verbose:
Disk space issues: