perl: Будет ли Log :: Log4perl работать в многопоточной среде? - PullRequest
2 голосов
/ 14 февраля 2012

Я использую logging vai Log :: Log4perl в моем скрипте perl; Мне интересно, если многократные вызовы для записи в один и тот же объект журнала вызовут некорректное / ошибочное поведение.

Я использую Appender :: File для записи журнала следующим образом:

$log->info("Launching commands...");
foreach my $param (@params) {
    push @thread_handles, async {
        system("$param");
        $log->info("$param COMPLETE");
        logstatus($?);
    };
}

$_->join() foreach @thread_handles;
$log->info("Commands completed...");

Ответы [ 3 ]

2 голосов
/ 14 февраля 2012

Log :: Log4perl с приложением по умолчанию на основе файлов будет работать, но в многопоточной или многопроцессорной среде, использующей один и тот же файл журнала, может произойти некоторое перекрытие.

Одним из решений является использование Log :: Log4perl :: Appender :: Synchronized в качестве приложения. См. Как мне запустить Log :: Log4perl под mod_perl? в FAQ для получения дополнительной информации.

1 голос
/ 28 августа 2012

Использование синхронизированного приложения имеет большой смысл.Мой вопрос: будет ли переменная logger передаваться потокам?Согласно perlthrtut это не так.Мне еще предстоит это проверить.Если кто-то уже не сделал этого?

Возможно, вы захотите использовать threads::shared, чтобы поделиться переменной регистратора, но документация threads::shared указывает, что вы можете использовать только скаляры, массивы или хэши,Я все равно попробовал это с Perl 5.8.8, и, как и ожидалось, он не будет работать.

Другой подход заключается в создании отдельного регистратора для каждой подпрограммы, которая будет вызываться в потоке.Приложений log4perl можно настроить, чтобы избежать блокировки и чередования.Но я серьезно обеспокоен влиянием на производительность, возникающим при создании отдельного экземпляра регистратора для каждого активного потока.

Обновлено: оказывается, что не нужно усложнять.Если вы инициализируете log4perl так, как будто вы пишете однопотоковый скрипт, и вызываете методы объектов logger без каких-либо специальных уловок, все работает так, как объявлено.Объект регистратора не нужно передавать в точку входа потока.Sub, вызываемый в точке входа потока, получает доступ к методам регистратора так же, как если бы он вызывался обычным способом.Синхронизированный аппендер поддерживает все линии.

0 голосов
/ 14 февраля 2012

Log4perl работает в многопоточной среде, однако вы должны тщательно выбирать вспомогательные устройства.

За исключением синхронизированных приложений, сообщения журнала с буферизацией не будут отображаться в порядке, но это не проблема.

Либо используйте разные файлы для каждого потока, либо добавьте pid в сообщение журнала.

Синхронизированные аппендеры могут привести к большим накладным расходам в поточном приложении, используйте их осторожно.

Я выбираю один лог-файл с pid или каким-либо другим идентификатором потока. Я использую этот вид регистрации без проблем.

С уважением,

...