Spiral supplied with simple PSR-3 compatible bridge to get access to a channel specific logger instance.
Default LogsFactory
implementation is based on Monolog Logger and Monolog Handlers.
You can always write information into global instance of logger by requesting it as dependency:
public function indexAction(LoggerInterface $logs)
{
$logs->alert('alert');
}
If you wish to use custom logger for your classes you can either create it manually using LogsInterface
as factory:
public function indexAction(LogsInterface $logs)
{
$logs->getLogger('channel')->alert('alert');
}
Or use Spiral\Debug\Traits\LoggerTrait
to automatically receive class specific logger:
use LoggerTrait;
public function indexAction()
{
$this->getLogger()->alert('alert');
}
Note, LoggerTrait will only work inside application IoC scope.
You can configure any of your log channel to write it's content using Monolog compatible handlers, do that using "monolog" configuration file:
return [
/*
* This is default spiral logger, all error messages are passed into it.
*/
\Spiral\Debug\LogManager::DEBUG_CHANNEL => [
[
'handler' => \Monolog\Handler\RotatingFileHandler::class,
'format' => "[%datetime%] %level_name%: %message%\n",
'options' => [
'level' => \Psr\Log\LogLevel::ERROR,
'maxFiles' => 1,
'filename' => directory('runtime') . 'logs/errors.log',
'bubble' => false
],
],
/*{{handlers.debug}}*/
],
/*
* Such middleware provides ability to isolate ClientExceptions into nice error pages. You can
* use it's log to collect http errors.
*/
HttpErrors::class => [
[
'handler' => \Monolog\Handler\RotatingFileHandler::class,
'format' => "[%datetime%] %message%\n",
'options' => [
'level' => \Psr\Log\LogLevel::ERROR,
'maxFiles' => 7,
'filename' => directory('runtime') . 'logs/http.log'
],
],
/*{{handlers.http}}*/
],
/*{{handlers}}*/
];
For example, we can specify that all error messages created by IndexController must be stored in a log file:
class IndexController extends Controller
{
use LoggerTrait;
public function indexAction()
{
$this->getLogger()->alert('alert');
}
}
You can use your class name as channel in "monolog" configuration:
\Controllers\IndexController::class => [
[
'handler' => \Monolog\Handler\RotatingFileHandler::class,
'format' => "[%datetime%] %level_name%: %message%\n",
'options' => [
'level' => \Psr\Log\LogLevel::ERROR,
'filename' => directory('runtime') . 'logs/index-controller.log',
'maxFiles' => 1,
],
],
],
Feel free to create your own implementation of
LogsInterface
.