【问题标题】:Ruby on rails log file size too largeRuby on rails 日志文件太大
【发布时间】:2011-12-08 16:51:39
【问题描述】:

我偶然发现我的 rails3.1 日志文件非常大,大约 21mb。 就尺寸而言,这是正常的吗?生产环境中的日志文件是什么样的? 此外,我可以摆脱日志吗?谢谢

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3.1 filesize logging


    【解决方案1】:

    Rails 应用程序的log 文件夹包含三个对应于每个标准环境的日志文件。随着时间的推移,日志文件会变得非常大。提供了rake task 以便于清除日志文件。

    rake log:clear
    # Truncates all *.log files in log/ to zero bytes 
    # Specify which logs with LOGS=test,development,production
    

    【讨论】:

    • 这个答案应该已经被接受了。在乘客部署中,一旦您删除日志文件,rails 就不会创建新文件。
    【解决方案2】:

    你可以删除文件!
    如果不存在,Rails 将创建一个新日志。
    如果文件很重要,显然保存/备份文件,但通常不是。
    如果您想将备份文件保存在同一个驱动器上但仍要节省空间,您也可以压缩备份文件(然后删除源文件)。

    要自动轮换日志文件(最好的长期解决方案),请使用此处所述的日志轮换:

    Ruby on Rails production log rotation

    然后你可以设置它并忘记它!

    要实际更改记录的内容,请参阅:

    http://dennisreimann.de/blog/silencing-the-rails-log-on-a-per-action-basis/

    【讨论】:

    • 我的意思是,如果 Rails 有可能不生成日志文件。
    • 我不知道这是否可以轻松完成。也许将其别名为 dev/null?不,最好使用旋转,所以我也添加了它。
    • 将过期链接更新为真实链接。
    【解决方案3】:

    According to the documentation,如果你想限制日志文件夹的大小,把它放在你的'development.rb'-file中:

    config.logger = ActiveSupport::Logger.new(config.paths['log'].first, 1, 50 * 1024 * 1024)
    

    这样,您的日志文件将永远不会超过 50Mb。您可以根据自己的喜好更改大小。第二个参数中的“1”表示将保留 1 个历史日志文件,因此您将拥有最多 100Mb 的日志——当前日志和之前的 50Mb 块。

    【讨论】:

    【解决方案4】:

    您可能想使用logrotate。看看这个问题的答案:Ruby on Rails production log rotation

    【讨论】:

      【解决方案5】:

      我自动清除每台以config/initializers/clear_development_log.rb开头的服务器上的开发日志:

      if Rails.env.development?
        `rake log:clear`
      end
      

      【讨论】:

      • 您应该在log:clear 之后添加LOGS=development,这样它只会清除development.log
      【解决方案6】:

      是的,您可以使用如下语法:

      config.logger = ActiveSupport::Logger.new(config.log_file, num_of_file_to_keep, num_of_MB*1024*1024)
      

      例子:

      config.logger = ActiveSupport::Logger.new(config.log_file, 2, 20*1024*1024)
      

      它不仅用于 Rails 日志,还可以使用任何使用 Rails 运行的服务的日志文件,例如:rpush log,...

      【讨论】:

      • log_file 方法不存在,至少在 Rails 5+ 中
      【解决方案7】:

      config.logger = ActiveSupport::Logger.new(nil) 做到了这一点,并完全禁用了对文件的日志记录(保留控制台输出)。

      【讨论】:

        【解决方案8】:

        一个公平的妥协,在初始化器中:

        Rake::Task['log:clear'].invoke if Rails.env.development? || Rails.env.test?
        

        【讨论】:

          【解决方案9】:

          如果您不喜欢等待rake log:clear 加载其环境并且只想即时清除一个日志,您可以执行以下操作:

          cat /dev/null > log/mylog.log # Or whatever your log's name is
          

          (这允许日志在应用程序运行时保持在线,而rm log/mylog.log 需要重新启动应用程序。)

          【讨论】: