Appearance
user_logs
Access and action events for learners. Append-only (rows are immutable).
- ETL strategy:
append(insert-only; PK used only for retry dedup) - PK:
id
Columns
| Column | Type | Description |
|---|---|---|
id | BIGINT | PK. |
id_tenant | BIGINT | FK → tenants.id. |
id_user | BIGINT | FK → users.id. |
reference | TEXT | Event type. Enum — see below. |
ip | TEXT | Client IP. |
user_agent | TEXT | Browser User-Agent. |
created_at | TIMESTAMPTZ | Event timestamp. |
Enum · reference
The same set is used by admin_logs.reference.
| Value | Meaning |
|---|---|
first_access | First-ever access on the platform. |
session_active | Active-session heartbeat (logged in). |
platform_consent | Platform terms accepted. |
product_consent | Product terms accepted. |
certificate | Certificate generated or downloaded. |
password_reset | "Forgot password" — request or completion. |
Unmapped values (rare) are preserved unchanged.
Patterns
sql
-- Distinct logins per day (last 30 days)
SELECT date_trunc('day', created_at)::date AS day,
count(DISTINCT id_user) AS logged_users
FROM lms.user_logs
WHERE reference = 'session_active'
AND created_at >= now() - interval '30 days'
GROUP BY 1
ORDER BY 1;For trend analysis, prefer
metrics.daily_counters(user_logins), which already aggregates this.