2016-05-08 16 views
1

本番環境でSinatraを使用している私の人生の間、ファイルに書き込むことはできません。sinatraを使用して本番環境のファイルに書き込む

私の開発環境では、問題なくLoggerを使用してSTDOUTをファイルに記録できます。

生産現場のようですが、LoggerクラスはRACKミドルウェアのLoggerで上書きされていて、それはもっと複雑になります。

私は単純に、このようなファイルに書き込みたい:私は「/」にPOSTリクエストを受信したとき

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 

ファイルが作成されません。

しかし、私はアプリを実行しているてこロード時にファイルが作成されますDOES:

pry -r ./app.rb 

私は新しい仕事が要求を受信すると、データベースに追加取得しているため、POSTブロック内のコードが効果的に実行されている確信しています。

ご協力いただければ幸いです。

+0

注:ほとんどの場合、シングルトンクラスは '$ log_file'のようなグローバル変数よりも良いです。名前空間は、コードを整理し、名前の競合を避けるのに役立ちます。各モジュールはそのローカル名前空間を「所有」していますが、グローバル変数空間は共有されているので、そこには通常多くの問題があります。 – tadman

+0

生産Sinatraにファイルを作成するためのファイル/ディレクトリ権限がありますか?何かエラーがありますか? – Amadan

+0

@AmadanでもIRBからうまく動作します。 REPLからファイルを作成するとパーミッションエラーが発生すると思いますが、それは良い点です。私はそれがそれと関係があるかどうかを見るでしょう。 – Shiyason

答えて

0

私はついにこれの底に到達することができました。

/etc/nginx/nginx.confのnginxユーザーをnginxからec2-userに変更しました。 (理想的には私がちょうどnginxユーザーに対する書き込み権限を修正するだろうが、このソリューションは、今の私に適しています。)

それから私ps aux | grep unicornをし、次のプロセス名にタイムスタンプを見た:unicorn master -c unicorn.rb -Dは3日齢だった!!

今回私はコードをプロダクションサーバにプッシュし、nginxを再起動して、ユニコーンプロセスを一度も終了せずに再起動しませんでした。

私は私のPOSTブロック内のすべてのコードを削除し、ファイルが正常にPOSTリクエストを受信したときに書かれた部分

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

そして唯一のファイルの作成を残しました。

+0

Rubyでは、 '$'で始まる変数はグローバル変数です。グローバル変数を使用しないでください:-)(単に 'log_file = File ....'を実行してください) – mhutter

関連する問題