Before you start
Create the project with the CFML integration type.
| What you need | Why it matters |
|---|---|
| Project API token | Authenticates each request to Logister |
| Logister host URL | Used to build the ingest and check-in endpoints |
Access to Application.cfc | Lets you hook uncaught exceptions centrally |
What you get
Use CFML events to make Lucee and ColdFusion failures visible in the same Logister workflow.
| Need | What appears in Logister |
|---|---|
| Catch uncaught CFML exceptions | Inbox issues with CFML exception summary, detail text, and template frames when you include tagContext, tag_context, stacktrace, or stack_trace. |
| Understand the request around the error | Request details from CGI context such as script name, method, and query string. |
| Add performance visibility gradually | Transaction events for requests or CFC methods, span events for request load waterfalls, and metric events for query, cache, or outbound HTTP timings. |
| Watch scheduled tasks | Check-ins for scheduled tasks and cron-style jobs on the monitor page. |
| Keep custom logs close to errors | Log events with request, release, or user metadata in the activity feed and related-log tab. |
Setup flow
Recommended installation path
- Create the project, choose
CFML, and generate an API key. - Add a small
LogisterClient.cfcwrapper aroundcfhttp. - Hook uncaught exceptions into
Application.cfc.onError(). - Send request timings as
transactionevents, request load pieces asspanevents, and query timings asmetricevents.
Tip
Start with uncaught exception capture, then add transactions, spans, metrics, logs, and check-ins one by one as you verify each payload shape.
Start with
Send a structured error event.
POST /api/v1/ingest_eventsLogister accepts the canonical lowercase event envelope and common CFML/Lucee uppercase variants such as EVENT. Nested event keys are normalized too, so eventType, event_type, traceId, and trace_id all map to the expected fields. The endpoint accepts 1,200 requests per minute per API token by default and returns 429 Too Many Requests with retry headers when that limit is exceeded.
application.logister.sendEvent(
eventType = "error",
level = "error",
message = exception.message ?: "Unhandled CFML exception",
context = {
exception = {
type = exception.type ?: "Exception",
detail = exception.detail ?: "",
tagContext = exception.tagContext ?: [],
stacktrace = exception.stackTrace ?: ""
}
}
);request accepted
error visible in project inbox
stack frames rendered from tagContext or stacktraceError handling
Capture uncaught exceptions with Application.cfc.onError().
exception.typeandexception.messagedrive the exception summaryexception.detailimproves the ColdFusion exception panelexception.tagContextorexception.tag_contextpopulates template framesexception.stacktraceorexception.stack_tracecan also render stack frames when tag context is not availablecontext.cgi.script_nameand related CGI fields improve request context
public void function onError(any exception, string eventName) {
application.logister.sendEvent(
eventType = "error",
level = "error",
message = exception.message ?: "Unhandled exception",
context = {
exception = {
type = exception.type ?: "Exception",
detail = exception.detail ?: "",
tagContext = exception.tagContext ?: [],
stacktrace = exception.stackTrace ?: ""
},
cgi = {
script_name = cgi.script_name ?: "",
request_method = cgi.request_method ?: "",
query_string = cgi.query_string ?: ""
}
}
);
}Important
If you omit both tag context and stacktrace fields, Logister can still store the event, but the CFML error view loses the template-frame detail that makes debugging much easier.
Event types
Use structured event types consistently.
| Event type | Typical CFML use |
|---|---|
error | Unhandled exceptions from Application.cfc.onError() or manual rescue paths |
transaction | Request timing, CFC method timing, remote call latency |
span | Root request spans plus child spans for database, render, cache, HTTP, queue, or internal work |
metric | db.query, cache timings, outbound HTTP timings, queue depth, business counters |
log | Application logs with request or release metadata |
check_in | Scheduled jobs, task runners, cron-style heartbeats |
- Error
- Start here so you can confirm payload authentication and exception rendering.
- Transaction
- Add request timings next so the performance view becomes useful quickly.
- Span
- Add root and child spans when you want request load waterfall charts.
- Metric
- Layer in
db.queryand other timings for deeper latency analysis. - Check-in
- Finish with scheduled jobs and cron heartbeats for monitor coverage.
Useful examples
Send one focused event for each CFML workflow you care about.
Request transaction and root span
traceId = createUUID();
requestId = traceId;
rootSpanId = replace(createUUID(), "-", "", "all");
requestDurationMs = getTickCount() - request.startedAt;
application.logister.sendEvent(
eventType = "transaction",
level = "info",
message = cgi.request_method & " " & cgi.script_name,
transactionName = cgi.request_method & " " & cgi.script_name,
durationMs = requestDurationMs,
traceId = traceId,
requestId = requestId,
context = { service = "cfml-web", route = cgi.script_name }
);
application.logister.sendEvent(
eventType = "span",
name = cgi.request_method & " " & cgi.script_name,
kind = "server",
traceId = traceId,
spanId = rootSpanId,
durationMs = requestDurationMs,
context = { route = cgi.script_name, service = "cfml-web" }
);Database metric and scheduled-task check-in
application.logister.sendEvent(
eventType = "metric",
level = "info",
message = "db.query",
durationMs = queryDurationMs,
context = {
value = queryDurationMs,
unit = "ms",
query = "Order lookup",
service = "cfml-web"
}
);
application.logister.sendEvent(
eventType = "check_in",
level = "info",
message = "nightly-reconcile",
checkInSlug = "nightly-reconcile",
checkInStatus = "ok",
expectedIntervalSeconds = 3600,
durationMs = reconcileDurationMs,
context = { service = "cfml-worker" }
);Use transactions for total work, spans for waterfalls, metrics for numeric series, logs for narrative context, and check-ins for scheduled tasks. Keep keys stable and low-cardinality so Insights filters stay useful.
More detail
Need more reference material?
The static docs now carry the CFML setup flow directly. For lower-level payload details, pair this page with the HTTP API guide and Swagger/OpenAPI reference so you can verify exact request shapes and authentication headers.