2011-05-26 106 views
3
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。據我瞭解,它是空的。紅寶石:檢查對象是無

正則表達式中的一些子模式失敗?所以這是Web服務器的錯誤,有時會產生錯誤的日​​志字符串?

順便說一句如何寫入紅寶石文件?我無法在窗口下的cmd窗口中正確讀取。

+1

「據我所知,這是零。」 Ruby中沒有'null'這樣的東西。只是'無'。 – 2011-05-26 18:59:33

+0

爲什麼得到零?該功能沒有列出到最後,並且您定義了多個變量... – Amadan 2011-05-26 19:00:07

+0

馬克我知道。 Amadan這不是我的腳本伴侶。 :)據我瞭解正則表達式將子模式匹配投入列出的變量。像PHP中的列表函數,當子模式失敗時,它只是分配零對象嗎? – Somebody 2011-05-26 19:01:10

回答

6

你似乎這裏有幾個問題,所以我會採取什麼似乎是一個主要的刺:

如果你想看看是否有是無,只是使用.nil? - 在讓你例如,您可以只說request.nil?,如果它是nilfalse,則返回true

+0

感謝隊友。那做了這個工作。如果!request.nil? && request;) – Somebody 2011-05-26 19:19:08

+0

哈!並非如此:D – Somebody 2011-05-26 19:23:25

+0

我會捕獲失敗的請求,並瞭解爲什麼模式失敗。問題仍然打開。爲什麼它通過聲明? :) – Somebody 2011-05-26 19:25:30

2

要寫入文件:

File.open("file.txt", "w") do |file| 
    file.puts "whatever" 
end 

正如我在評論上面寫 - 你沒有說什麼爲零。另外,請檢查referrer是否包含您認爲它包含的內容。 編輯我看到它的請求是nil。顯然,正則表達式的麻煩。

使用rubular.com可以輕鬆測試您的正則表達式。將輸入文件中的一行復制到「您的測試字符串」中,並將您的正則表達式複製到「您的正則表達式」中,然後進行調整,直到您在「匹配結果」中獲得高亮顯示。

另外,什麼是「錯誤的日誌字符串」?如果我們在談論Apache,日誌格式是可配置的。

+0

伴侶... :)爲什麼它通過這個?如果請求&&請求!=無 – Somebody 2011-05-26 19:11:22

+0

是的,我知道,我剛剛評論過。這應該是不可能的。 – Amadan 2011-05-26 19:12:19

+0

如何在Ruby中檢查一些變量,在我們的例子中它的請求不是nil的一個實例? – Somebody 2011-05-26 19:12:23

2

Ruby 2.3.0添加了一個安全導航運算符&.),它在調用方法之前檢查nil

request&.split(' ') 

這或多或少是語義上等同於

!request.nil? && request.split(' ')