2016-09-19 9 views
4

Wenn ich meine http server starten möchte ich nicht >> Dancer2 v0.201000 server <pid> listening on http://0.0.0.0:<port> gedruckt auf der stderr. Das ist, warum habe ich die folgende Zeile vor start()Umleiten und Wiederherstellen STDERR in Tänzer

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(); 

Das Problem ist, fordern, dass später nicht etwas auf der STERR drucke ich kann. Wie kann ich wieder öffnen STDERR (open(STDERR, ">", \*STDERR); hilft nicht)?

+0

Möchten Sie die gesamte Protokollierung oder nur die erste Nachricht deaktivieren? – simbabque

Antwort

2

Wenn Sie nicht möchten, dass Ihre Anwendung etwas protokolliert, können Sie die Protokollierungs-Engine so ändern, dass sie Dancer2::Logger::Null verwendet. Sie tun dies, indem Sie Ihre config.yml oder in einer Ihrer Umgebungen bearbeiten. Um es beispielsweise in production auszuschalten, ändern Sie # appdir/environments/production.yml.

logger: 'null' 

Die Standardeinstellung ist die Protokollierung Motor 'console', das Zeug zu Ihrem Terminal druckt.

Es sind weitere Dancer2 :: Logger :: Klassen verfügbar bundled with Dancer2 und auf CPAN in their own distributions. Eine bessere Lösung, um einfach alles in ein schwarzes Loch zu packen, ist es, stattdessen in eine Datei zu loggen. Dokumentation zur weiteren Konfiguration finden Sie in Dancer2::Core::Role::Logger.

Beachten Sie auch, dass Sie in Ihrem Code nicht STDERR drucken sollten, sollten Sie die Protokollierungsschlüsselwörter mit der entsprechenden Protokollebene verwenden.

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

Dies ist keine gute Idee, weil Sie nicht unterscheiden können, ob dies ein Fehler oder eine Warnung ist, oder nur Debugging-Ausgabe. Deshalb gibt es in Dancer2 verschiedene Log-Level.

  • core
  • debug
  • info
  • warning
  • error

Alle von ihnen sind als Schlüsselwörter zur Verfügung. Es gibt Dokumentation in Dancer2::Manual.

Da das Arbeitsverzeichnis in der Produktion wahrscheinlich nicht relevant ist, aber nur während der Entwicklung, würden Sie mit debug gehen.

debug "[PWD] : $pwd"; 

Das ist es. Es kümmert sich automatisch um Zeilenumbrüche und solche für Sie.

0

könnten Sie select verwenden, bevor Umleitung in einer Variablen

my $oldfh = select(STDERR); 

zu speichern und verwenden Sie dann später

select($oldfh); 

Sie auch:

+0

Ich habe eine globale Variable '$ STDERR_COPY' hinzugefügt und dann versucht, mit' my $ stdErr = select ($ STDERR_COPY); in stderr zu drucken; 'und dann versuche ich auf dem' stderr' zu drucken "main :: STDERR") als Symbolref während "strict refs" –

Verwandte Themen