我正在通过 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。
上面@include's answerLOGGER = Logger.new("sinatra.log")
中的那一行对我不起作用。
但是,此处列出的替代方法(以及一些有用的解释)对我有用,并使用 ruby 2.5.3 和 sinatra 2.0.1 进行了测试。
有关其他信息,该替代方案基于Sinatra 配方中提供的结构。
最初是相同的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
我们回来了!