samdark/yii2-psr-log-target
Yii2 log target that forwards Yii log messages to any PSR-3 logger (e.g., Monolog). Configure PsrTarget in the log component, choose levels, and optionally add real event timestamps to the log context for accurate timing.
Installation:
composer require samdark/yii2-psr-log-target
Add to config/web.php or config/console.php:
'components' => [
'log' => [
'targets' => [
[
'class' => \samdark\psr\PsrTarget::class,
'logger' => $yourPsr3Logger, // e.g., Monolog, Symfony Logger
],
],
],
],
First Use Case:
Log a debug message via Yii’s Yii::debug() or Yii::error()—it will now route to your PSR-3 logger (e.g., Monolog’s file/slack handler).
Bridge Yii Logging to PSR-3:
PsrTarget to forward Yii’s log levels (debug, info, warning, error, trace) to PSR-3’s log() method with mapped severity:
// Yii level → PSR-3 severity
Yii::debug('Test') // PSR-3: DEBUG
Yii::error('Oops') // PSR-3: ERROR
Centralized Logging:
$monolog = new \Monolog\Logger('name', [
new \Monolog\Handler\StreamHandler('/path/to/log'),
new \Monolog\Handler\SlackHandler('webhook'),
]);
Yii::$app->log->targets = [new PsrTarget(['logger' => $monolog])];
Dynamic Targets:
dev → console, prod → file):
if (Yii::$app->environment === 'prod') {
Yii::$app->log->targets = [new PsrTarget(['logger' => $prodLogger])];
}
Yii::debug($msg, $context)—PsrTarget forwards it to PSR-3’s log() as extra data.Yii::error($exception) to log exceptions with stack traces (PSR-3’s ERROR level).BufferHandler).Level Mismatch:
trace level maps to PSR-3’s DEBUG (not TRACE). Override via levelMap config:
'levelMap' => [
\yii\log\Logger::TRACE => \Psr\Log\LogLevel::DEBUG, // Custom mapping
],
Circular Dependencies:
PsrTarget (risk of infinite loops).Thread Safety:
PsrTarget only in single-threaded Yii apps (e.g., CLI, non-queue workers).PsrTarget with a StreamHandler to confirm logs are routed:
new PsrTarget(['logger' => new \Monolog\Logger('test', [new \Monolog\Handler\StreamHandler('php://stdout')])]),
Yii::debug('Test', ['level' => \yii\log\Logger::TRACE]) to test edge cases.Custom PSR-3 Logger:
Psr\Log\LoggerInterface for domain-specific logging (e.g., AWS CloudWatch):
$logger = new CustomPsrLogger();
Yii::$app->log->targets = [new PsrTarget(['logger' => $logger])];
Pre/Post-Processing:
PsrTarget to modify messages or context before logging:
class CustomPsrTarget extends PsrTarget {
public function log($level, $message, $context = []) {
$context['custom_key'] = 'value';
parent::log($level, $message, $context);
}
}
Conditional Logging:
PsrTarget::log():
if (Yii::$app->user->isGuest) return;
parent::log($level, $message, $context);
How can I help you explore Laravel packages today?