def parse( line )
_, remote_addr, status, request, size, referrer, http_user_agent, http_x_forwarded_for = /^([^\s]+) - (\d+) \"(.+)\" (\d+) \"(.*)\" \"([^\"]*)\" \"(.*)\"/.match(line).to_a
print line
print request
if request && request != nil
_, referrer_host, referrer_url = /^http[s]?:\/\/([^\/]+)(\/.*)/.match(referrer).to_a if referrer
method, full_url, _ = request.split(' ')
in parse: private method 'split' called for nil:NilClass (NoMethodError)
据我所知,它正在调用split
而不是字符串,而是调用nil
。
这部分是解析Web服务器日志。但是我无法理解为什么会得到nil
。据我所知,它是空的。
正则表达式中的一些子模式失败了吗?所以这是网络服务器的错,有时会生成错误的日志字符串?
顺便问一下,如何在ruby中写入文件?我无法在Windows下的这个cmd窗口中正确阅读。
答案 0 :(得分:15)
你似乎在这里有几个问题,所以我会尝试一下似乎是主要的问题:
如果您想查看某些内容是否为零,请使用.nil?
- 所以在您的示例中,您可以说request.nil?
,如果true
则返回nil
}和false
否则。
答案 1 :(得分:3)
要写入文件:
File.open("file.txt", "w") do |file|
file.puts "whatever"
end
当我在上面的评论中写道时 - 你没有说 是什么。另外,请检查referrer
是否包含您认为包含的内容。 编辑我看到它的请求是nil
。显然,regexp麻烦。
使用rubular.com轻松测试正则表达式。将输入文件中的一行复制到“您的测试字符串”中,并将正则表达式复制到“您的正则表达式”中,然后进行调整,直到您在“匹配结果”中获得突出显示。
另外,什么是“错误的记录字符串”?如果我们正在谈论Apache,日志格式是可配置的。
答案 2 :(得分:3)
Ruby 2.3.0添加了一个安全导航操作符(&.
),在调用方法之前检查nil
。
request&.split(' ')
这或多或少在语义上等同于
!request.nil? && request.split(' ')