【问题标题】:Where does RACK log to?RACK 记录到哪里?
【发布时间】:2011-01-22 21:46:43
【问题描述】:

我正在通过 RACK 运行一个 sinatra 应用程序。

活动记录到哪个文件?还有如何设置日志文件路径?

【问题讨论】:

    标签: ruby sinatra rack


    【解决方案1】:

    这取决于。许多开发人员将他们的应用日志文件定义为 app/servername.log 或仅定义为加载 Rack 应用的当前路径。

    是的,你可以改变它的路径。

    通常您会得到一个 config.ru 文件,其中包含以下内容:

        log = File.new("sinatra.log", "a+")
        $stdout.reopen(log)
        $stderr.reopen(log)
    
        # optionally to sync logs while the server is running
        $stderr.sync = true
        $stdout.sync = true
    

    和/或

        configure do
          LOGGER = Logger.new("sinatra.log")
          enable :logging, :dump_errors
          set :raise_errors, true
        end
    

    在这种情况下,日志文件位于 appdir/sinatra.log 下。但请记住,此代码可以在您的 Rack 应用程序中的任何位置,因此请在您的应用程序目录中查找“日志”。

        $ cd projectname
        $ grep -ri 'log' *
    

    玩得开心并在此处发布您的 config.ru 和/或 mainprojectfile.rb。

    【讨论】:

    • 你好,弗朗西斯科。是的,这对我来说很完美。 log_path = "" LOGGER = Logger.new(log_path, "daily") log = File.new(log_path, "a+") STDOUT.reopen(log) STDERR.reopen(log)
    • @include: 有没有一种方法可以让生产和开发环境记录到文件但将测试记录到终端?似乎当我重新打开$stdout$stderr 时,它也将测试输出重定向到文件。
    • 重新打开 STDOUT 会使Passenger无法启动:github.com/phusion/passenger/wiki/…
    【解决方案2】:

    @include's answer above 中的LOGGER = Logger.new("sinatra.log") 行对我不起作用。

    但是,列出的替代方案 here(以及一些有用的解释)对我有用,并使用 ruby​​ 2.5.3 和 sinatra 2.0.1 进行了测试。

    有关其他信息,该替代方案基于 Sinatra recipe 中提供的结构。

    【讨论】:

      【解决方案3】:

      object_id 最初是相同的,但最好分配给$stderr。这也让您可以使用STDERR 将流返回到原来的位置:

       $ irb
      >> $stderr.object_id == STDERR.object_id
      => true
      

      现在是同一个对象。发送到别处,

      >> $stderr = File.open('/tmp/foo', 'w')
      => #<File:/tmp/foo>
      >> $stderr.puts "Uh-oh, foo"
      => nil
      >> $stderr.flush    # if you want to verify its output
      => #<File:/tmp/foo>
      >> $stderr.object_id == STDERR.object_id
      => false
      

      $stderrSTDERR 指的是不同的对象。 STDERR 仍然流到这里的终端,

      >> STDERR.puts "Uh-oh, original STDERR"
      Uh-oh, original STDERR
      => nil
      

      恢复$stderr

      >> $stderr = STDERR
      => #<IO:0x106fddb88>
      >> $stderr.object_id == STDERR.object_id
      => true
      

      我们回来了!

      【讨论】:

        猜你喜欢
        • 2011-02-24
        • 2011-06-18
        • 2018-03-27
        • 2010-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-15
        相关资源
        最近更新 更多