2016-05-08 4 views
1

Ich kann nicht in eine Datei schreiben für das Leben von mir mit Sinatra in der Produktion.Schreiben in eine Datei in der Produktion mit sinatra

In meiner Entwicklungsumgebung kann ich Logger ohne ein Problem verwenden und STDOUT in einer Datei protokollieren.

Es scheint wie in der Produktion, die Logger Klasse wird von der RACK Middleware Logger überschrieben und es macht die Dinge komplizierter.

Ich möchte einfach in eine Datei wie folgt schreiben: Ist

post '/' do 
    begin 
    $log_file = File.open("/home/ec2-user/www/logs/app.log", "w") 
    ...do..stuff... 
    $log_file.write "INFO -- #{Time.now} --\n #{notification['Message']}" 
    ...do..stuff... 
    rescue 
    $log_file.write "ERROR -- #{Time.now} --" + "\njob failed" 
    ensure 
    $log_file.close 
    end 
end 

Die Datei kann nicht erstellt werden, wenn ich eine POST-Anforderung an ‚/‘ erhalten.

jedoch die Datei erstellt bekommt, wenn ich den Lauf hebel App laden:

pry -r ./app.rb 

Ich bin sicher, der Code innerhalb des POST-Blockes effektiv ausgeführt wird, da neue Arbeitsplätze bei Empfang Anfragen an die Datenbank hinzugefügt zu werden.

Jede Hilfe würde sehr geschätzt werden.

+0

Hinweis: Es ist fast immer besser, eine Singleton-Klasse zu haben als eine globale Variable wie '$ log_file'. Namespaces helfen, den Code zu organisieren und Namenskonflikte zu vermeiden. Jedes Modul "besitzt" seinen lokalen Namespace, aber der globale Variablenraum ist geteilt, daher gibt es dort normalerweise eine Menge Probleme. – tadman

+0

Hat die Produktion Sinatra Datei/Verzeichnis Berechtigungen, um eine Datei dort zu erstellen? Erhalten Sie irgendwelche Fehler? – Amadan

+0

@Amadan funktioniert es gut von IRB obwohl. Ich denke, ich würde Erlaubnisfehler erhalten, wenn ich die Datei von der REPL auch erstelle, aber das ist ein guter Punkt. Ich werde sehen, ob es damit zu tun hat. – Shiyason

Antwort

0

Endlich konnte ich dem auf den Grund gehen.

Ich änderte den Nginx-Benutzer in /etc/nginx/nginx.conf von nginx zu ec2-user. (Idealerweise würde ich fix nur die Schreibrechte für den Benutzer nginx aber diese Lösung passt zu mir jetzt.)

Dann habe ich ps aux | grep unicorn und sah den Zeitstempel neben dem Prozessnamen: unicorn master -c unicorn.rb -D 3 Tage alt war !!

Die ganze Zeit über habe ich meinen Code auf den Produktionsserver geschoben, nginx neu gestartet und nie den Einhornprozess beendet und neu gestartet.

Ich entfernte den gesamten Code in meinem POST-Block und ein Teil nur die Dateierstellung

post '/' do 
    $log_file = File.open("/home/ec2-user/www/logs/app.log", "a") 
    $log_file.write("test log string") 
    $log_file.close 
end 

Und die Datei wurde erfolgreich geschrieben bei Empfang einer POST-Anfrage gelassen.

+0

In Ruby sind Variablen, die mit einem '$' beginnen, globale Variablen. Verwenden Sie keine globalen Variablen :-) (einfach 'log_file = File ....') – mhutter