无需重启服务器动态修改Sinatra日志级别的相关问题咨询
动态调整Sinatra生产服务器日志级别可行方案
完全可以在不重启服务的情况下调整日志级别,Sinatra的logger实例默认挂载在settings.logger全局配置下,运行时可以直接修改其level属性实现级别切换,常见落地方式有两种:
方案1:预埋内网管理路由
提前在应用代码中添加仅可信IP可访问的管理接口,后续随时通过接口调用调整级别:
require 'ipaddr' # 访问权限校验,仅允许内网指定IP访问 before '/admin/log-level' do allowed_ips = ['127.0.0.1', '192.168.0.0/16'] # 替换为实际的运维端IP段 halt 403, '无访问权限' unless allowed_ips.any? { |range| IPAddr.new(range).include?(request.ip) } end post '/admin/log-level' do level_map = { debug: Logger::DEBUG, info: Logger::INFO, warn: Logger::WARN, error: Logger::ERROR } target_level = params[:level]&.downcase&.to_sym if level_map.key?(target_level) settings.logger.level = level_map[target_level] "日志级别已成功调整为#{target_level.upcase}" else "无效级别,可选值:debug/info/warn/error" end end
使用时直接发起HTTP请求即可:curl -X POST "http://你的服务地址/admin/log-level?level=debug"
方案2:注册系统信号处理逻辑
不需要额外暴露路由,通过系统进程信号触发级别切换,提前在应用启动代码中添加信号监听:
# 捕获USR1信号切换为DEBUG级别 Signal.trap('USR1') do settings.logger.level = Logger::DEBUG settings.logger.info("[系统信号触发] 日志级别已调整为DEBUG") end # 捕获USR2信号切回INFO级别 Signal.trap('USR2') do settings.logger.level = Logger::INFO settings.logger.info("[系统信号触发] 日志级别已切回INFO") end
使用时先找到Sinatra服务的进程PID,执行对应命令即可:
- 切换为DEBUG:
kill -USR1 服务PID - 切回INFO:
kill -USR2 服务PID
注意事项:如果使用多Worker部署模式(如Puma多Worker、Unicorn),需要确保信号能发送到所有Worker进程,或配置logger为全进程共享实例,避免仅修改单个Worker的日志级别不生效。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

