2017-08-22 47 views
5

Tôi có tệp nhật ký trong đó mỗi dòng chứa địa chỉ IP, thời gian truy cập và URL được truy cập. Tôi muốn đếm số lượt truy cập mỗi giờ.Cách đếm số lần truy cập mỗi giờ từ các mục nhập tệp nhật ký?

Thời gian truy cập dữ liệu trông như thế này

[01/Jan/2017:14:15:45 +1000] 
[01/Jan/2017:14:15:45 +1000] 
[01/Jan/2017:15:16:05 +1000] 
[01/Jan/2017:16:16:05 +1000] 

Làm thế nào tôi có thể cải thiện nó vì vậy tôi không cần phải thiết lập các biến và câu lệnh if cho mỗi giờ?

twoPM = 0 
thrPM = 0 
fouPM = 0 
timeStamp = line.split('[')[1].split(']')[0] 
formated_timeStamp = datetime.datetime.strptime(timeStamp,'%d/%b/%Y:%H:%M:%S %z').strftime('%H') 
if formated_timeStamp == '14': 
    twoPM +=1 
if formated_timeStamp == '15': 
    thrPM +=1 
if formated_timeStamp == '16': 
    fouPM +=1 
+2

Di chuyển từ Xem xét mã vì chỉ hiếm khi "hoạt động" và về cơ bản câu hỏi là yêu cầu viết lại mã. –

Trả lời

3
  1. Bạn có thể bao gồm khung thành của bạn mô tả định dạng strptime:

    datetime.datetime.strptime(line.strip(),'[%d/%b/%Y:%H:%M:%S %z]') 
    
  2. Bạn có thể trích xuất các giờ sử dụng .hour thuộc tính của bất kỳ đối tượng datetime.datetime:

    timestamp = datetime.datetime.strptime(…) 
    hour = timestamp.hour 
    
  3. Bạn có thể đếm số o yếu tố f sử dụng một collections.Counter:

    from collections import Counter 
    
    
    def read_logs(filename): 
        with open(filename) as log_file: 
         for line in log_file: 
          timestamp = datetime.datetime.strptime(
            line.strip(), 
            '[%d/%b/%Y:%H:%M:%S %z]') 
          yield timestamp.hour 
    
    
    def count_access(log_filename): 
        return Counter(read_logs(log_filename)) 
    
    
    if __name__ == '__main__': 
        print(count_access('/path/to/logs/')) 
    
1

Bạn có thể sử dụng một từ điển:

per_hour = {} 
per_hour[formated_timeStamp] += 1 

vì vậy bạn sẽ có được một cái gì đó như

{'0': 12, '1': 8, '2': 41, ...} 

nơi phím đại diện cho một giờ.

2

Bạn không nói liệu truy cập mỗi giờ là hàng ngày hay gì. Vì vậy, có rất nhiều cách mà điều này có thể xảy ra. Nhưng đây là một phiên bản đơn giản:

import collections 
import io 

log_data = ''' 
[01/Jan/2017:14:15:45 +1000] 
[01/Jan/2017:14:15:45 +1000] 
[01/Jan/2017:15:16:05 +1000] 
[01/Jan/2017:16:16:05 +1000] 
''' 

def filter_lines(file): 
    for line in file: 
     if line.startswith('['): 
      yield line 

def extract_hour_from_line(seq): 
    for line in seq: 
     yield line.split(':')[1] 

def access_per_hour(file): 

    aph = collections.Counter(extract_hour_from_line(filter_lines(file))) 
    return aph 


if __name__ == '__main__': 
    logfile = io.StringIO(log_data) 
    aph = access_per_hour(logfile) 
    print(aph) 

Điều này sử dụng StringIO để chuyển đổi các dòng bạn cung cấp làm ví dụ thành tệp "trong bộ nhớ" có thể đọc được. Bạn chỉ có thể mở tệp nhật ký của mình, như bạn không nghi ngờ gì đã làm, để xử lý việc này bình thường.

Bộ sưu tập. Lớp thu nhận có chuỗi và tạo đối tượng giống từ điển trong đó các khóa là các mục từ chuỗi và giá trị là số đếm - số lần mỗi lần xuất hiện trong chuỗi.

Phiên bản mã này chỉ cần đếm tất cả các giá trị giờ khác biệt, không liên quan đến những gì ngày quyền truy cập xảy ra vào. Đó là, 12:00 vào thứ Ba và 12:00 ngày thứ tư được coi là cùng một giờ. Điều này rất hữu ích nếu bạn chỉ cần xây dựng một biểu đồ của nhu cầu từng giờ.

Nếu bạn muốn thực hiện nhóm nâng cao hơn, bạn có thể thử sử dụng hàm filter_lines để giới hạn những dòng bạn muốn xem, tổng thể. Ví dụ: chỉ các dòng giữa một phạm vi ngày hoặc chỉ các dòng truy cập một URL cụ thể.

Nếu bạn muốn đối xử với các ngày khác nhau, bạn có thể sử dụng hàm extract_hour_from_line để tạo một giá trị riêng biệt - ví dụ, nối ngày và giờ.

Các vấn đề liên quan