Centralized logging is off by default. Setting it up has two parts: wiring the ranetrace log channel into your app and turning it on in your production environment, where logging actually runs.
Route your whole application log to Ranetrace by adding the ranetrace channel to your stack in config/logging.php. This is code, so it deploys to every environment:
// config/logging.php
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['single', 'ranetrace'],
'ignore_exceptions' => false,
],
],
The package registers the ranetrace channel for you, so this stack entry is valid everywhere. Where logging is off the channel is inert: records short-circuit at the handler and nothing is sent, so it is safe in every environment even though it only runs in production.
To forward only specific records instead of your whole log, skip the stack and write to the ranetrace channel directly from anywhere in your app:
use Illuminate\Support\Facades\Log;
Log::channel('ranetrace')->error('Webhook payload missing signature', [
'provider' => 'stripe',
]);
Logging only does something once it is enabled, and it belongs in production, not local development. Set these in your production environment, not just a local .env:
RANETRACE_ENABLED=true
RANETRACE_LOGGING_ENABLED=true
Also set RANETRACE_KEY from your Ranetrace dashboard if it is not already configured. Records at or above notice are forwarded; change the threshold with RANETRACE_LOGGING_LEVEL.
To check the wiring before deploying, set the same flags in your local .env. That sends your development logs to Ranetrace, so treat it as a one-off check rather than a permanent local setting.
Every setting for centralized logging lives under the logging key in config/ranetrace.php. Publish the config with php artisan vendor:publish --tag=ranetrace-config to edit the array, or set the matching env vars:
// config/ranetrace.php
'logging' => [
'enabled' => env('RANETRACE_LOGGING_ENABLED', false),
'queue' => env('RANETRACE_LOGGING_QUEUE', true),
'queue_name' => env('RANETRACE_LOGGING_QUEUE_NAME', 'default'),
'timeout' => env('RANETRACE_LOGGING_TIMEOUT', 10),
'level' => env('RANETRACE_LOGGING_LEVEL', 'notice'),
'excluded_channels' => [
// Channel names that should never be sent to Ranetrace
],
],
| Env var | Config key | Default | What it controls |
|---|---|---|---|
RANETRACE_LOGGING_ENABLED |
logging.enabled |
false |
Turns centralized logging on. While off, the channel stays registered but every record short-circuits at the handler. |
RANETRACE_LOGGING_LEVEL |
logging.level |
notice |
Minimum level forwarded, from debug up to emergency. |
RANETRACE_LOGGING_QUEUE |
logging.queue |
true |
Buffer each captured record and ship it off the request path. Set to false to handle it synchronously. |
RANETRACE_LOGGING_QUEUE_NAME |
logging.queue_name |
default |
Queue the log-capture job is dispatched on. |
RANETRACE_LOGGING_TIMEOUT |
logging.timeout |
10 |
Timeout, in seconds, for the log-capture job. |
| (config only) | logging.excluded_channels |
[] |
Monolog channel names never forwarded. See Excluding channels below. |
Logging also respects the master RANETRACE_ENABLED switch: while it is false, nothing is sent regardless of the options above.
When logging.queue is true, captured records are buffered and shipped by the batch worker. The shared delivery settings (buffer size, buffer TTL, cache store, batch queue name) are tuned by the RANETRACE_BATCH_* options documented in The Worker.
The ranetrace channel is registered for you only when you have not defined one yourself. To customise it (for example a different minimum level), define ranetrace in config/logging.php and your definition always wins:
// config/logging.php
'channels' => [
'ranetrace' => [
'driver' => 'ranetrace',
'level' => env('RANETRACE_LOGGING_LEVEL', 'notice'),
],
],
The handler skips records whose Monolog channel name appears in ranetrace.logging.excluded_channels. The list is empty by default:
// config/ranetrace.php
'logging' => [
'excluded_channels' => [
// Channel names that should never be sent to Ranetrace
],
],
Before a record is sent, Ranetrace redacts secrets to [REDACTED]: values stored under sensitive keys (password, token, api_key, secret, authorization, and similar) and key=value secrets written into the message string, including tokens inside URL-shaped values. Extend the sensitive-key list, which is only ever added to and never shrunk, in config/ranetrace.php:
// config/ranetrace.php
'scrubbing' => [
'extra_keys' => [
'x_internal_signature',
],
],
Scrubbing is defense-in-depth. Avoid deliberately logging secrets regardless.
From RanetraceLogHandler:
... (truncated) suffix.{"_truncated":"Context exceeded 50KB limit and was removed"}.These keep individual log records well under the API's 5 MB request limit.
Ranetrace writes its own diagnostics to a separate, package-owned ranetrace_internal channel (a daily file at storage/logs/ranetrace-internal.log), never back through the ranetrace channel, so capturing your application log cannot create a feedback loop. It is independent of centralized logging and has its own options in config/ranetrace.php:
// config/ranetrace.php
'internal_logging' => [
'enabled' => env('RANETRACE_INTERNAL_LOGGING_ENABLED', true),
'level' => env('RANETRACE_INTERNAL_LOGGING_LEVEL', 'debug'),
'days' => env('RANETRACE_INTERNAL_LOGGING_DAYS', 14),
'stderr_fallback' => env('RANETRACE_INTERNAL_STDERR_FALLBACK', true),
],
| Env var | Default | What it controls |
|---|---|---|
RANETRACE_INTERNAL_LOGGING_ENABLED |
true |
Whether Ranetrace records its own diagnostics at all. |
RANETRACE_INTERNAL_LOGGING_LEVEL |
debug |
Minimum level for the internal channel. |
RANETRACE_INTERNAL_LOGGING_DAYS |
14 |
Days of rotated internal logs to keep. |
RANETRACE_INTERNAL_STDERR_FALLBACK |
true |
Fall back to stderr when the internal log file cannot be written. |
ranetrace_internal is reserved for Ranetrace. Do not route application logs to it or add it to your stack.
php artisan ranetrace:test-logging
The command checks that the feature is enabled, the channel is registered, sends test entries at multiple levels, and prints what's missing if anything.
RANETRACE_LOGGING_ENABLED=false
Records will short-circuit at the handler.