Commit 0be92fa8 authored by Fabien Potencier's avatar Fabien Potencier

feature #885 Allow strings for levels in the monolog service provider (igorw)

This PR was merged into the 1.2.x-dev branch.

Discussion
----------

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.

Commits
-------

6c97e670 Fix JSON syntax error in monolog provider docs
a7cba302 Reword the documentation on string logger levels
2ef826ce Backport static:: to classname:: for PHP 5.3 compatibility
121f3f2b Allow strings for levels in the monolog service provider
parents 7b6e48c8 6c97e670
......@@ -19,6 +19,10 @@ Parameters
everything, ``INFO`` will log everything except ``DEBUG``,
etc.
In addition to the ``Logger::`` constants, it is also possible to supply the
level in string form, for example: ``"DEBUG"``, ``"INFO"``, ``"WARNING"``,
``"ERROR"``.
* **monolog.name** (optional): Name of the monolog channel,
defaults to ``myapp``.
......@@ -49,7 +53,7 @@ Registering
.. code-block:: json
"require": {
"monolog/monolog": ">=1.0.0",
"monolog/monolog": ">=1.0.0"
}
Usage
......
......@@ -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 = MonologServiceProvider::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 = MonologServiceProvider::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