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