Plugin logs land in the dev portal logs viewer with full timestamp, level, and tags.
ctx.log("Plugin booted")
ctx.log("User joined", level="info", tags=["onboarding"])
ctx.log("Discord error: " + str(exc), level="error", tags=["discord"])
ctx.log("Custom payload", request_id=ctx.request_id, user_id=event["user_id"])
Levels: info (default), warning, error. Messages cap at 4000 chars, up to 10 tags, and any extra **kwargs (up to 20, 500 chars per value) are stored as JSON detail. ctx.log is fire-and-forget: it does not wait for or check a response.
Inside an interaction handler, ctx.request_id returns a stable correlation ID for the current event — thread it through your log calls so one user action can be grepped as a unit.