Ruby 在Sinatra应用程序中将Log4r用作记录器

Ruby 在Sinatra应用程序中将Log4r用作记录器,ruby,logging,sinatra,log4r,Ruby,Logging,Sinatra,Log4r,我想在Sinatra 1.3.1应用程序中使用带有日志级别信息、警告和错误的log4r。输出应转到requests.log(http请求)、error.log和sinatra.log(其他输出) 如何配置它 我刚刚花了很多时间在谷歌上搜索相关文章,但什么也没找到。非常感谢您的帮助……编写一个中间件来替换env['rack.errors']和env['rack.logger']我假设您使用的是经典的sinatra。(只有一个名为app.rb的文件,您可以使用$ruby app.rb运行它) 在ap

我想在Sinatra 1.3.1应用程序中使用带有日志级别信息、警告和错误的log4r。输出应转到requests.log(http请求)、error.log和sinatra.log(其他输出)

如何配置它


我刚刚花了很多时间在谷歌上搜索相关文章,但什么也没找到。非常感谢您的帮助……

编写一个中间件来替换
env['rack.errors']
env['rack.logger']
我假设您使用的是经典的sinatra。(只有一个名为app.rb的文件,您可以使用
$ruby app.rb
运行它)

  • 在app.rb的

    require 'sinatra'
    
    # load the lib/logger_tool.rb
    Dir[File.join(__dir__, 'lib', '*.rb')].each { |file| require file }
    
    # define the logger as global variable.
    $logger = LoggerTool.get_logger log_file_postfix: ENV['market_id'], 
        name: Sinatra::Application.environment.to_s
    
    get '/' do
      $logger.info "-- in hihihi"
      'hihihi'
    end
    
  • lib/logger\u file.rb中

    require 'log4r'
    require 'log4r/yamlconfigurator'
    require 'log4r/outputter/datefileoutputter'
    
    class LoggerTool
      include Log4r
    
      def self.get_logger options
    
        log4r_config= YAML.load_file(File.join(File.dirname(__FILE__), '..', "config", "log4r.yml"))
        temp = log4r_config['log4r_config']
    
        # change the log filename to xx.log (must end with .log)
        # this is optional
        temp["outputters"][0]['filename'] = "my_log_#{options[:log_file_postfix]}.log"
    
        # in test environment, let's rename it as "test.log"
        if options[:name] == 'test'
          temp["outputters"][0]['filename'] = "test"
        end
    
        YamlConfigurator.decode_yaml(temp)
    
        return Log4r::Logger[options[:name]]
      end
    end
    
  • config/log4r.yml

    log4r_config:
      # define all loggers ...
      loggers:
        - name      : production
          level     : WARN
          trace     : 'false'
          outputters :
          - datefile
        - name      : development
          level     : DEBUG
          trace     : 'true'
          outputters :
          - datefile
        - name      : test
          level     : DEBUG
          trace     : 'true'
          outputters :
          - datefile
    
      outputters:
      - type: DateFileOutputter
        name: datefile
        dirname: "log"
        #filename: "my_app.log"   # here we comment it out. 
        formatter:
          date_pattern: '%H:%M:%S'
          pattern     : '%d %l: %m '
          type        : PatternFormatter
    
  • 通过
    $ruby app.rb运行sinatra并访问
    http://localhost:4567/
    ,您将在
    日志
    文件夹中找到一个新创建的日志文件

    log/my\u log\u xx\u 2019\u 03\u 27.log


  • 是的,谢谢。我承认问我的问题是出于懒惰。我已经读过它是怎么做的,我想我现在可以自己做了。