本番環境で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ブロック内のコードが効果的に実行されている確信しています。
ご協力いただければ幸いです。
注:ほとんどの場合、シングルトンクラスは '$ log_file'のようなグローバル変数よりも良いです。名前空間は、コードを整理し、名前の競合を避けるのに役立ちます。各モジュールはそのローカル名前空間を「所有」していますが、グローバル変数空間は共有されているので、そこには通常多くの問題があります。 – tadman
生産Sinatraにファイルを作成するためのファイル/ディレクトリ権限がありますか?何かエラーがありますか? – Amadan
@AmadanでもIRBからうまく動作します。 REPLからファイルを作成するとパーミッションエラーが発生すると思いますが、それは良い点です。私はそれがそれと関係があるかどうかを見るでしょう。 – Shiyason