代码之家  ›  专栏  ›  技术社区  ›  Satchel

如何使用记录器根据ruby中的ENV变量更改记录器设置?

  •  0
  • Satchel  · 技术社区  · 10 年前

    我使用此设置了以下内容: Ruby - share logger instance among module/classes

    编辑: 基于下面的评论,我更新了代码,但日志记录仍然存在问题。

    module Logging
    
      # in classes needing to be logged use 'include Logger'
      require 'logger'
      require 'remote_syslog_logger'
      require_relative 'env'
    
      class << self
        def logger
    
          return @logger if @logger
    
          if ENV['ENVIRONMENT'] == 'production' #may need to change this
    
            @logger ||= Logger.new($stdout)
    
            @logger.level = Logger::WARN
            @logger.datetime_format = "%N "
    
          elsif ENV['ENVIRONMENT'] == 'development'
    
            binding.pry
    
            #$logger = Logger.new(STDOUT)
            @logger = RemoteSyslogLogger.new('logs2.papertrailapp.com',39257)
            @logger.level = Logger::DEBUG
            @logger.datetime_format = "%N "
    
          end 
    
        end
    
        def logger=(logger)
          @logger = logger
        end
      end
    
      # Addition
      def self.included(base)
        class << base
          def logger
            Logging.logger
          end
        end
      end
    
      def logger
        Logging.logger
      end
    
    
    end
    

    我如何记录:

    class CronCheck
      require_relative 'module_logger.rb'
      include Logging
    
      def self.run
        begin
          logger.debug "**** running cron_check_schedule.rb #{Time.now}  #{Time.now.to_i}****"
        rescue
      end
    end
    

    问题:我如何修改模块,以便这种类型的逻辑可以定义一次,而我所要做的就是为所有类和方法传递一个ENV值,以便以相同的方式登录?

    我在记录器上出错。debug:“%N”的未定义方法“debug”:字符串

    2 回复  |  直到 9 年前
        1
  •  0
  •   Jordan Running    10 年前

    您的代码几乎完全正确。不过,你需要做的是 Logging.logger $logger :

    def self.instantiate_logger
      logger = Logger.new(STDOUT)
      logger.datetime_format = "%N "
    
      if ENV['ENVIRONMENT'] == 'production'
        logger.level = Logger::WARN
      elsif ENV['ENVIRONMENT'] == 'development'
        logger.level = Logger::DEBUG
      end
    
      Logging.logger = logger
    end
    

    从你的问题中还不清楚这个方法在哪里,但它应该在你的应用程序初始化期间可以调用的地方。

    你会注意到我删除了与Pry相关的代码;由于该代码与日志记录没有直接关系,所以它可能应该放在其他地方。

    不过,我还要做一个改进,就是通过将日志级别放在由各自环境键入的哈希中,使其更具声明性:

    LOG_LEVELS = {
      "production" => Logger::WARN,
      "development" => Logger::DEBUG
    }
    
    def self.instantiate_logger
      Logging.logger = Logger.new(STDOUT).tap do |logger|
        logger.datetime_format = "%N "
        logger.level = LOG_LEVELS[ENV['ENVIRONMENT']] || LOG_LEVELS["development"]
      end
    end
    
        2
  •  0
  •   Aleksei Matiushkin    10 年前

    假设第一个片段是 module Logging 您假设在任何地方都包含日志记录(否则,第二个片段中的全局var完全可以开箱即用),您只需要根据片段2初始化记录器:

    # this is the topmost method from your snippet #1,
    #    updated to use env settings for logger tuning
    def logger
      # @logger ||= Logger.new($stdout)
      return @logger if @logger
    
      @logger = case ENV['ENVIRONMENT']
                when 'production'
                  Logger.new(STDOUT).tap do |logger|
                    logger.level = Logger::WARN
                    logger.datetime_format = "%N "
                  end
                else 
                  .......
                end
    end
    

    就是这样。