yiisoft / yii2

Yii 2: The Fast, Secure and Professional PHP Framework
http://www.yiiframework.com
BSD 3-Clause "New" or "Revised" License
14.24k stars 6.91k forks source link

Не пишутся логи в консольном приложении, которое запущено как демон #8214

Closed exru closed 9 years ago

exru commented 9 years ago

Решил написать демона под gearman, столкнулся с проблемой логирования:


#Конфиг логера
[
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['info'],
                    'categories' => ['worker'],
                    'logVars' => [null],
                    'logFile' => '@app/runtime/logs/worker.log',
 ],

#Код в контроллере worker
public function actionIndex() {
    while(1){
        yii::info('test');
    }
}
#Консоль
php yii worker &

#Стал копать
public static function info($message, $category = 'application')
{
        static::getLogger()->log($message, Logger::LEVEL_INFO, $category);
}

public static function getLogger()
{
        if (self::$_logger !== null) {
            return self::$_logger;
        } else {
            return self::$_logger = static::createObject('yii\log\Logger');
        }
}
#В классе yii\log\Logger есть параметр который по умолчанию равен 0

 public $traceLevel = 0;
 /**
     * @var Dispatcher the message dispatcher
*/

#а так же метод 
 public function log($message, $level, $category = 'application')
    {
        $time = microtime(true);
        $traces = [];
        if ($this->traceLevel > 0) {
            $count = 0;
            $ts = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
            array_pop($ts); // remove the last trace since it would be the entry script, not very useful
            foreach ($ts as $trace) {
                if (isset($trace['file'], $trace['line']) && strpos($trace['file'], YII2_PATH) !== 0) {
                    unset($trace['object'], $trace['args']);
                    $traces[] = $trace;
                    if (++$count >= $this->traceLevel) {
                        break;
                    }
                }
            }
        }

        $this->messages[] = [$message, $level, $category, $time, $traces];
        if ($this->flushInterval > 0 && count($this->messages) >= $this->flushInterval) {
            $this->flush();
        }
    }
#смутила сточка $this->traceLevel > 0, может как-то обойти можно?
unclead commented 9 years ago

If you want to see log in realtime probably you have to configure Logger as describe here

lynicidn commented 9 years ago

права проверяйте, кто крон запускает

exru commented 9 years ago

какой нафиг крон, яж написал php yii worker &

lynicidn commented 9 years ago

от какого юзера? php запускаете? от себя?

exru commented 9 years ago

да

lynicidn commented 9 years ago

sudo php ... так проверьте

unclead commented 9 years ago

@exru для таких вопросов лучше использовать форум, например, русский Здесь issue/bug tracker

exru commented 9 years ago

я так пинмаю в настройках yii\log\FileTarget нет способа пробросить traceLevel, когда класс создается по умолчанию с нулевым уровнем static::createObject('yii\log\Logger');

exru commented 9 years ago

мне форум не нужен реально не работают логи, можете посмотреть здесь https://translate.google.ru/?hl=ru&tab=wT#en/ru/issue

unclead commented 9 years ago

@exru ты попробовал сделать как я кинул ссылку на рецепт. По умолчанию логер записывает все в файл когда достигнут лимит пачки.

    /**
     * @var integer how many messages should be logged before they are flushed from memory and sent to targets.
     * Defaults to 1000, meaning the [[flush]] method will be invoked once every 1000 messages logged.
     * Set this property to be 0 if you don't want to flush messages until the application terminates.
     * This property mainly affects how much memory will be taken by the logged messages.
     * A smaller value means less memory, but will increase the execution time due to the overhead of [[flush()]].
     */
    public $flushInterval = 1000;

Также можешь ради эксперимента поставить 777 на папку с логами, если начнут писаться, то проблема в правах.

exru commented 9 years ago

Пробовал. Не в правах дело, а в том что создается класс static::createObject('yii\log\Logger'); с public $traceLevel = 0, но в yii\log\FileTarget, нет такой опции типа defaultTraceLevel. Файлы прекрасно пишутся через fwrite('log.txt','a+'); И то что ты сбросил попробовал, тож самое, но спасибо.

unclead commented 9 years ago

причем тут traceLevel, если ты говоришь, что лог в принципе не пишется. traceLevel задается в конфиге

        'log' => [
            'traceLevel' => 0,
            'flushInterval' => 1,
            'targets' => require(__DIR__ . '/logger.php')
        ],

По коду явно видно, что запись сообщений в target никак не связана с targetLevel.

 public function log($message, $level, $category = 'application')
    {
        $time = microtime(true);
        $traces = [];

// по умолчанию данное условие не сработает и в лог просто не будет добавлена trace информация
        if ($this->traceLevel > 0) {
            $count = 0;
            $ts = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
            array_pop($ts); // remove the last trace since it would be the entry script, not very useful
            foreach ($ts as $trace) {
                if (isset($trace['file'], $trace['line']) && strpos($trace['file'], YII2_PATH) !== 0) {
                    unset($trace['object'], $trace['args']);
                    $traces[] = $trace;
                    if (++$count >= $this->traceLevel) {
                        break;
                    }
                }
            }
        }

// а вот тут уже идет проверка что достигнут предел после которого следует послать сообщения в target
        $this->messages[] = [$message, $level, $category, $time, $traces];
        if ($this->flushInterval > 0 && count($this->messages) >= $this->flushInterval) {
            $this->flush();
        }
    }
unclead commented 9 years ago

Предлагаю тебе все же продолжит обсуждение твоей проблемы на форуме т.к. с точки зрения фреймворка все работает корректно и проблема кроется в окружении/конфигурации

exru commented 9 years ago

ok