2016-09-19 10 views
4

При запуске http server Я не хочу видеть >> Dancer2 v0.201000 server <pid> listening on http://0.0.0.0:<port>, напечатанный на stderr. Вот почему я добавил следующую строку перед вызовом start()Перенаправление и восстановление STDERR in Dancer

get "/pwd" => sub { 
    my $pwd = cwd; 
    print STDERR "\n\n[PWD] : $pwd\n"; # this line is not being printed 
    print "\n\n[STDOUT::PWD] : $pwd\n"; 
    my %responseHash = (pwd => $pwd); 
    my $response = encode_json \%responseHash; 
    return $response; 
};  

my $dancerStartErr; 

sub startServer { 
    open (local *STDERR, ">", \$dancerStartErr) 
     or die "Dup err to variable error: $!\n"; 

    start(); 
} 

startServer(); 

Проблема заключается в том, что позже я не могу напечатать что-то на STERR. Как я могу открыть повторно STDERR (open(STDERR, ">", \*STDERR); не помогает)?

+0

Вы хотите отключить все протоколирование или просто самое первое сообщение? – simbabque

ответ

2

Если вы не хотите, чтобы ваше приложение регистрировало что-либо, вы можете изменить механизм ведения журнала, чтобы использовать Dancer2::Logger::Null. Вы делаете это, редактируя config.yml или в одной из ваших сред. Например, чтобы отключить его в производстве, измените значение # appdir/environment/production.yml.

logger: 'null' 

по умолчанию является протоколирование двигатель 'console', который печатает вещи на терминал.

Есть другие Dancer2 :: Logger :: классы доступны bundled with Dancer2 и на CPAN in their own distributions. Лучшим решением для простого сброса всего в черную дыру может быть запись в файл вместо этого. Документацию о том, как ее настроить, можно найти в Dancer2::Core::Role::Logger.

Также обратите внимание, что вместо того, чтобы печатать до STDERR в вашем коде, вы должны использовать ключевые слова для ведения журнала с соответствующим уровнем журнала.

print STDERR "\n\n[PWD] : $pwd\n"; # this line is not being printed 

Это не очень хорошая идея, потому что вы не можете отличить, если это ошибка или предупреждение, или просто отладки вывода. Вот почему в Dancer2 встроены разные уровни журналов.

  • core
  • debug
  • info
  • warning
  • error

Все они доступны в качестве ключевых слов. В нем есть документация по адресу Dancer2::Manual.

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

debug "[PWD] : $pwd"; 

Всё. Он автоматически заботится о новых символах и т. Д.

0

Вы можете использовать select перед перенаправлением, чтобы сохранить его в переменной

my $oldfh = select(STDERR); 

, а затем использовать его позже

select($oldfh); 

Также проверьте:

+0

Я добавил глобальную переменную '$ STDERR_COPY', а затем попытался выполнить печать в stderr с помощью' my $ stdErr = select ($ STDERR_COPY); 'и затем попытаюсь напечатать на' stderr' я получаю 'Не могу использовать строку («main :: STDERR») в качестве символа ref, а «strict refs» ' –

 Смежные вопросы

  • Нет связанных вопросов^_^