Live demo — this example is server-driven; run the showcase locally for the interactive version.

Log viewer

← Components

Scrollable log surface with line numbers, search highlighting, wrap/nowrap toggle, and inline ANSI color rendering. PatternFly extension component — meant for container logs, build output, audit trails, anything line-oriented.

Examples

Basic

Just the log lines — no toolbar, no line numbers. The scroll container caps height at 37.5rem by default; pass height to override.

2026-05-25T08:00:01.142Z INFO Starting Quarkus 3.35.3 2026-05-25T08:00:01.218Z INFO Listening on http://0.0.0.0:9090 2026-05-25T08:00:02.301Z INFO Initialised PostgreSQL pool (size=20) 2026-05-25T08:00:03.011Z DEBUG Routes registered: 142 2026-05-25T08:00:03.082Z INFO Cache warmup complete (1283 entries) 2026-05-25T08:00:03.514Z WARN Deprecated config key 'quarkus.legacy.foo' — will be removed in 4.0 2026-05-25T08:00:04.622Z INFO Quarkus application ready (3.480s) 2026-05-25T08:00:05.018Z INFO Health check OK 2026-05-25T08:00:06.319Z DEBUG GET /api/users 200 12ms 2026-05-25T08:00:06.518Z DEBUG GET /api/orders 200 18ms 2026-05-25T08:00:07.117Z ERROR Connection refused: redis://cache.internal:6379 — falling back to in-memory cache 2026-05-25T08:00:08.211Z INFO Background job 'cleanup-temp' started 2026-05-25T08:00:09.054Z DEBUG Reaped 412 stale sessions 2026-05-25T08:00:10.700Z INFO Background job 'cleanup-temp' completed in 2489ms 2026-05-25T08:00:12.011Z DEBUG GET /api/projects 200 9ms 2026-05-25T08:00:13.518Z DEBUG POST /api/projects 201 31ms 2026-05-25T08:00:14.001Z WARN Slow query: SELECT * FROM audit_log WHERE user_id = ? (842ms) 2026-05-25T08:00:15.118Z DEBUG GET /api/dashboard 200 11ms 2026-05-25T08:00:16.882Z INFO User 12 signed in from 10.0.4.21 2026-05-25T08:00:18.224Z DEBUG GET /api/users/12 200 6ms 2026-05-25T08:00:20.099Z INFO Scheduler tick at 2026-05-25T08:00:20Z

Line numbers

lineNumbers=true adds pf-m-line-numbers and renders a 1-based index in the gutter.

2026-05-25T08:00:01.142Z INFO Starting Quarkus 3.35.3 2026-05-25T08:00:01.218Z INFO Listening on http://0.0.0.0:9090 2026-05-25T08:00:02.301Z INFO Initialised PostgreSQL pool (size=20) 2026-05-25T08:00:03.011Z DEBUG Routes registered: 142 2026-05-25T08:00:03.082Z INFO Cache warmup complete (1283 entries) 2026-05-25T08:00:03.514Z WARN Deprecated config key 'quarkus.legacy.foo' — will be removed in 4.0 2026-05-25T08:00:04.622Z INFO Quarkus application ready (3.480s) 2026-05-25T08:00:05.018Z INFO Health check OK 2026-05-25T08:00:06.319Z DEBUG GET /api/users 200 12ms 2026-05-25T08:00:06.518Z DEBUG GET /api/orders 200 18ms 2026-05-25T08:00:07.117Z ERROR Connection refused: redis://cache.internal:6379 — falling back to in-memory cache 2026-05-25T08:00:08.211Z INFO Background job 'cleanup-temp' started 2026-05-25T08:00:09.054Z DEBUG Reaped 412 stale sessions 2026-05-25T08:00:10.700Z INFO Background job 'cleanup-temp' completed in 2489ms 2026-05-25T08:00:12.011Z DEBUG GET /api/projects 200 9ms 2026-05-25T08:00:13.518Z DEBUG POST /api/projects 201 31ms 2026-05-25T08:00:14.001Z WARN Slow query: SELECT * FROM audit_log WHERE user_id = ? (842ms) 2026-05-25T08:00:15.118Z DEBUG GET /api/dashboard 200 11ms 2026-05-25T08:00:16.882Z INFO User 12 signed in from 10.0.4.21 2026-05-25T08:00:18.224Z DEBUG GET /api/users/12 200 6ms 2026-05-25T08:00:20.099Z INFO Scheduler tick at 2026-05-25T08:00:20Z

With toolbar

Header slot with a search input and prev/next navigation. Matches highlight in PF pf-m-match yellow; the current match scrolls into view and gets pf-m-current for the active style.

0 / 0
2026-05-25T08:00:01.142Z INFO Starting Quarkus 3.35.3 2026-05-25T08:00:01.218Z INFO Listening on http://0.0.0.0:9090 2026-05-25T08:00:02.301Z INFO Initialised PostgreSQL pool (size=20) 2026-05-25T08:00:03.011Z DEBUG Routes registered: 142 2026-05-25T08:00:03.082Z INFO Cache warmup complete (1283 entries) 2026-05-25T08:00:03.514Z WARN Deprecated config key 'quarkus.legacy.foo' — will be removed in 4.0 2026-05-25T08:00:04.622Z INFO Quarkus application ready (3.480s) 2026-05-25T08:00:05.018Z INFO Health check OK 2026-05-25T08:00:06.319Z DEBUG GET /api/users 200 12ms 2026-05-25T08:00:06.518Z DEBUG GET /api/orders 200 18ms 2026-05-25T08:00:07.117Z ERROR Connection refused: redis://cache.internal:6379 — falling back to in-memory cache 2026-05-25T08:00:08.211Z INFO Background job 'cleanup-temp' started 2026-05-25T08:00:09.054Z DEBUG Reaped 412 stale sessions 2026-05-25T08:00:10.700Z INFO Background job 'cleanup-temp' completed in 2489ms 2026-05-25T08:00:12.011Z DEBUG GET /api/projects 200 9ms 2026-05-25T08:00:13.518Z DEBUG POST /api/projects 201 31ms 2026-05-25T08:00:14.001Z WARN Slow query: SELECT * FROM audit_log WHERE user_id = ? (842ms) 2026-05-25T08:00:15.118Z DEBUG GET /api/dashboard 200 11ms 2026-05-25T08:00:16.882Z INFO User 12 signed in from 10.0.4.21 2026-05-25T08:00:18.224Z DEBUG GET /api/users/12 200 6ms 2026-05-25T08:00:20.099Z INFO Scheduler tick at 2026-05-25T08:00:20Z

Wrap toggle

Header slot with a button that flips pf-m-nowrap on the root. Default is wrapped (break-spaces); nowrap forces single-line entries with horizontal scroll.

Application log
2026-05-25T08:00:01.142Z INFO Starting Quarkus 3.35.3 with profile=prod, classpath=/deployments/lib/main/io.quarkus.quarkus-core-3.35.3.jar:/deployments/lib/main/io.quarkus.quarkus-runtime-3.35.3.jar:/deployments/lib/main/io.quarkus.quarkus-arc-3.35.3.jar:/deployments/lib/main/io.quarkus.quarkus-qute-3.35.3.jar 2026-05-25T08:00:02.301Z INFO Initialised PostgreSQL pool (size=20, jdbc-url=jdbc:postgresql://db.internal:5432/app?currentSchema=public&ApplicationName=quarkus-pha&sslmode=require&sslfactory=org.postgresql.ssl.NonValidatingFactory) 2026-05-25T08:00:03.514Z WARN Deprecated config key 'quarkus.legacy.foo' set to 'bar' — will be removed in 4.0. Migrate to 'quarkus.foo.value' (see https://quarkus.io/guides/config-reference#deprecations for details on the v3→v4 config rename plan). 2026-05-25T08:00:07.117Z ERROR Connection refused: redis://cache.internal:6379 — falling back to in-memory cache. Underlying cause: io.lettuce.core.RedisConnectionException: Unable to connect to cache.internal:6379: connect timed out after 2000 ms 2026-05-25T08:00:14.001Z WARN Slow query (842ms): SELECT a.id, a.user_id, a.action, a.target_type, a.target_id, a.metadata, a.created_at FROM audit_log a WHERE a.user_id = ? AND a.created_at > NOW() - INTERVAL '30 days' ORDER BY a.created_at DESC LIMIT 100

ANSI colors

ansi=true parses ECMA-48 SGR escape codes (8 standard colors, 8 bright variants, bold, reset) into inline-styled spans. Useful for piping npm, cargo, CI logs verbatim.

[OK] Pulling base image registry.access.redhat.com/ubi9/openjdk-25-runtime:1.24 [OK] Resolving dependencies 45 artifacts [WARN] Snapshot dependency in build org.acme:experimental:1.0-SNAPSHOT [OK] Compiling sources 42 files [FAIL] Test failed OrderServiceTest.placeOrder_validatesStock [INFO] Coverage report 87.4% lines, 74.1% branches [BUILD] Packaging quarkus-app 123ms [OK] Build succeeded in 18.42s

Streaming (SSE)

Live tail via Server-Sent Events. The log list subscribes to /api/htmx/log-stream through the HTMX SSE extension; each event's HTML is appended to the list and the viewer auto-scrolls to the new bottom. The Quarkus endpoint returns a Multi<String> reactive stream from Mutiny. For real apps, replace the demo ticker with your log source (file tail, Kafka topic, audit log query).

Live tail streaming via SSE
Waiting for stream...

Documentation

Log-viewer props

Parameters accepted by {#include components/extensions/log-viewer ... /}. lines is a list of strings, one per log row.

* required
Name Type Default Description
* id String DOM id on the log-viewer root.
* lines List<String> One element per log row.
lineNumbers boolean false Show a 1-based index in the gutter.
nowrap boolean false Adds pf-m-nowrap — single-line entries with horizontal scroll.
height String (CSS length) 37.5rem Override the scroll-container height. Accepts any CSS length.
ansi boolean false Parse ANSI escape codes into colored spans.
ariaLabel String "Log content" Override the list's aria-label.
withHeader boolean false Render an __header wrapper around the header slot.
withFooter boolean false Render an __footer wrapper around the footer slot.

Usage

Search. The Alpine factory exposes setQuery(q), nextMatch(), prevMatch(), matchCount, and currentIndex. Wire a search input to setQuery and bind buttons to the prev/next methods — see the With toolbar example.

Wrap toggle. Call toggleWrap() from a button and read wrapped to label the action — see the Wrap toggle example.

Scroll-to-bottom. scrollToBottom() jumps the container to its bottom. Pair with a "Tail" toggle button, or call it after an HTMX swap appends new lines, to keep the most recent content in view.

Streaming. Server-rendered. To live-update, swap the __list contents via HTMX (planned: SSE for true tail behavior).