public static function doLog($logmethod, array $data, &$output)
 {
     $log = new Logger('ezperflogger');
     // constructor args for the specific handler can be set via ini
     /// @todo how to create resources instead?
     foreach (eZPerfLoggerINI::variable('MonologSettings', 'LogHandlers') as $handlerName) {
         $handlerClass = 'Monolog\\Handler\\' . $handlerName . "Handler";
         if (eZPerfLoggerINI::hasVariable('MonologSettings', 'LogHandler_' . $handlerName)) {
             $r = new ReflectionClass($handlerClass);
             $handler = $r->newInstanceArgs(eZPerfLoggerINI::variable('MonologSettings', 'LogHandler_' . $handlerName));
         } else {
             $handler = new $handlerClass();
         }
         $log->pushHandler($handler);
     }
     // the default severity level: taken from config file
     $level = (int) eZPerfLoggerINI::variable('MonologSettings', 'SeverityLevel');
     // either coalesce messages or not: taken from config file
     if (eZPerfLoggerINI::variable('MonologSettings', 'Coalescevariables') == 'enabled') {
         /// @todo allow via ini file the specification of custom formatters?
         $msg = array();
         foreach ($data as $varname => $value) {
             $msg[] = "{$varname}: {$value}";
         }
         $log->addRecord($level, implode(', ', $msg));
     } else {
         foreach ($data as $varname => $value) {
             $log->addRecord($level, "{$varname}: {$value}");
         }
     }
 }
 /**
  * For statsd, we use a different logic than for other loggers:
  * in the name of the KPI we embed some variable data, such as f.e.
  * content-class name. This allows better grouping and filtering of data
  * in the Graphite console.
  *
  * @see ezperformancelogger.ini
  *
  * We cache internally prefix and postfix for optimal performances
  */
 public static function transformVarName($var, $default = null)
 {
     if (self::$prefix === null || self::$postfix === null) {
         $strip = eZPerfLoggerINI::variable('StatsdSettings', 'RemoveEmptyTokensInVariable') == 'enabled';
         foreach (array(eZPerfLoggerINI::variable('StatsdSettings', 'VariablePrefix'), eZPerfLoggerINI::variable('StatsdSettings', 'VariablePostfix')) as $i => $string) {
             if (strpos($string, '$') !== false) {
                 $tokens = explode('.', $string);
                 foreach ($tokens as $j => &$token) {
                     if (strlen($token) && $token[0] == '$') {
                         $token = str_replace('.', '_', eZPerfLogger::getModuleData(substr($token, 1), $default));
                         if ($strip && $token == '') {
                             unset($tokens[$j]);
                         }
                     }
                 }
                 $string = implode('.', $tokens);
             }
             if ($i) {
                 self::$postfix = $string;
             } else {
                 self::$prefix = $string;
             }
         }
     }
     return self::$prefix . $var . self::$postfix;
 }
 public static function shouldLog(array $data, $output)
 {
     if (!isset($data['mem_usage']) || $data['mem_usage'] >= eZPerfLoggerINI::variable('LogFilterSettings', 'MemoryhungrypagesFilter')) {
         return true;
     }
     return false;
 }
 public static function shouldLog(array $data, $output)
 {
     if (!isset($data['execution_time']) || $data['execution_time'] >= eZPerfLoggerINI::variable('LogFilterSettings', 'SlowpagesFilterLimit')) {
         return true;
     }
     return false;
 }
 public static function shouldLog(array $data, $output)
 {
     if (rand(0, eZPerfLoggerINI::variable('LogFilterSettings', 'MemoryhungrypagesFilter')) <= 1) {
         return true;
     }
     return false;
 }
 public static function resetStats()
 {
     self::$statsCount = 0;
     self::$stats = array();
     foreach (eZPerfLoggerINI::variable('GeneralSettings', 'TrackVariables') as $var) {
         self::$stats[$var] = array('total' => 0);
     }
 }
 protected static function generateJSEventsFunctionCalls($data)
 {
     $prefix = eZPerfLoggerINI::variable('OdoscopeSettings', 'VariablePrefix');
     $text = "";
     foreach (eZPerfLoggerINI::variable('GeneralSettings', 'TrackVariables') as $var) {
         /// @todo proper js escaping; do not add quotes for numeric values?
         $text .= "osc.evt( '" . $prefix . urlencode($var) . "', '" . urlencode($data[$var]) . "' );\n";
     }
     return $text;
 }
 /**
  * Difference from base class: do not obey php.ini but eZ config instead
  */
 static function flush($script_name = null)
 {
     $struct = static::get_packet_info($script_name);
     $message = prtbfr::encode($struct, self::$message_proto);
     $server = eZPerfLoggerINI::variable('pinbaSettings', 'Server');
     $port = 30002;
     if (count($parts = explode(':', $server)) > 1) {
         $port = $server[1];
         $server = $server[0];
     }
     $fp = fsockopen("udp://{$server}", $port, $errno, $errstr);
     if ($fp) {
         fwrite($fp, $message);
         fclose($fp);
     }
 }
 public static function parseLogLine($line, $counters = array(), $excludeRegexps = array())
 {
     $countersCount = count($counters);
     $separator = eZPerfLoggerINI::variable('csvSettings', 'Separator');
     $logPartArray = explode($separator, $line, $countersCount + 6);
     if (count($logPartArray) < $countersCount + 6) {
         return false;
     }
     $url = rtrim($logPartArray[$countersCount + 5], "\n");
     foreach ($excludeRegexps as $regexp) {
         if (preg_match($regexp, $url)) {
             return true;
         }
     }
     return array('url' => $url, 'time' => $logPartArray[0], 'ip' => $logPartArray[$countersCount + 2], 'response_status' => $logPartArray[$countersCount + 3], 'response_size' => $logPartArray[$countersCount + 4], 'counters' => array_slice($logPartArray, 1, $countersCount));
 }
 /**
  * This method gets called by self::filter()
  */
 public static function doLog($method, array $values, &$output)
 {
     switch ($method) {
         case 'apache':
             foreach ($values as $varName => $value) {
                 /// @todo should remove any " or space chars in the value for proper parsing by updateperfstats.php
                 apache_note($varName, $value);
             }
             break;
         case 'piwik':
             $text = '';
             foreach (eZPerfLoggerINI::variable('GeneralSettings', 'TrackVariables') as $i => $var) {
                 $text .= "\npiwikTracker.setCustomVariable( {$i}, \"{$var}\", \"{$values[$var]}\", \"page\" );";
             }
             $text .= "\npiwikTracker.trackPageView();";
             $output = preg_replace('/piwikTracker\\.trackPageView\\( *\\);?/', $text, $output);
             break;
         case 'googleanalytics':
             $text = '';
             foreach (eZPerfLoggerINI::variable('GeneralSettings', 'TrackVariables') as $i => $var) {
                 $text .= "\n_gaq.push([{$i}, '{$var}', '{$values[$var]}', 3]);";
             }
             $text .= "\n_gaq.push(['_trackPageview']);";
             $output = preg_replace("/_gaq.push\\( *[ *['\"]_trackPageview['\"] *] *\\);?/", $text, $output);
             break;
         case 'logfile':
         case 'syslog':
             /// same format as Apache "combined" by default
             $size = self::$outputSize;
             if ($size == 0) {
                 $size = '-';
             }
             $text = eZPerfLoggerApacheLogger::apacheLogLine('combined', $size, self::$returnCode) . ' ';
             foreach ($values as $value) {
                 // do same as apache does: replace nulls with "-"
                 if ((string) $value === '') {
                     $text .= "- ";
                 } else {
                     /// @todo should remove any " or space chars in the value for proper parsing by updateperfstats.php
                     $text .= $value . " ";
                 }
             }
             if ($method == 'logfile') {
                 $text .= "\n";
                 file_put_contents(eZPerfLoggerINI::variable('logfileSettings', 'FileName'), $text, FILE_APPEND);
             } else {
                 // syslog: we use apache log format for lack of a better idea...
                 openlog("eZPerfLog", LOG_PID, LOG_USER);
                 syslog(LOG_INFO, $text);
             }
             break;
         case 'headers':
             $prefix = eZPerfLoggerINI::variable('HeadersSettings', 'HeaderPrefix');
             foreach (eZPerfLoggerINI::variable('GeneralSettings', 'TrackVariables') as $i => $var) {
                 header($prefix . str_replace(array('(', ')', '<', '>', '@', ',', ';', ':', '\\', '"', '/', '[', ']', '?', '=', '{', '}', ' ', "\t"), '-', $var) . ': ' . $values[$var]);
             }
             break;
         case 'database':
         case 'csv':
         case 'storage':
             if ($method == 'csv') {
                 $storageClass = 'eZPerfLoggerCSVStorage';
             } else {
                 if ($method == 'database') {
                     $storageClass = 'eZPerfLoggerDBStorage';
                 } else {
                     $storageClass = eZPerfLoggerINI::variable('ParsingSettings', 'StorageClass');
                 }
             }
             /// @todo log error if storage class does not implement correct interface
             // when we deprecate php 5.2, we will be able to use $storageClass::insertStats...
             call_user_func(array($storageClass, 'insertStats'), array(array('url' => isset($_SERVER["REQUEST_URI"]) ? $_SERVER["REQUEST_URI"] : $_SERVER["PHP_SELF"], 'ip' => is_callable('eZSys::clientIP') ? eZSys::clientIP() : eZSys::serverVariable('REMOTE_ADDR'), 'time' => time(), 'response_status' => self::$returnCode, 'response_size' => self::$outputSize, 'counters' => $values)));
             break;
             /// @todo !important log a warning for default case (unhandled log format)
     }
 }
 /**
  * Not too sure if it's gonna be needed... in which case do we want external code to allow to refresh the configResolver?
  * @param $resolver
  * @throws RuntimeException
  */
 public static function setConfigResolver($resolver)
 {
     if (!is_a($resolver, 'eZ\\Publish\\Core\\MVC\\ConfigResolverInterface')) {
         throw new RuntimeException('resolver object does not implement desired interface');
     }
     self::$configResolver = $resolver;
 }
 /**
  * Reads the data previously saved in the token file
  * @return mixed string|false
  */
 protected static function readUpdateToken($tokenFile)
 {
     $sys = eZSys::instance();
     $updateViewLogPath = $sys->varDirectory() . "/" . eZPerfLoggerINI::variable('FileSettings', 'LogDir', 'site.ini') . "/" . $tokenFile;
     if (is_file($updateViewLogPath)) {
         // nb: we need the newline at the end of the saved line for a proper comparison
         $lines = file($updateViewLogPath, FILE_SKIP_EMPTY_LINES);
         return isset($lines[2]) ? $lines[2] : false;
     }
     return false;
 }