Class: AWS::S3::Logging::Log::Line
- Inherits:
-
String
- Object
- String
- AWS::S3::Logging::Log::Line
- Defined in:
- lib/aws/s3/logging.rb
Overview
Each line of a log exposes the raw line, but it also has method accessors for all the fields of the logged request.
The list of supported log line fields are listed in the S3 documentation: docs.amazonwebservices.com/AmazonS3/2006-03-01/LogFormat.html
line = log.lines.first
line.remote_ip
# => '72.21.206.5'
If a certain field does not apply to a given request (for example, the key
field does not apply to a bucket request), or if it was unknown or unavailable, it will return nil
.
line.operation
# => 'REST.GET.BUCKET'
line.key
# => nil
Constant Summary collapse
- DATE =
/\[([^\]]+)\]/
- QUOTED_STRING =
/"([^"]+)"/
- REST =
/(\S+)/
- LINE_SCANNER =
/#{DATE}|#{QUOTED_STRING}|#{REST}/
- @@decorators =
Hash.new {|hash, key| hash[key] = lambda {|entry| CoercibleString.coerce(entry)}}
- @@fields =
[]
Class Method Summary collapse
-
.field(name, offset, type = nil, &block) ⇒ Object
:nodoc:.
-
.typecast_time(datetime) ⇒ Object
Time.parse doesn’t like %d/%B/%Y:%H:%M:%S %z so we have to transform it unfortunately.
Instance Method Summary collapse
-
#attributes ⇒ Object
Returns all fields of the line in a hash of the form
:field_name => :field_value
. -
#initialize(line) ⇒ Line
constructor
:nodoc:.
Constructor Details
#initialize(line) ⇒ Line
:nodoc:
176 177 178 179 |
# File 'lib/aws/s3/logging.rb', line 176 def initialize(line) #:nodoc: super(line) @parts = parse end |
Class Method Details
.field(name, offset, type = nil, &block) ⇒ Object
:nodoc:
149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 |
# File 'lib/aws/s3/logging.rb', line 149 def field(name, offset, type = nil, &block) #:nodoc: decorators[name] = block if block_given? fields << name class_eval(<<-EVAL, __FILE__, __LINE__) def #{name} value = parts[#{offset} - 1] if value == '-' nil else self.class.decorators[:#{name}].call(value) end end memoized :#{name} EVAL end |
.typecast_time(datetime) ⇒ Object
Time.parse doesn’t like %d/%B/%Y:%H:%M:%S %z so we have to transform it unfortunately
166 167 168 169 170 171 172 173 |
# File 'lib/aws/s3/logging.rb', line 166 def typecast_time(datetime) #:nodoc: datetime.sub!(%r|^(\w{2})/(\w{3})/(\w{4})|, '\2 \1 \3') if Date.constants.include?('ABBR_MONTHS') datetime.sub!(month, Date::ABBR_MONTHS[month.downcase].to_s) end datetime.sub!(':', ' ') Time.parse(datetime) end |
Instance Method Details
#attributes ⇒ Object
Returns all fields of the line in a hash of the form :field_name => :field_value
.
line.attributes.values_at(:bucket, :key)
# => ['marcel', 'kiss.jpg']
203 204 205 206 207 208 |
# File 'lib/aws/s3/logging.rb', line 203 def attributes self.class.fields.inject({}) do |attribute_hash, field| attribute_hash[field] = send(field) attribute_hash end end |