2013-04-17 55 views
1

我正在爲我的工作環境編寫一個小型日誌嗅探器程序,用於在日誌中搜索幾個關鍵詞,讓用戶知道他們有一些要看的東西。這部分非常簡單,但我試圖實現的功能之一是用戶選擇他們想要返回多遠形式的選項,所以他們沒有從幾個月前得到錯誤,不再重要。Ruby日期範圍和匹配

我已經得到了日期,而且我從現在開始和用戶指定的範圍有差距。我只是不確定如何獲得範圍和匹配的工作。這裏是我的代碼:

require 'date' 
### Get the logfile path from the user 
p "What is the path to your log file?" 
logfile = gets.chomp 

### Get number of days user would like to go back 
p "How many days back from today would you like to look?" 
num_days = gets.chomp 


############################################################################################ 
### Define Log class. Accept argumnet for path of the file. Called by foo = Log.new 
############################################################################################ 
class Log 

    def scan_log(file_name, days) 
     error_exists = false 
     verify = false 
     apn = false 
     strict = false 
     days = days.to_i 
     # time = Time.now.strftime("%Y-%m-%d") 
     now = Date.today 
     days_ago = (now - days) 
     p now 
     p days_ago 

     File.open(file_name, "r") do |file_handle| 
      file_handle.each_line do |line| 
       if line =~ /Unable to verify signature/ 
        verify = true 
        error_exists = true 
       end 

       if line =~ /gateway.push.apple.com/ 
        apn = true 
        error_exists = true 
       end 

       if line =~ /Data truncation/ 
        strict = true 
        error_exists = true 
       end 
      end 
     end 

     p "Verify signature error found" if verify 


     p "You have an APNS error" if apn 


     p "You have strict mode enabled" if strict 

    end 

end 

l = Log.new 
l.scan_log(logfile, num_days) 

我的想法是file_handle.each_line下的循環會...工作。我會在循環中包含現有的if語句,並且循環會將用戶設置的日期範圍與日誌中的日期相匹配。在日誌中的格式爲:

2013年4月17日十五點10分42秒,767

我不關心的時間戳,只是郵戳。

如果你可以幫忙,謝謝。

回答

0

您可以從日期(如問題標題暗示)構造一個Range並使用它的include?方法。

require 'date' 

puts "How many days back from today would you like to look?" 
days_back = gets.to_i #input: 3 

logline_date = "2013-04-17 15:10:42, 767" 

end_date = Date.today 
start_date = end_date - days_back 
selected_range = start_date..end_date 

p selected_range.include?(Date.parse(logline_date)) #true (today for me, that is) 
+0

謝謝。我也會給這個鏡頭。上面的固定工作流程大部分都在工作,但當遇到沒有時間戳的行時,我遇到了Time.parse的問題。我得弄清楚現在。 – ckbrumb

1

解析自由格式的日期一個可靠的方法是:

> Time.parse(" 2013-04-17 13:15:24 -0700 ").strftime("%Y-%m-%d") 
    => "2013-04-17" 
> Time.parse("Wed Apr 17 13:15:09 PDT 2013 ").strftime("%Y-%m-%d") 
    => "2013-04-17" 

假設用戶指定「%Y-%間%d」格式和時間範圍內,你可以做的起始日期這樣的:

start_date = Time.parse(user_provided_date) # e.g. "2013-04-10" 
log_date = Time.parse(line) 

do_something if (start_date - log_date) < number_of_seconds # or whatever time range 

如果你只是想表明它比一個給定的時間範圍內更新的所有日誌,那麼你可以這樣做:

log_date = Time.parse(line) 

do_something if (Time.now - log_date) < number_of_seconds # or whatever time range 

要獲得Rails樣式的漂亮時間範圍,例如1.day或12.hours,可以包含ActiveSupport::Duration

+0

'3.days'是Rails(ActiveSupport)。 – steenslag

+0

謝謝你的迴應。我會給它一個鏡頭,讓你知道它是怎麼回事。 – ckbrumb

+0

@steenslag謝謝。那本來會讓我震驚的。如果(Time.now - log_date) ckbrumb