Rails如何关闭模板渲染时的控制台日志?性能测试遇日志干扰
解决Benchmark测试中模板渲染日志输出的问题
我之前也碰到过一模一样的场景——用Rails做两种JSON生成方案的性能对比时,模板渲染总会在控制台打出Rendered xxx.json.erb这类日志,完全干扰了Benchmark结果的查看。这里有几个实用的方法可以临时屏蔽这些日志:
方法1:用Rails.logger.silence包裹模板渲染代码
Rails的Logger自带silence方法,能临时提升日志级别,直接屏蔽INFO/WARN级别的渲染日志。把你的模板渲染逻辑包在这个块里就行:
require 'benchmark' Benchmark.bm do |x| # 测试Helper构建JSON的性能 x.report("Helper方案") do 1000.times do records = YourModel.all json = your_hash_building_helper(records).to_json.html_safe end end # 测试模板渲染,同时屏蔽日志 x.report("JSON模板方案") do 1000.times do Rails.logger.silence do json = render_to_string(template: 'path/to/your/template', formats: [:json]) end end end end
默认情况下,silence会把日志级别临时调到ERROR,只有错误日志才会输出。要是你需要更精细的控制,还能传入指定级别,比如只屏蔽INFO级:Rails.logger.silence(:warn),这样WARN及以上的日志依然会显示。
方法2:临时修改日志级别再恢复
如果你不想用silence块,也可以手动保存原日志级别,临时修改后再恢复,适合需要灵活调整的场景:
Benchmark.bm do |x| # 先保存原来的日志级别 original_log_level = Rails.logger.level x.report("JSON模板方案") do # 临时把日志级别设为ERROR,屏蔽INFO/WARN Rails.logger.level = Logger::ERROR 1000.times do json = render_to_string(template: 'path/to/your/template', formats: [:json]) end # 测试完必须恢复原级别,避免影响后续代码 Rails.logger.level = original_log_level end end
额外技巧:屏蔽数据库查询日志
如果模板渲染还会触发数据库查询,导致控制台打出查询日志,你可以同时屏蔽ActiveRecord的日志:
Rails.logger.silence do ActiveRecord::Base.logger.silence do json = render_to_string(template: 'path/to/your/template', formats: [:json]) end end
这样就能得到完全干净的Benchmark输出,方便你清晰对比两种方案的性能差异。
内容的提问来源于stack exchange,提问作者Cruz Nunez
相关产品推荐
相关产品推荐

