You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需重启服务器动态修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 07:12:01