Задать вопрос
@aksined_by
Php-developer

Формирование строки лога только если включен нужный уровень отладки?

Доброго времени суток. Столкнулся с проблемой времени выполнения некоторых скриптов в одном большом проекте. Хотел попробовать выиграть хоть пол секунды, сократив формирование строки для логирования. Логов очень много, вызов лога выглядит примерно вот так:
class SomeClass(){
    function someFunction(string $param1, string $param2, int $param3): bool{
        debugLog(
            'log-level-3',
            __METHOD__ ,
            ': start with arguments: ' .PHP_EOL. $param1 . PHP_EOL. $param2.PHP_EOL . $param3
        );
        // code
        $success = $this->doSomething();
        debugLog('log-level-3', __METHOD__, ': end ' . $success ? 'successfully' : 'failure');
        return $success;
    }
}


Возник вопрос: Как выполнить отложенное формирование строки в 3м параметре debugLog, что бы строка собиралась только в том случае, если 'log-level-3' включен в конфигурациях?

Хотел передавать в 3 параметр анонимную функцию, которая должна вернуть строку, но тогда очень сильно портится читаемость кода

class SomeClass(){
    function someFunction(string $param1, string $param2, int $param3): bool{
        debugLog(
            'log-level-3',
            __METHOD__ ,
            function() use ($param1, $param2, $param3){
                return ': start with arguments: ' .PHP_EOL. $param1 . PHP_EOL. $param2.PHP_EOL . $param3;
            }
        );
        // code
        $success = $this->doSomething();
        debugLog('log-level-3', __METHOD__, function() use ($success) { return ': end ' . $success ? 'successfully' : 'failure';});
        return $success;
    }
}


Проект очень большой, много работы с файлами. Проводили тесты на идентичных по железу серверах под linux и windows. На linux, тормоза при формировании документов несущественны, самый долгий - ~15 секунд. При работе под windows - скрипты на формирование документов могут работать иногда до ~90 секунд.

Есть идея попробовать немного ускорить работу, сократив огромное количество конкатенаций.

Вопросы:
1) Существует ли способ как-то красиво оформить такое логирование, что бы не потерять в читаемости?
2) Есть ли смысл бороться с сотнями конкатенаций чуть ли не в каждом запросе?

Пример реального вызова в том, как это существует сейчас:
5f0491bd6ea24472902176.png
  • Вопрос задан
  • 61 просмотр
Подписаться 1 Средний Комментировать
Решения вопроса 1
@aksined_by Автор вопроса
Php-developer
Написал маленький бенчмарк на 1.000.000 записей в лог при условии, что и логирование не выполнится ни в одном из случаев. Одна функция собирает строку и передаёт её, а вторая функция вызывает некоторый callback, генерирующий строку в случае необходимости лога.

function logText(string $message, int $logLevel = LOG_WARNING){
    if ($logLevel <= LOG_WARNING){
        file_put_contents(__DIR__ . '/logText.log', date('H:m:s') . "\t$message\n", FILE_APPEND);
    }
}

function logFn($renderMsg, int $logLevel = LOG_WARNING){
    if ($logLevel <= LOG_WARNING){
        $text = $renderMsg();
        file_put_contents(__DIR__ . '/logText.log', date('H:m:s') . "\t$text\n", FILE_APPEND);
    }
}

$a = microtime(true);
for ($i = 1000000; $i > 0; $i--){
    logText("$i some text value " . ($i*100), LOG_DEBUG);
}
$time = microtime(true)-$a;
echo "<h3>time log message: $time</h3>";


$a = microtime(true);
for ($i = 1000000; $i > 0; $i--){
    logFn(
        function() use ($i){
            return "$i some text value " . ($i*100);
        }, LOG_DEBUG
    );
}
$time = microtime(true)-$a;
echo "<h3>time fn message: $time</h3>";


Разница оказалась совершенно незначительной, но оказалось, что передача сформированной строки быстрее.
Ответ был приблизительно схож и выглядел как-то так:
time log message: 0.54136490821838
time fn message: 0.66178202629089
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы