Scribe
Facebook's legacy Scribe log aggregation daemon, packaged as a Docker image.
Scribe is a server for aggregating log data streamed in real time from a large number of servers. It accepts messages over a Thrift RPC interface and writes them to configurable back-end stores (files, network relays, etc.).
Note: Scribe was open-sourced by Facebook and is now archived at facebookarchive/scribe. This image exists because no official Docker image is available.
Quick Start
docker run -d \
-p 1463:1463 \
-v $(pwd)/logs:/var/log/scribe \
ghcr.io/tiennm99/scribe:2.2
Scribe will listen on port 1463 (Thrift binary protocol) and write incoming log messages to /var/log/scribe inside the container.
Custom Configuration
Mount your own scribe.conf over the default one:
docker run -d \
-p 1463:1463 \
-v $(pwd)/my-scribe.conf:/etc/scribe/scribe.conf:ro \
-v $(pwd)/logs:/var/log/scribe \
ghcr.io/tiennm99/scribe:2.2
Or set SCRIBE_CONFIG to point to a different path inside the container:
docker run -d \
-p 1463:1463 \
-e SCRIBE_CONFIG=/opt/scribe/custom.conf \
-v $(pwd)/custom.conf:/opt/scribe/custom.conf:ro \
-v $(pwd)/logs:/var/log/scribe \
ghcr.io/tiennm99/scribe:2.2
Docker Compose
services:
scribe:
image: ghcr.io/tiennm99/scribe:2.2
ports:
- "1463:1463"
volumes:
- scribe_logs:/var/log/scribe
- ./config/scribe.conf:/etc/scribe/scribe.conf:ro
restart: unless-stopped
volumes:
scribe_logs:
Configuration Reference
The default config at config/scribe.conf demonstrates the most common options:
| Key | Default | Description |
|---|---|---|
port |
1463 |
TCP port scribed listens on |
max_msg_per_second |
100000 |
Rate limit across all categories (0 = unlimited) |
max_msg_size |
16777216 |
Max message size in bytes |
check_interval |
3 |
Seconds between store health checks |
Store Types
| Type | Description |
|---|---|
file |
Write messages to rotating files on disk |
network |
Relay messages to an upstream Scribe instance |
buffer |
Buffer messages in memory with a file fallback |
null |
Discard messages (useful for testing) |
multi |
Fan-out to multiple stores simultaneously |
Full configuration documentation: https://github.com/facebookarchive/scribe/wiki/Scribe-Configuration
Sending Log Messages
Use the Scribe Thrift client library for your language, or a simple Python example:
from scribe import scribe
from thrift.transport import TSocket, TTransport
from thrift.protocol import TBinaryProtocol
socket = TSocket.TSocket(host="localhost", port=1463)
transport = TTransport.TFramedTransport(socket)
protocol = TBinaryProtocol.TBinaryProtocol(trans=transport, strictRead=False, strictWrite=False)
client = scribe.Client(protocol)
transport.open()
log_entry = scribe.LogEntry(category="myapp", message="Hello, Scribe!")
result = client.Log(messages=[log_entry])
transport.close()
Volumes
| Path | Purpose |
|---|---|
/var/log/scribe |
Log output directory (mount a host path or named volume) |
/etc/scribe |
Configuration directory |
Ports
| Port | Protocol | Description |
|---|---|---|
1463 |
TCP | Scribe Thrift RPC interface |
Building Locally
docker build -t scribe:2.2 .
The Dockerfile uses a two-stage build:
- builder – compiles Apache Thrift 0.9.1 and Scribe from source on CentOS 7
- runtime – copies only the compiled binary and required shared libraries