PostHog
Capture logs as PostHog events linked to persons
Send logs to PostHog as captured events. Each log becomes an event with dot-notation properties you can use in filters, insights, and cohorts — and logs carrying a user ID link to PostHog persons automatically.
Setup
- Copy your project API key (
phc_…) from Settings → Project → Project API Key. - Set the environment variables:
POSTHOG_API_KEY=phc_your-project-key
POSTHOG_HOST=https://us.i.posthog.com # or https://eu.i.posthog.com
- Wire the transport:
import { Elysia } from 'elysia'
import logixlysia from 'logixlysia'
import { createPostHogTransport } from 'logixlysia/posthog'
const app = new Elysia()
.use(
logixlysia({
config: {
transports: [createPostHogTransport()]
}
})
)
.get('/', () => 'ok')
.listen(3000)
- Trigger a request and find
logixlysia_logevents in the activity explorer.
Environment Variables
| Variable | Required | Description |
|---|---|---|
POSTHOG_API_KEY |
Yes | Project API key (phc_…) |
POSTHOG_HOST |
No | Instance URL — US cloud (default), EU cloud, or self-hosted |
Options
const posthog = createPostHogTransport({
distinctIdField: 'context.accountId',
eventName: 'api_log'
})
| Option | Type | Default | Description |
|---|---|---|---|
apiKey |
string |
POSTHOG_API_KEY |
Project API key |
host |
string |
https://us.i.posthog.com |
PostHog instance URL |
eventName |
string |
logixlysia_log |
Name of the captured event |
distinctIdField |
string |
context.userId |
Meta path resolved per log to distinct_id |
distinctId |
string |
logixlysia-server |
Static fallback when the field resolves to nothing |
Plus the shared batching options: maxBatchSize, flushIntervalMs, timeout, retries — see the overview.
Payload
Logs post to {host}/batch/. Each event carries flat, chart-friendly properties:
| Property | Example |
|---|---|
level |
INFO |
message |
GET /users |
request.method |
GET |
status |
200 |
durationMs |
12.4 |
context.requestId |
0d5e… |
PostHog processes events asynchronously — expect them to appear within about a minute.
Linking Logs to Persons
Merge a user ID into the request context and the log’s distinct_id resolves to it:
app.get('/profile', ({ log, userId }) => {
log.mergeContext({ userId })
return getProfile(userId)
})
Point distinctIdField at any other meta path (dot notation) if your identifier lives elsewhere. Without an identifier, events fall back to the static distinctId — handy for a backend acting as a single identity.
Troubleshooting
401— the key is not a project API key; it must start withphc_.- Events missing — check the region: EU projects must use
https://eu.i.posthog.com. - High event volume — log levels you don’t need can be excluded with
logFilterbefore they reach the transport.