Вы оказываете себе медвежью услугу, тестируя Splunk с такими минимальными событиями. Они не дают вам возможности увидеть, на что способен Splunk. Вы получаете только поля по умолчанию, потому что Splunk не знает, что делать с одним словом. Если бы вы что-то вроде "foo = bar", то вы увидели бы, что Splunk создает поле 'foo'.
На каждом компьютере есть как минимум один файл журнала, который вы можете использовать для тестирования Splunk.
Можно добавлять поля к событиям, используя преобразования. Это сложная тема, которую нельзя сделать с помощью графического интерфейса. Я предлагаю вам научиться ходить, используя лучшие образцы данных, прежде чем пытаться бежать.
При получении всех объектов из класса TrackableObject этот класс мог бы быть настроен для обработки таких вещей (просто уверены, что Вы звоните parent::__construct()
и parent::__destruct()
при перегрузке тех, которые в подклассах.
class TrackableObject
{
protected static $_instances = array();
public function __construct()
{
self::$_instances[] = $this;
}
public function __destruct()
{
unset(self::$_instances[array_search($this, self::$_instances, true)]);
}
/**
* @param $includeSubclasses Optionally include subclasses in returned set
* @returns array array of objects
*/
public static function getInstances($includeSubclasses = false)
{
$return = array();
foreach(self::$_instances as $instance) {
if ($instance instanceof get_class($this)) {
if ($includeSubclasses || (get_class($instance) === get_class($this)) {
$return[] = $instance;
}
}
}
return $return;
}
}
Главная проблема с этим - то, что никакой объект не был бы автоматически взят сборкой "мусора" (поскольку ссылка на нее все еще существует в TrackableObject::$_instances
), таким образом, __destruct()
должен был бы быть назван вручную для уничтожения, сказал объект. (Сборка "мусора" Циклической ссылки была добавлена в PHP 5.3 и может представить дополнительные возможности сборки "мусора"),
Мне нужно это, потому что я делаю систему событий и потребность смочь к отправленным событиям ко всем объектам определенного класса (глобальное уведомление, если Вы будете, который динамично связывается).
Я предложил бы иметь отдельный объект, где Вы регистрируете объекты в (Шаблон "наблюдатель"). PHP имеет встроенную поддержку этого через spl; См.: SplObserver и SplSubject.
Вот возможное решение:
function get_instances_of_class($class) {
$instances = array();
foreach ($GLOBALS as $value) {
if (is_a($value, $class) || is_subclass_of($value, $class)) {
array_push($instances, $value);
}
}
return $instances;
}
Править: Обновленный код, чтобы проверить, если $class
суперкласс.
Редактирование 2: Сделанный немного более грязной рекурсивной функцией, которая проверяет переменные каждого объекта вместо просто объектов верхнего уровня:
function get_instances_of_class($class, $vars=null) {
if ($vars == null) {
$vars = $GLOBALS;
}
$instances = array();
foreach ($vars as $value) {
if (is_a($value, $class)) {
array_push($instances, $value);
}
$object_vars = get_object_vars($value);
if ($object_vars) {
$instances = array_merge($instances, get_instances_of_class($class, $object_vars));
}
}
return $instances;
}
Я не уверен, может ли это войти в бесконечную рекурсию с определенными объектами, поэтому остерегайтесь...
Насколько я знаю, время выполнения PHP не выставляет пространство основного объекта, таким образом, не было бы возможно запросить его для экземпляров объекта.