$npx -y skills add Impertio-Studio/Frappe_Claude_Skill_Package --skill frappe-core-loggingUse when implementing logging, error tracking, or monitoring in Frappe v14-v16. Covers frappe.logger() for file-based logging, frappe.log_error() for Error Log DocType entries, request logging, Sentry integration, and production logging patterns. Prevents common mistakes with pri
| 1 | # Frappe Logging & Error Tracking |
| 2 | |
| 3 | ## Three Logging Mechanisms |
| 4 | |
| 5 | | Mechanism | Storage | Use For | |
| 6 | |-----------|---------|---------| |
| 7 | | `frappe.logger()` | File (rotating) | Application logging, debug info, audit trails | |
| 8 | | `frappe.log_error()` | Database (Error Log DocType) | Errors visible in admin UI, persistent tracking | |
| 9 | | `frappe.log()` / `frappe.errprint()` | stderr / request-scoped | Quick debugging only (NOT for production) | |
| 10 | |
| 11 | --- |
| 12 | |
| 13 | ## Decision Tree |
| 14 | |
| 15 | ``` |
| 16 | Need to log something? |
| 17 | │ |
| 18 | ├─ Application logging (info, debug, warnings)? |
| 19 | │ └─ frappe.logger("my_module").info("message") |
| 20 | │ → Writes to sites/{site}/logs/my_module.log |
| 21 | │ |
| 22 | ├─ Error that admins should see in Desk UI? |
| 23 | │ └─ frappe.log_error(title="Short desc", message=traceback) |
| 24 | │ → Creates Error Log document (queryable, auto-cleanup) |
| 25 | │ |
| 26 | ├─ Quick debug during development? |
| 27 | │ └─ frappe.errprint(variable) — shows in console |
| 28 | │ → NEVER leave in production code |
| 29 | │ |
| 30 | ├─ Track all HTTP requests? |
| 31 | │ └─ Set enable_frappe_logger: true in site_config.json |
| 32 | │ → Logs to frappe.web.log |
| 33 | │ |
| 34 | ├─ Performance monitoring? |
| 35 | │ └─ Set monitor: true in site_config.json |
| 36 | │ → Logs to monitor.json.log (JSON, per-request metrics) |
| 37 | │ |
| 38 | └─ External error tracking (Sentry)? |
| 39 | └─ Set FRAPPE_SENTRY_DSN environment variable |
| 40 | → Auto-captures unhandled exceptions |
| 41 | ``` |
| 42 | |
| 43 | --- |
| 44 | |
| 45 | ## Quick Reference: frappe.logger() |
| 46 | |
| 47 | ```python |
| 48 | # Get a logger for your module (ALWAYS specify module name) |
| 49 | logger = frappe.logger("my_app") |
| 50 | |
| 51 | # Standard Python logging levels |
| 52 | logger.debug("Detailed diagnostic info") |
| 53 | logger.info("Normal operations: processed 50 records") |
| 54 | logger.warning("Something unexpected but recoverable") |
| 55 | logger.error("Operation failed", exc_info=True) |
| 56 | logger.critical("System-level failure") |
| 57 | |
| 58 | # Full signature |
| 59 | frappe.logger( |
| 60 | module=None, # Logger name + log filename |
| 61 | with_more_info=False, # Auto-log request form_dict |
| 62 | allow_site=True, # Log under site's logs/ directory |
| 63 | filter=None, # Custom logging.Filter |
| 64 | max_size=100_000, # Max bytes per log file (100KB default) |
| 65 | file_count=20 # Rotated files retained (20 default) |
| 66 | ) |
| 67 | ``` |
| 68 | |
| 69 | **Log location:** `sites/{site}/logs/{module}.log` |
| 70 | **Rotation:** RotatingFileHandler — 100KB per file, 20 backups (~2MB total per logger) |
| 71 | |
| 72 | ### Default Log Levels |
| 73 | |
| 74 | | Mode | Level | Effect | |
| 75 | |------|-------|--------| |
| 76 | | Development (`_dev_server`) | WARNING | Debug/info suppressed | |
| 77 | | Production | ERROR | Only errors and above | |
| 78 | |
| 79 | ```python |
| 80 | # Change level dynamically |
| 81 | frappe.utils.logger.set_log_level("DEBUG") |
| 82 | ``` |
| 83 | |
| 84 | --- |
| 85 | |
| 86 | ## Quick Reference: frappe.log_error() |
| 87 | |
| 88 | ```python |
| 89 | # ALWAYS use keyword arguments (title/message can swap otherwise) |
| 90 | frappe.log_error( |
| 91 | title="Payment gateway timeout", # Short description (140 chars max) |
| 92 | message=frappe.get_traceback(), # Full error details |
| 93 | reference_doctype="Payment Entry", # Related DocType |
| 94 | reference_name="PE-00001" # Related document |
| 95 | ) |
| 96 | |
| 97 | # Minimal — auto-captures current traceback |
| 98 | try: |
| 99 | risky_operation() |
| 100 | except Exception: |
| 101 | frappe.log_error(title="Operation failed") |
| 102 | ``` |
| 103 | |
| 104 | **Error Log cleanup:** Auto-deletes after 30 days. Manual: `frappe.whitelist: clear_error_logs()` |
| 105 | |
| 106 | ### Auto-Captured Exceptions |
| 107 | |
| 108 | Unhandled exceptions (HTTP 500+) are automatically logged to Error Log. |
| 109 | |
| 110 | **Excluded from auto-capture:** |
| 111 | - `frappe.AuthenticationError` |
| 112 | - `frappe.CSRFTokenError` |
| 113 | - `frappe.SecurityException` |
| 114 | - `frappe.InReadOnlyMode` |
| 115 | |
| 116 | --- |
| 117 | |
| 118 | ## Production Configuration |
| 119 | |
| 120 | ### site_config.json Keys |
| 121 | |
| 122 | | Key | Value | Effect | |
| 123 | |-----|-------|--------| |
| 124 | | `enable_frappe_logger` | `true` | HTTP request logging → `frappe.web.log` | |
| 125 | | `logging` | `2` | Log all SQL queries (debug only!) | |
| 126 | | `monitor` | `true` | Request/job metrics → `monitor.json.log` | |
| 127 | | `disable_error_snapshot` | `true` | Disable auto-capture of exceptions | |
| 128 | |
| 129 | ### Environment Variables |
| 130 | |
| 131 | | Variable | Effect | |
| 132 | |----------|--------| |
| 133 | | `FRAPPE_STREAM_LOGGING=1` | Log to stderr instead of files | |
| 134 | | `FRAPPE_SENTRY_DSN=<dsn>` | Enable Sentry error tracking | |
| 135 | | `ENABLE_SENTRY_DB_MONITORING` | Track SQL queries in Sentry | |
| 136 | | `SENTRY_TRACING_SAMPLE_RATE` | Performance tracing rate (0.0-1.0) | |
| 137 | |
| 138 | ### Production Log Files |
| 139 | |
| 140 | | File | Content | |
| 141 | |------|---------| |
| 142 | | |