123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- <?php
- namespace Codeception\Extension;
- use Codeception\Event\FailEvent;
- use Codeception\Event\StepEvent;
- use Codeception\Event\SuiteEvent;
- use Codeception\Event\TestEvent;
- use Codeception\Events;
- use Codeception\Exception\ConfigurationException;
- use Codeception\Exception\ExtensionException;
- use Codeception\Extension;
- use Codeception\Test\Descriptor;
- use Monolog\Formatter\LineFormatter;
- use Monolog\Handler\RotatingFileHandler;
- /**
- * Log suites/tests/steps using Monolog library.
- * Monolog should be installed additionally by Composer.
- *
- * ```
- * composer require monolog/monolog
- * ```
- *
- * Steps are logged into `tests/_output/codeception.log`
- *
- * To enable this module add to your `codeception.yml`:
- *
- * ``` yaml
- * extensions:
- * enabled: [Codeception\Extension\Logger]
- * ```
- *
- * #### Config
- *
- * * `max_files` (default: 3) - how many log files to keep
- *
- */
- class Logger extends Extension
- {
- public static $events = [
- Events::SUITE_BEFORE => 'beforeSuite',
- Events::TEST_BEFORE => 'beforeTest',
- Events::TEST_AFTER => 'afterTest',
- Events::TEST_END => 'endTest',
- Events::STEP_BEFORE => 'beforeStep',
- Events::TEST_FAIL => 'testFail',
- Events::TEST_ERROR => 'testError',
- Events::TEST_INCOMPLETE => 'testIncomplete',
- Events::TEST_SKIPPED => 'testSkipped',
- ];
- protected $logHandler;
- /**
- * @var \Monolog\Logger
- */
- protected static $logger;
- protected $path;
- protected $config = ['max_files' => 3];
- public function _initialize()
- {
- if (!class_exists('\Monolog\Logger')) {
- throw new ConfigurationException("Logger extension requires Monolog library to be installed");
- }
- $this->path = $this->getLogDir();
- // internal log
- $logHandler = new RotatingFileHandler($this->path . 'codeception.log', $this->config['max_files']);
- $formatter = $logHandler->getFormatter();
- if ($formatter instanceof LineFormatter) {
- $formatter->ignoreEmptyContextAndExtra(true);
- }
- self::$logger = new \Monolog\Logger('Codeception');
- self::$logger->pushHandler($logHandler);
- }
- public static function getLogger()
- {
- return self::$logger;
- }
- public function beforeSuite(SuiteEvent $e)
- {
- $suite = str_replace('\\', '_', $e->getSuite()->getName());
- $this->logHandler = new RotatingFileHandler($this->path . $suite, $this->config['max_files']);
- }
- public function beforeTest(TestEvent $e)
- {
- self::$logger = new \Monolog\Logger(Descriptor::getTestFileName($e->getTest()));
- self::$logger->pushHandler($this->logHandler);
- self::$logger->info('------------------------------------');
- self::$logger->info("STARTED: " . ucfirst(Descriptor::getTestAsString($e->getTest())));
- }
- public function afterTest(TestEvent $e)
- {
- }
- public function endTest(TestEvent $e)
- {
- self::$logger->info("PASSED");
- }
- public function testFail(FailEvent $e)
- {
- self::$logger->alert($e->getFail()->getMessage());
- self::$logger->info("# FAILED #");
- }
- public function testError(FailEvent $e)
- {
- self::$logger->alert($e->getFail()->getMessage());
- self::$logger->info("# ERROR #");
- }
- public function testSkipped(FailEvent $e)
- {
- self::$logger->info("# Skipped #");
- }
- public function testIncomplete(FailEvent $e)
- {
- self::$logger->info("# Incomplete #");
- }
- public function beforeStep(StepEvent $e)
- {
- self::$logger->info((string) $e->getStep());
- }
- }
- if (!function_exists('codecept_log')) {
- function codecept_log()
- {
- return Logger::getLogger();
- }
- } else {
- throw new ExtensionException('Codeception\Extension\Logger', "function 'codecept_log' already defined");
- }
|