Commit 121f3f2b authored by Igor Wiedler's avatar Igor Wiedler

Allow strings for levels in the monolog service provider

The monolog service provider requires a constant on Monolog\Logger to be
referenced, which has an integer value. This is not very practical when
working with external configuration files.

This patch accepts strings like debug, info, error, etc. that are
translated to the corresponding logger constant values.

This is an alternative to #882.
parent 282628dc
......@@ -19,6 +19,8 @@ Parameters
everything, ``INFO`` will log everything except ``DEBUG``,
etc.
May also be a string of ``DEBUG``, ``INFO``, ``WARNING``, ``ERROR``.
* **monolog.name** (optional): Name of the monolog channel,
defaults to ``myapp``.
......
......@@ -36,7 +36,8 @@ class MonologServiceProvider implements ServiceProviderInterface
if ($bridge = class_exists('Symfony\Bridge\Monolog\Logger')) {
$app['monolog.handler.debug'] = function () use ($app) {
return new DebugHandler($app['monolog.level']);
$level = static::translateLevel($app['monolog.level']);
return new DebugHandler($level);
};
}
......@@ -55,7 +56,8 @@ class MonologServiceProvider implements ServiceProviderInterface
});
$app['monolog.handler'] = function () use ($app) {
return new StreamHandler($app['monolog.logfile'], $app['monolog.level']);
$level = static::translateLevel($app['monolog.level']);
return new StreamHandler($app['monolog.logfile'], $level);
};
$app['monolog.level'] = function () {
......@@ -92,4 +94,21 @@ class MonologServiceProvider implements ServiceProviderInterface
}
});
}
public static function translateLevel($name)
{
// level is already translated to logger constant, return as-is
if (is_int($name)) {
return $name;
}
$levels = Logger::getLevels();
$upper = strtoupper($name);
if (!isset($levels[$upper])) {
throw new \InvalidArgumentException("Provided logging level '$name' does not exist. Must be a valid monolog logging level.");
}
return $levels[$upper];
}
}
......@@ -136,6 +136,26 @@ class MonologServiceProviderTest extends \PHPUnit_Framework_TestCase
$this->assertEmpty($app['monolog.handler']->getRecords(), "Expected no logging to occur");
}
public function testStringErrorLevel()
{
$app = $this->getApplication();
$app['monolog.level'] = 'info';
$this->assertSame(Logger::INFO, $app['monolog.handler']->getLevel());
}
/**
* @expectedException InvalidArgumentException
* @expectedExceptionMessage Provided logging level 'foo' does not exist. Must be a valid monolog logging level.
*/
public function testNonExistentStringErrorLevel()
{
$app = $this->getApplication();
$app['monolog.level'] = 'foo';
$app['monolog.handler']->getLevel();
}
protected function assertMatchingRecord($pattern, $level, $handler)
{
$found = false;
......@@ -156,7 +176,8 @@ class MonologServiceProviderTest extends \PHPUnit_Framework_TestCase
$app->register(new MonologServiceProvider());
$app['monolog.handler'] = $app->share(function () use ($app) {
return new TestHandler($app['monolog.level']);
$level = MonologServiceProvider::translateLevel($app['monolog.level']);
return new TestHandler($level);
});
return $app;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment