larsgmortensen / litelog
Ultra-fast, lightweight JSON logger for PHP with atomic append and safe log rotation.
Requires
- php: >=8.0
- ext-json: *
README
LiteLog is a fast, minimal, efficient, single-file JSON logger focused on robustness and runtime performance.
It provides atomic appends, safe log rotation, and strict error handling with zero dependencies.
Designed for high-traffic PHP applications that require reliable logging without external bloat (PHP 8.0+).
π Features that make LiteLog stand out
- Blazing-fast writes β Appends JSON lines with atomic
LOCK_EX
safety. - Safe concurrency β Multiple processes can write concurrently without losing lines.
- Log rotation β Automatically rotates logs when file size exceeds threshold.
- Retention policy β Configurable pruning of old rotated logs.
- JSON by default β Structured, machine-readable logs with
timestamp
,category
,message
, and optionalcontext
. - Error-hardening β Fails fast if directory is missing, not writable, or JSON encoding fails.
- Minimal overhead β One file, static API, no runtime dependencies.
- Secure by default β Filenames are sanitized to prevent path traversal attacks.
- Production-ready β Verified by functional, benchmark, and concurrency tests.
π¦ Installation
Via Composer (recommended):
composer require larsgmortensen/litelog
Or manually include the class file (e.g. src/LiteLog/LiteLog.php
) with Composerβs autoloader or require_once
:
use LiteLog\LiteLog; require_once __DIR__.'/src/LiteLog/LiteLog.php';
Tip: Always place your log directory outside webroot, or protect it with
.htaccess
.
π Quick Start
use LiteLog\LiteLog; // Configure once at bootstrap LiteLog::setDefaultDir('/path/to/logs'); LiteLog::setMaxFileSize(10 * 1024 * 1024); // 10 MB LiteLog::setMaxRotatedFiles(5); // keep 5 rotated files // Write a log line LiteLog::log( 'app.json', // Log filename (relative to log dir) 'info', // Category 'Coffee supply is critically low', // Message (string or array) ['cups_left' => 1, 'developer' => 'Sleepy'] // Context (optional) );
Example log output (JSON line)
{ "timestamp": "2025-09-18 02:53:18", "category": "warning", "message": "Coffee supply is critically low", "context": { "cups_left": 1, "developer": "Sleepy" } }
π§° API
LiteLog::setDefaultDir(string $dir, bool $createIfMissing = false): void LiteLog::setMaxFileSize(int $bytes): void LiteLog::setMaxRotatedFiles(?int $count): void LiteLog::log(string $file, string $category, string|array|object $message, array $context = []): void
Parameters
- $dir: Log directory (must exist unless
$createIfMissing=true
). - $file: Filename (e.g.
app.json
). Must be a clean name, no path traversal. - $category: Category string (
error
,info
, etc.). - $message: String, array, or object. Arrays/objects are JSON-encoded automatically.
- $context: Optional associative array with extra metadata (e.g., request id, ip).
- $bytes: Maximum file size before rotation. Default: 10 MB.
- $count: Number of rotated logs to keep.
null
disables pruning.
π Usage Notes
- All log entries are one JSON line per entry β easy to parse with tools like
jq
or ELK. - Rotation creates files like
app_1695030618123.json
. - If retention is set, only the latest N rotated logs are kept; older are pruned.
- Fail-fast philosophy: if directory is missing or not writable, LiteLog throws immediately.
π§ͺ Tests
LiteLog is verified by three test suites:
-
Sanity tests (
test_litelog_new.php
) Validates JSON encoding, rotation, retention, and path sanitization. -
Benchmarks (
bench_litelog.php
,bench_litelog_web.php
) Measures performance vs. old implementation. Results (shared hosting, 100k lines):- OLD: ~1643 ops/s
- NEW: ~1476 ops/s (β10% overhead for safe locking)
-
Concurrency test (
concurrency_run.php
) Spawns multiple parallel PHP processes writing to the same log file. β 400 000 lines written without loss or duplication under rotation.
π‘ Why LiteLog?
LiteLog exists for developers who want reliable structured logging without dragging in heavy frameworks.
β¨ Fast β 1.5β2k ops/s even on modest hardware.
β¨ Safe β Atomic writes, no lost lines under concurrency.
β¨ Structured β JSON lines are machine-readable.
β¨ Lightweight β One file, static API, no dependencies.
β¨ Robust β Strict error handling, sanitization, rotation + retention built-in.
π¦ Packagist
LiteLog on Packagist: π https://packagist.org/packages/larsgmortensen/litelog
π License
LiteLog is released under the GNU General Public License v3.0. See LICENSE for details.
π€ Contributing
Contributions are welcome! Fork, submit issues, or open a pull request.
βοΈ Author
Developed by Lars Grove Mortensen Β© 2025. Feel free to reach out or contribute!
LiteLog β the lightweight JSON logger you can trust π
π If you find this library useful, give it a star on GitHub! π