public function __construct($name = 'PHPUnit', $level = 'debug') { /** * Filter growl notifications and send only * - test failures ($handerLevel = Logger::NOTICE; see GrowlHandler constructor) * - summary of test suites (message "Results OK ...", or "Results KO ..." */ $filters = array(function ($record, $handlerLevel) { if ($record['level'] > $handlerLevel) { return true; } return preg_match('/^Results/', $record['message']) === 1; }); $stream = new RotatingFileHandler(__DIR__ . DIRECTORY_SEPARATOR . 'monologTestListener.log', 0, Logger::toMonologLevel($level)); $stream->setFilenameFormat('{filename}-{date}', 'Ymd'); $handlers = array($stream); try { // be notified only for test suites and test failures $growl = new GrowlHandler(array(), Logger::NOTICE); $handlers[] = new CallbackFilterHandler($growl, $filters); } catch (\Exception $e) { // Growl server is probably not started echo $e->getMessage(), PHP_EOL, PHP_EOL; } parent::__construct($name, $handlers); }
public function register(Application $app) { $app->register(new \Silex\Provider\MonologServiceProvider()); $app['monolog.handler'] = function () use($app) { $levels = Logger::getLevels(); if ($app['debug']) { $level = Logger::DEBUG; } else { $level = $app['config']['log']['log_level']; } $RotateHandler = new RotatingFileHandler($app['monolog.logfile'], $app['config']['log']['max_files'], $level); $RotateHandler->setFilenameFormat($app['config']['log']['prefix'] . '{date}' . $app['config']['log']['suffix'], $app['config']['log']['format']); $RotateHandler->setFormatter(new LineFormatter(null, null, true)); $FingerCrossedHandler = new FingersCrossedHandler($RotateHandler, new ErrorLevelActivationStrategy($levels[$app['config']['log']['action_level']])); return $FingerCrossedHandler; }; $app['listener.requestdump'] = $app->share(function ($app) { return new \Eccube\EventListener\RequestDumpListener($app); }); }
/** * @param string $name The logging channel * @param HandlerInterface[] $handlers Optional stack of handlers, the first one in the array is called first, etc. * @param callable[] $processors Optional array of processors */ public function __construct($name, array $handlers = array(), array $processors = array()) { parent::__construct($name, $handlers, $processors); // set handler $elgg_log_level = _elgg_services()->logger->getLevel(); if ($elgg_log_level == \Elgg\Logger::OFF) { // always log errors $elgg_log_level = \Elgg\Logger::ERROR; } $handler = new RotatingFileHandler(elgg_get_data_path() . 'elasticsearch/client.log', 0, $elgg_log_level); // create correct folder structure $date = date('Y/m/'); $path = elgg_get_data_path() . "elasticsearch/{$date}"; if (!is_dir($path)) { mkdir($path, 0755, true); } $handler->setFilenameFormat('{date}_{filename}', 'Y/m/d'); $this->pushHandler($handler); // set logging processor $processor = new IntrospectionProcessor(); $this->pushProcessor($processor); }
/** * Console logger class constructor * * @param string $name The logging channel * @param string $level The minimum logging level */ public function __construct($name = 'YourLogger', $level = Logger::DEBUG) { $filterRules = array(function ($record) { if (!array_key_exists('operation', $record['context'])) { return false; } return 'printFooter' === $record['context']['operation']; }); $stream = new RotatingFileHandler(__DIR__ . '/phpunit-growlhandler-php' . PHP_VERSION_ID . '.log', 30); $stream->setFilenameFormat('{filename}-{date}', 'Ymd'); $console = new StreamHandler('php://stdout'); $console->setFormatter(new LineFormatter("%message%\n", null, true)); $filter = new FilterHandler($console); $handlers = array($filter, $stream); try { $options = array('resourceDir' => dirname(__DIR__) . '/vendor/pear-pear.php.net/Net_Growl/data/Net_Growl/data', 'defaultIcon' => '80/growl_phpunit.png'); $growl = new GrowlHandler(array('name' => 'PHPUnit ResultPrinter', 'options' => $options), Logger::NOTICE); $growl->setFormatter(new LineFormatter("Growl for Monolog\n" . "%message%")); $handlers[] = new CallbackFilterHandler($growl, $filterRules); } catch (\Exception $e) { // Growl server is probably not started } parent::__construct($name, $handlers); }
*/ $baseDir = dirname(__DIR__); $vendorDir = $baseDir . '/vendor'; require_once $vendorDir . '/autoload.php'; use Bartlett\Monolog\Handler\GrowlHandler; use Bartlett\Monolog\Handler\CallbackFilterHandler; use Monolog\Logger; use Monolog\Handler\RotatingFileHandler; use Monolog\Formatter\LineFormatter; use Monolog\Processor\PsrLogMessageProcessor; $processors = array(new PsrLogMessageProcessor()); // Create the logger $logger = new Logger('long_process', array(), $processors); // Create some handlers $stream = new RotatingFileHandler(__DIR__ . DIRECTORY_SEPARATOR . 'long_process.log'); $stream->setFilenameFormat('{filename}-{date}', 'Ymd'); $logger->pushHandler($stream); try { // Create filter rules $filters = array(function ($record) { if (!array_key_exists('count', $record['context'])) { return false; } return $record['context']['count'] > 5; }); $growl = new CallbackFilterHandler(new GrowlHandler(array(), Logger::INFO), $filters); $logger->pushHandler($growl); } catch (\Exception $e) { // Growl server is probably not started echo $e->getMessage(), PHP_EOL; }
/** * log.ymlの内容に応じたHandlerの設定を行う * * @param array $channelValues * @return FingersCrossedHandler */ public function getHandler(array $channelValues) { $app = $this->app; $levels = Logger::getLevels(); // ファイル名などの設定を行い、設定がなければデフォルト値を設定 $logFileName = isset($channelValues['filename']) ? $channelValues['filename'] : $app['config']['log']['filename']; $delimiter = isset($channelValues['delimiter']) ? $channelValues['delimiter'] : $app['config']['log']['delimiter']; $dateFormat = isset($channelValues['dateformat']) ? $channelValues['dateformat'] : $app['config']['log']['dateformat']; $logLevel = isset($channelValues['log_level']) ? $channelValues['log_level'] : $app['config']['log']['log_level']; $actionLevel = isset($channelValues['action_level']) ? $channelValues['action_level'] : $app['config']['log']['action_level']; $passthruLevel = isset($channelValues['passthru_level']) ? $channelValues['passthru_level'] : $app['config']['log']['passthru_level']; $maxFiles = isset($channelValues['max_files']) ? $channelValues['max_files'] : $app['config']['log']['max_files']; $logDateFormat = isset($channelValues['log_dateformat']) ? $channelValues['log_dateformat'] : $app['config']['log']['log_dateformat']; $logFormat = isset($channelValues['log_format']) ? $channelValues['log_format'] : $app['config']['log']['log_format']; if ($app['debug']) { $level = Logger::DEBUG; } else { $level = $logLevel; } // RotateHandlerの設定 $filename = $app['config']['root_dir'] . '/app/log/' . $logFileName . '.log'; $RotateHandler = new RotatingFileHandler($filename, $maxFiles, $level); $RotateHandler->setFilenameFormat($logFileName . $delimiter . '{date}' . $app['config']['log']['suffix'], $dateFormat); // ログフォーマットの設定(設定ファイルで定義) $RotateHandler->setFormatter(new LineFormatter($logFormat . PHP_EOL, $logDateFormat, true, true)); // FingerCossedHandlerの設定 $FingerCrossedHandler = new FingersCrossedHandler($RotateHandler, new ErrorLevelActivationStrategy($levels[$actionLevel]), 0, true, true, $levels[$passthruLevel]); // Processorの内容をログ出力 $webProcessor = new WebProcessor(); $uidProcessor = new UidProcessor(8); $FingerCrossedHandler->pushProcessor(function ($record) use($app, $uidProcessor, $webProcessor) { // ログフォーマットに出力する値を独自に設定 $record['level_name'] = sprintf("%-5s", $record['level_name']); // セッションIDと会員IDを設定 $record['session_id'] = null; $record['user_id'] = null; if ($app->isBooted()) { if (isset($app['session'])) { $sessionId = $app['session']->getId(); if ($sessionId) { $record['session_id'] = substr(sha1($sessionId), 0, 8); } } if (isset($app['user'])) { $user = $app->user(); if ($user instanceof Customer || $user instanceof Member) { $record['user_id'] = $user->getId(); } } } $record['uid'] = $uidProcessor->getUid(); $record['url'] = $webProcessor->getRequestUri(); $record['ip'] = $webProcessor->getClientIp(); $record['referrer'] = $webProcessor->getReferer(); $record['method'] = $webProcessor->getMethod(); $record['user_agent'] = $webProcessor->getUserAgent(); // クラス名などを一旦保持し、不要な情報は削除 $line = $record['extra']['line']; $functionName = $record['extra']['function']; // php5.3だとclass名が取得できないため、ファイル名を元に出力 // $className = $record['extra']['class']; $className = $record['extra']['file']; // 不要な情報を削除 unset($record['extra']['file']); unset($record['extra']['line']); unset($record['extra']['class']); unset($record['extra']['function']); $record['class'] = pathinfo($className, PATHINFO_FILENAME); $record['function'] = $functionName; $record['line'] = $line; return $record; }); // クラス名等を取得するProcessor、ログ出力時にクラス名/関数名を無視するための設定を行っている $skipClasses = array('Psr\\Log\\', 'Eccube\\Log\\'); $skipFunctions = array('log_info', 'log_notice', 'log_warning', 'log_error', 'log_critical', 'log_alert', 'log_emergency'); $intro = new IntrospectionProcessor(Logger::DEBUG, $skipClasses, $skipFunctions); $FingerCrossedHandler->pushProcessor($intro); return $FingerCrossedHandler; }
/** * @dataProvider filenameFormatProvider */ public function testDisallowFilenameFormatsWithoutDate($filenameFormat, $valid) { $handler = new RotatingFileHandler(__DIR__ . '/Fixtures/foo.rot', 2); $handler->setFilenameFormat($filenameFormat, RotatingFileHandler::FILE_PER_DAY); if (!$valid) { $this->assertErrorWasTriggered(E_USER_DEPRECATED, 'Invalid filename format - format should contain at least `{date}`, because otherwise rotating is impossible.'); } }
public function initLogger() { $file = __DIR__ . '/../../app/log/site.log'; $this->register(new \Silex\Provider\MonologServiceProvider(), array('monolog.logfile' => $file)); $levels = Logger::getLevels(); $this['monolog'] = $this->share($this->extend('monolog', function ($monolog, $this) use($levels, $file) { $RotateHandler = new RotatingFileHandler($file, $this['config']['log']['max_files'], $this['config']['log']['log_level']); $RotateHandler->setFilenameFormat($this['config']['log']['prefix'] . '{date}' . $this['config']['log']['suffix'], $this['config']['log']['format']); $FingerCrossedHandler = new FingersCrossedHandler($RotateHandler, new ErrorLevelActivationStrategy($levels[$this['config']['log']['action_level']])); $monolog->popHandler(); $monolog->pushHandler($FingerCrossedHandler); return $monolog; })); }
public function register(BaseApplication $app) { // 管理画面 $app->match('/' . $app['config']['admin_route'] . '/plugin/giftwrapping/config', 'Plugin\\GiftWrapping\\Controller\\ConfigController::index')->bind('plugin_GiftWrapping_config'); $app->match('/plugin/giftwrapping/checkout', 'Plugin\\GiftWrapping\\Controller\\GiftWrappingController::index')->bind('plugin_giftwrapping_index'); // Form $app['form.types'] = $app->share($app->extend('form.types', function ($types) use($app) { $types[] = new GiftWrappingConfigType($app); return $types; })); // Form Extension $app['form.type.extensions'] = $app->share($app->extend('form.type.extensions', function ($extensions) use($app) { $extensions[] = new ShoppingTypeExtension($app); return $extensions; })); // Repository $app['eccube.plugin.repository.wrapping'] = $app->share(function () use($app) { return $app['orm.em']->getRepository('Plugin\\GiftWrapping\\Entity\\Wrapping'); }); // Service $app['eccube.plugin.service.gift_wrapping'] = $app->share(function () use($app) { return new \Plugin\GiftWrapping\Service\GiftWrappingService($app); }); // メッセージ登録 $app['translator'] = $app->share($app->extend('translator', function ($translator, \Silex\Application $app) { $translator->addLoader('yaml', new \Symfony\Component\Translation\Loader\YamlFileLoader()); $file = __DIR__ . '/../Resource/locale/message.' . $app['locale'] . '.yml'; if (file_exists($file)) { $translator->addResource('yaml', $file, $app['locale']); } return $translator; })); // load config $conf = $app['config']; $app['config'] = $app->share(function () use($conf) { $confarray = array(); $path_file = __DIR__ . '/../Resource/config/path.yml'; if (file_exists($path_file)) { $config_yml = Yaml::parse(file_get_contents($path_file)); if (isset($config_yml)) { $confarray = array_replace_recursive($confarray, $config_yml); } } $constant_file = __DIR__ . '/../Resource/config/constant.yml'; if (file_exists($constant_file)) { $config_yml = Yaml::parse(file_get_contents($constant_file)); if (isset($config_yml)) { $confarray = array_replace_recursive($confarray, $config_yml); } } return array_replace_recursive($conf, $confarray); }); // ログファイル設定 $app['monolog.gift.wrapping'] = $app->share(function ($app) { $logger = new $app['monolog.logger.class']('gift.wrapping.client'); $file = $app['config']['root_dir'] . '/app/log/giftwrapping.log'; $RotateHandler = new RotatingFileHandler($file, $app['config']['log']['max_files'], Logger::INFO); $RotateHandler->setFilenameFormat('giftwrapping_{date}', 'Y-m-d'); $logger->pushHandler(new FingersCrossedHandler($RotateHandler, new ErrorLevelActivationStrategy(Logger::INFO))); return $logger; }); }
/** * Handles the available handlers and pushes them to the Monolog\Logger instance * * @return void */ protected function pushHandlers() { foreach (Config::get('kernel.logs.handlers') as $handler => $options) { switch ($handler) { case 'RotatingFileHandler': if (!$options['enabled']) { continue; } $level = static::nameToLevel($options['level']); $chmod = 0 . $options['chmod']; /* $class = 'Monolog\\Formatter\\' . $options['formatter']; $formatter = new $class(); */ // Is this handler enabled for this environment? if (array_exists(array_flip($options['environments']), Kernel::env())) { $rotateHandler = new RotatingFileHandler(path('logs') . $options['filename'] . '.log', $options['max'], $level, $chmod); $rotateHandler->setFilenameFormat('{filename}-{date}', $options['date_format']); $this->getLogger()->pushHandler($rotateHandler); } break; case 'BrowserConsoleHandler': if (!$options['enabled']) { continue; } // Is this handler enabled for this environment? if (array_exists(array_flip($options['environments']), Kernel::env())) { $this->getLogger()->pushHandler(new BrowserConsoleHandler()); } break; } } }