动态日志未出现在 aws cloudwatch 上

问题描述 投票:0回答:1

我正在尝试将 AWS Cloud watch 与我的应用程序集成,但面临多个问题。我尝试了很多事情但没有成功。另外,我没有看到任何关于 aws cloudwatch 的好的文档。任何帮助表示赞赏

  • 无法创建日志流
  • 动态日志未显示

宝石文件

gem 'aws-sdk'
gem 'lograge'

config/initializers/cloudwatch_log.rb

begin
    @cloudwatch_client = Aws::CloudWatchLogs::Client.new

    # Define the log group and log stream names
    @log_group_name = ENV.fetch('APPLICATION_LOG_GROUP_NAME', '/home/app/insight')
    @log_stream_name = "#{Time.now.strftime('%Y-%m-%d')}/$[LATEST]/#{Time.now.to_i}"
    Rails.logger.info "log_group_name: #{@log_group_name} and log_stream_name: #{@log_stream_name} in #{Rails.env} environment...!!!"
    
    @cloudwatch_client.create_log_stream({
        log_group_name: @log_group_name,
        log_stream_name: @log_stream_name
    })

    Rails.application.config.logger.extend(ActiveSupport::Logger.broadcast(Logger.new($stdout)))

    Rails.application.config.logger.extend(ActiveSupport::Logger.broadcast(@cloudwatch_client))
rescue Aws::Errors::MissingRegionError, Aws::Sigv4::Errors::MissingCredentialsError => e
    Rails.logger.info "be_admin: AWS credentials not found for CloudWatchLog...!!!"
end

生产.rb

require "active_support/core_ext/integer/time"

Rails.application.configure do
  config.cache_classes = true

  config.eager_load = true

  config.consider_all_requests_local       = false
  config.action_controller.perform_caching = true

  config.public_file_server.enabled = true

  config.assets.compile = false

  config.flipper.preload = false

  config.active_storage.service = :local

  config.action_mailer.perform_caching = false

  config.active_support.report_deprecations = true

  logger           = ActiveSupport::Logger.new($stdout)
  logger.formatter = config.log_formatter
  config.logger = ActiveSupport::TaggedLogging.new(logger)

  # Set log level from LOG_LEVEL
  default_log_level = Rails.env.development? ? :debug : :info
  config_log_level  = ENV.fetch("LOG_LEVEL", default_log_level).to_s.downcase.to_sym
  config.log_level = if %i[debug info warn error fatal].include?(config_log_level)
                       config_log_level
                     else
                       default_log_level
                     end

  config.lograge.enabled = !Rails.env.development?

  config.lograge.formatter = Lograge::Formatters::Raw.new

  config.logger = Logger.new($stdout).tap do |logger|
    logger.formatter = config.log_formatter
    config.logger    = ActiveSupport::TaggedLogging.new(logger)
  end

  config.active_record.dump_schema_after_migration = false
end

更新1

如果我添加此行,它会创建一个日志流,但动态日志仍然不会出现

@cloudwatch_client.put_log_events({log_group_name: @log_group_name, log_stream_name: @log_stream_name, log_events: [{timestamp: Time.now.to_i * 1000, message: "logger initialted"}]})
ruby-on-rails ruby amazon-web-services aws-sdk amazon-cloudwatch
1个回答
0
投票

致所有努力将 aws cloudwatch 与 Rails 应用程序集成的人。解决办法在这里

宝石文件

gem 'aws-sdk'

在 lib cloudwatch_logger.rb 中创建一个文件。我们正在尝试使用云监视记录器覆盖 Logger 类,以便发送动态日志

require 'aws-sdk-cloudwatchlogs'
class CloudwatchLogger < Logger
  def initialize(log_group_name, log_stream_name)
    super(STDOUT)
    @log_group_name = log_group_name
    @log_stream_name = log_stream_name
    @cloudwatch_logs = Aws::CloudWatchLogs::Client.new
    create_log_stream_if_not_exists
  end

  def add(severity, message = nil, progname = nil, &block)
    severity ||= UNKNOWN
    message ||= (block && block.call) || progname
    return true if severity < level

    message = format_message(severity, Time.now, progname, message)
    super(severity, message)

    @cloudwatch_logs.put_log_events(
      log_group_name: @log_group_name,
      log_stream_name: @log_stream_name,
      log_events: [
        {
          timestamp: Time.now.to_i * 1000,
          message: message
        }
      ]
    )
    true
  end

  def format_message(severity, timestamp, progname, message)
    "#{timestamp} #{severity} -- #{progname}: #{message}\n"
  end

  def create_log_stream_if_not_exists
    begin
      @cloudwatch_logs.create_log_stream(
        log_group_name: @log_group_name,
        log_stream_name: @log_stream_name
      )
    rescue Aws::CloudWatchLogs::Errors::ResourceNotFoundException => e
      puts "Error creating log stream: #{e.message}"
    end
  end
end

最后,从初始化程序文件夹中调用该类。另外,将 CloudwatchLogger.new 绑定到 try catch 中,就像使用 docker 一样,这样它将无法在 docker 构建时找到区域 cloudwatch_logger.rb

      require 'cloudwatch_logger'

      log_group_name =  'enter_your_log_group_name'
      log_stream_name = "#{Time.now.strftime('%Y-%m-%d')}/$[LATEST]/#{Time.now.to_i}"
      begin
        Rails.logger = CloudwatchLogger.new(log_group_name, log_stream_name)
      rescue Aws::Errors::MissingRegionError => e
        puts "Error fetching at region: #{e.message}"
      end
© www.soinside.com 2019 - 2024. All rights reserved.