PSR-3 compliant dual logger for PHP 8.1+ with:
- date-based log file structure with configurable subdirectory pattern
- automatic log rotation by file size
- caller location in every log entry (
directory/file.php:line) - automatic anonymization of sensitive fields
- configurable minimum log level for file output
- configurable date format and timezone
composer require mafio69/fast-php-loggeruse Mariusz\Logger\DualLogger;
// one-liner factory
$logger = DualLogger::create('./logs');
$logger->info('Server started');
$logger->warning('Login failed', ['email' => 'jan@example.com', 'token' => 'abc123xyz']);Or with full control:
use Mariusz\Logger\DualLogger;
use Mariusz\Logger\LogFileManager;
use Psr\Log\LogLevel;
$logger = new DualLogger(
new LogFileManager('./logs'),
minLevel: LogLevel::DEBUG,
);Output:
[2026-05-02 01:54:00] [INFO] [Bootstrap/App.php:12] Server started
[2026-05-02 01:54:00] [WARNING] [Auth/Service.php:88] Login failed {"email":"jan****com","token":"a****yz"}
new LogFileManager(
logDir: './logs', // base log directory
maxFileSize: 1048576, // max file size in bytes before rotation (default: 1MB)
maxFiles: 5, // max number of rotated archives to keep (default: 5)
prefix: 'app-', // filename prefix → app-2026-05-02.log
suffix: '-prod', // filename suffix → 2026-05-02-prod.log
dateStructure: 'Y/m', // subdirectory pattern (default: year/month)
)| Value | Path |
|---|---|
'Y/m' (default) |
logs/2026/05/2026-05-02.log |
'Y' |
logs/2026/2026-05-02.log |
'Y/m/d' |
logs/2026/05/02/2026-05-02.log |
'' |
logs/2026-05-02.log (flat) |
| prefix | suffix | filename |
|---|---|---|
'app-' |
'' |
app-2026-05-02.log |
'' |
'-prod' |
2026-05-02-prod.log |
'api-' |
'-v2' |
api-2026-05-02-v2.log |
new DualLogger(
fileManager: new LogFileManager('./logs'),
minLevel: LogLevel::WARNING, // minimum level written to file (default: warning)
dateFormat: 'Y-m-d H:i:s', // timestamp format (default: ISO-like)
timezone: 'Europe/Warsaw', // timezone (default: system timezone)
)| minLevel | Written to file |
|---|---|
LogLevel::DEBUG |
everything |
LogLevel::INFO |
info and above |
LogLevel::WARNING (default) |
warning, error, critical, alert, emergency |
LogLevel::ERROR |
error and above only |
| dateFormat | Output |
|---|---|
'Y-m-d H:i:s' (default) |
2026-05-02 01:54:00 |
'd.m.Y H:i' |
02.05.2026 01:54 |
'c' |
2026-05-02T01:54:00+02:00 |
Sensitive fields in log context are automatically masked — the middle portion is replaced with ****,
keeping ~25% visible at each end so developers can identify values without exposing full data.
$logger->warning('Login failed', [
'email' => 'jan.kowalski@gmail.com', // → jan.****@gmail.com
'token' => 'supersecret123', // → supe****t123
'pesel' => '12345678901', // → 123****901
'password' => 'ab', // → **** (too short)
]);Masked fields: pesel, nip, ssn, passport, email, phone, telefon, password,
token, api_key, secret, session, card, iban, cvv, konto, adres, street and more.
Set APP_ENV=test to suppress STDERR output during tests. In phpunit.xml:
<php>
<env name="APP_ENV" value="test" force="true"/>
</php>Auto-discovered via extra.laravel.providers. No manual registration needed.
Publish config:
php artisan vendor:publish --tag=fast-php-logger-configconfig/php-logger.php:
return [
'log_dir' => storage_path('logs'),
'min_level' => env('LOG_LEVEL', 'warning'),
'date_format' => 'Y-m-d H:i:s',
'timezone' => env('APP_TIMEZONE', ''),
'file' => [
'max_file_size' => 1048576,
'max_files' => 5,
'prefix' => '',
'suffix' => '',
'date_structure' => 'Y/m',
],
];Resolve from container:
$logger = app(\Mariusz\Logger\DualLogger::class);Register the bundle in config/bundles.php:
return [
Mariusz\Logger\Symfony\PhpLoggerBundle::class => ['all' => true],
];Optional config in config/packages/php_logger.yaml:
php_logger:
log_dir: '%kernel.logs_dir%'
min_level: warning
date_format: 'Y-m-d H:i:s'
timezone: ''
file:
max_file_size: 1048576
max_files: 5
prefix: ''
suffix: ''
date_structure: 'Y/m'Inject via autowiring:
use Mariusz\Logger\DualLogger;
class MyService
{
public function __construct(private DualLogger $logger) {}
}composer install
composer test