我正在处理大型Rails应用程序。有数百种不同的搜索功能,我们希望查看搜索数据,以便我们可以分析人们正在搜索的内容以及可以改进的内容。我编写了一个脚本,该脚本将解析日志文件并将结果存储在JSON文件中,然后可以对其进行操作和可视化。但是,当我在控制器中运行JSON.load
或JSON.parse
时,应用程序挂起。没有引发任何错误,但不会加载任何页面。尝试调用后杀死应用程序的唯一方法是运行kill -9 <pid>
。我怎样才能解决这个问题?有什么问题吗?
我确定问题出在JSON.load/parse
,因为如果在它之前引发异常,它将显示出来,但是在它之后则不会出现异常。我尝试将json gem添加到我的Gemfile中,并在应用程序中要求它,但没有任何效果。所有的编码都是正确的,并且JSON文件只有大约8层深,所以我认为这不是问题。
这是创建将哈希转换为json文件的代码:
File.foreach(log_file_path).with_index do |line, line_num|
#Getting time of search
if line_num + 2..3 == @lines_with_searches[index]
date_and_time = /\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} -\d{4}/
temp_metadata[:line] = line_num
temp_metadata["time"] = line.match(date_and_time)[0] if line.match(date_and_time)
end
#Getting controller name and method
if line_num + 1 == @lines_with_searches[index]
#Fixes for missed times
if temp_metadata["time"].nil?
temp_metadata["time"] = prev_date_time
else
prev_date_time = temp_metadata["time"]
end
controller_name = /\w+#\w+/
controller = line.match(controller_name)[0] if line.match(controller_name)
if controller and @searches["search_info"].keys.include? controller
#Adding to existing search object
@searches["search_info"][controller]["num_searches"] += 1
elsif controller
#Setting up new search object
@searches["search_info"][controller] = {}
@searches["search_info"][controller]["num_searches"] = 1
@searches["search_info"][controller]["search_objs"] = []
else
#Implies a missed name
@searches["num_nameless"] += 1
end
end
#Getting search params and resetting for next match
if line_num == @lines_with_searches[index]
temp_metadata[:params] = eval(line.match(/\{.+\}/)[0])
@searches["search_info"][controller]["search_objs"] << temp_metadata
temp_metadata = {}
index += 1
end
end
然后将其转换为JSON.pretty_generate
下方的json-我尝试将其更改为.to_json
和JSON.generate
,但均无效。通过遍历文件并查找同时包含“参数:”和“搜索”的行来进一步生成@lines_with_searches
。
@search_data = JSON.load(File.read(Rails.root.to_s + "/script/out/search_log.json"))
这是加载JSON文件的代码。
我希望程序不会挂起,或者至少在加载文件时引发错误。相反,它会挂起我的整个应用程序。