【发布时间】:2011-01-22 21:46:43
【问题描述】:
我正在通过 RACK 运行一个 sinatra 应用程序。
活动记录到哪个文件?还有如何设置日志文件路径?
【问题讨论】:
我正在通过 RACK 运行一个 sinatra 应用程序。
活动记录到哪个文件?还有如何设置日志文件路径?
【问题讨论】:
这取决于。许多开发人员将他们的应用日志文件定义为 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。
【讨论】:
$stdout 和$stderr 时,它也将测试输出重定向到文件。
@include's answer above 中的LOGGER = Logger.new("sinatra.log") 行对我不起作用。
但是,列出的替代方案 here(以及一些有用的解释)对我有用,并使用 ruby 2.5.3 和 sinatra 2.0.1 进行了测试。
有关其他信息,该替代方案基于 Sinatra recipe 中提供的结构。
【讨论】:
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
$stderr 和 STDERR 指的是不同的对象。 STDERR 仍然流到这里的终端,
>> STDERR.puts "Uh-oh, original STDERR"
Uh-oh, original STDERR
=> nil
恢复$stderr,
>> $stderr = STDERR
=> #<IO:0x106fddb88>
>> $stderr.object_id == STDERR.object_id
=> true
我们回来了!
【讨论】: