【问题标题】:Logger fail with Sinatra 1.4.2, Ruby 2.0.0-p195, Passenger 4.0.3 and Rack 1.5.2?记录器在 Sinatra 1.4.2、Ruby 2.0.0-p195、Passenger 4.0.3 和 Rack 1.5.2 上失败?
【发布时间】:2013-05-22 11:39:18
【问题描述】:

这是我的 config.ru:

require 'sinatra'
require 'rack/contrib'

root_dir = File.dirname(__FILE__)
require File.join(root_dir,'app.rb')

set :environment, :development

log = File.new("log/sinatra.log","a+")
$stdout.reopen(log)
$stderr.reopen(log)
$stderr.sync=true
$stdout.sync=true

run Ivende.new

app.rb:

require 'sinatra'
require 'sinatra/reloader'
require 'time'
require 'json'

class Ivende < Sinatra::Application
enable :sessions
set :environment, :development

configure :production do
set :clean_trace,true
end

configure :development do
set :logging, true
end

helpers do
include Rack::Utils

end
require_relative 'models/init'
require_relative 'helpers/init'
require_relative 'routes/init'
end

内部路线我有这个文件:

class Ivende < Sinatra::Application

get "/" do
"HOME PAGE "
logger.info("foooooolanito")
end
end

我看到的奇怪行为是,当我使用记录器行调用主路线“/”时,资源管理器向我显示典型的乘客错误页面,并显示以下消息:

An error occurred while starting up the preloader: it did not write a startup response in time.

在我得到的 sinatra.log 文件中:

Ready !> socket:
unix:/tmp/passenger.1.0.10641/generation-0/backends/preloader.10677 !>
!> Ready !> socket:
unix:/tmp/passenger.1.0.10641/generation-0/backends/preloader.10721 !>
!> Ready !> socket:
unix:/tmp/passenger.1.0.10641/generation-0/backends/preloader.10774 !>
!> Ready !> socket:
unix:/tmp/passenger.1.0.10641/generation-0/backends/preloader.10806 !>

在我得到的 Apache 日志中:

in 'void
Passenger::ApplicationPool2::SmartSpawner::throwPreloaderSpawnException(const
string&, Passenger::SpawnException::ErrorKind,
Passenger::ApplicationPool2::Spawner::BackgroundIOCapturerPtr&, const
DebugDirPtr&)' (SmartSpawner.h:150) in 'std::string
Passenger::ApplicationPool2::SmartSpawner::negotiatePreloaderStartup(Passenger::ApplicationPool2::SmartSpawner::StartupDetails&)'
(SmartSpawner.h:558) in 'void
Passenger::ApplicationPool2::SmartSpawner::startPreloader()'
(SmartSpawner.h:206) in 'virtual
Passenger::ApplicationPool2::ProcessPtr
Passenger::ApplicationPool2::SmartSpawner::spawn(const
Passenger::ApplicationPool2::Options&)' (SmartSpawner.h:744) in 'void
Passenger::ApplicationPool2::Group::spawnThreadRealMain(const
SpawnerPtr&, const Passenger::ApplicationPool2::Options&, unsigned
int)' (Implementation.cpp:695)

[ 2013-05-26 01:36:23.7933 10646/7f6ed6a34700
agents/HelperAgent/RequestHandler.h:1884 ]: [Client 20] Cannot
checkout session. An error occurred while starting up the preloader:
it did not write a startup response in time. [ 2013-05-26
01:36:24.2287 10646/7f6ed8b49700 Pool2/Spawner.h:739 ]: [App 10874
stdout]  [ 2013-05-26 01:37:54.1869 10646/7f6ed8b49700
Pool2/Implementation.cpp:762 ]: Could not spawn process for group
/home/dd/dev/ivende/wsapi#default: An error occurred while starting up
the preloader: it did not write a startup response in time. in 'void
Passenger::ApplicationPool2::SmartSpawner::throwPreloaderSpawnException(const
string&, Passenger::SpawnException::ErrorKind,
Passenger::ApplicationPool2::Spawner::BackgroundIOCapturerPtr&, const
DebugDirPtr&)' (SmartSpawner.h:150) in 'std::string
Passenger::ApplicationPool2::SmartSpawner::negotiatePreloaderStartup(Passenger::ApplicationPool2::SmartSpawner::StartupDetails&)'
(SmartSpawner.h:558) in 'void
Passenger::ApplicationPool2::SmartSpawner::startPreloader()'
(SmartSpawner.h:206) in 'virtual
Passenger::ApplicationPool2::ProcessPtr
Passenger::ApplicationPool2::SmartSpawner::spawn(const
Passenger::ApplicationPool2::Options&)' (SmartSpawner.h:744) in 'void
Passenger::ApplicationPool2::Group::spawnThreadRealMain(const
SpawnerPtr&, const Passenger::ApplicationPool2::Options&, unsigned
int)' (Implementation.cpp:695)

[ 2013-05-26 01:37:54.1871 10646/7f6ed6a34700
agents/HelperAgent/RequestHandler.h:1884 ]: [Client 20] Cannot
checkout session. An error occurred while starting up the preloader:
it did not write a startup response in time.

如果我从 config.ru 中删除这些行:

log = File.new("log/sinatra.log","a+") 
$stdout.reopen(log) 
$stderr.reopen(log) 
$stderr.sync=true 
$stdout.sync=true

还有:

logger.info("foooooolanito")

然后我看到了我期望的主页文本。

这个项目是从一台安装了 Ruby 1.9.3-p327、Passenger 3.0.3、Sinatra 1.3.5 的机器迁移而来的,它运行良好。

我能做什么?

【问题讨论】:

    标签: ruby logging sinatra passenger


    【解决方案1】:

    在相关位置添加这些行:

    require "logger"
    
    logger = Log.new("log/sinatra.log","a+")
    logger.sync = true
    
    logger.info("foooooolanito")
    

    基本上你的get '/' 没问题,但是你没有在任何地方定义logger 也没有你required logger

    如果您有其他想法,请告诉我。

    【讨论】:

    • 在升级到 ruby​​ 2.0.0 之前,此代码运行良好,即便如此,我还是尝试了您的建议并显示典型的乘客错误页面,抱怨“日志”未定义,但缺少一些宝石?
    • a+ 在追加时不需要,只有a 是。 a+ 表示“如果文件存在则打开文件并移动到最后,如果不存在则创建它,并允许对文件进行读/写访问”,此时只需要写访问权限。
    【解决方案2】:

    注释掉这一行:

    $stdout.reopen(log)
    

    我认为原因是乘客 4 期望能够通过 STDOUT 与工人交谈。但是,我现在并不确定解决 Sinatra 日志记录问题的最佳方法。

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 1970-01-01
      • 2013-06-15
      • 1970-01-01
      • 2011-04-11
      • 2021-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多