MST

星途 面试题库

面试题:Ruby 日志分析之高效解析特定格式日志

已知日志文件中每行记录格式为:[时间戳] [方法名] [参数列表] [返回值],格式举例:[2023 - 10 - 01 12:00:00] method1 [1, 'test'] true 。使用 Ruby 编写一个程序,能够快速解析该日志文件,统计每个方法的调用次数、平均执行时间,并能根据用户输入的方法名查询该方法的详细调用记录。阐述设计思路并给出核心代码。
37.4万 热度难度
编程语言Ruby

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 解析日志文件:逐行读取日志文件,根据日志格式使用正则表达式或字符串分割等方式提取出时间戳、方法名、参数列表和返回值。
  2. 统计调用次数和执行时间:使用哈希表存储每个方法的调用次数和总执行时间,每次解析到方法记录时更新相应统计信息,从而计算平均执行时间。
  3. 查询详细调用记录:同样使用哈希表,以方法名为键,值为该方法的详细调用记录数组,方便根据用户输入的方法名进行查询。

核心代码

# 用于存储每个方法的统计信息
method_stats = {}
# 用于存储每个方法的详细调用记录
method_records = {}

# 解析日志文件
File.foreach('your_log_file.log') do |line|
  timestamp, method_name, args, return_value = line.match(/\[([^\]]+)\] (\w+) \[([^\]]+)\] (\w+)/).captures
  current_time = Time.parse(timestamp)
  if method_stats.key?(method_name)
    method_stats[method_name][:call_count] += 1
    method_stats[method_name][:total_time] += (current_time - method_stats[method_name][:last_time]) if method_stats[method_name][:last_time]
    method_stats[method_name][:last_time] = current_time
  else
    method_stats[method_name] = {call_count: 1, total_time: 0, last_time: current_time}
  end
  method_records[method_name] ||= []
  method_records[method_name] << {timestamp: timestamp, args: args, return_value: return_value}
end

# 计算平均执行时间
method_stats.each do |method_name, stats|
  stats[:average_time] = stats[:total_time] / stats[:call_count].to_f if stats[:call_count] > 0
end

# 根据用户输入查询方法详细调用记录
puts "请输入要查询的方法名:"
input_method = gets.chomp
if method_records.key?(input_method)
  puts "方法 #{input_method} 的详细调用记录:"
  method_records[input_method].each do |record|
    puts "时间戳: #{record[:timestamp]}, 参数列表: #{record[:args]}, 返回值: #{record[:return_value]}"
  end
else
  puts "未找到方法 #{input_method} 的调用记录"
end