Module: RequestLogAnalyzer::FileFormat
- Defined in:
- lib/request_log_analyzer/file_format.rb,
lib/request_log_analyzer/file_format/w3c.rb,
lib/request_log_analyzer/file_format/merb.rb,
lib/request_log_analyzer/file_format/rack.rb,
lib/request_log_analyzer/file_format/mysql.rb,
lib/request_log_analyzer/file_format/rails.rb,
lib/request_log_analyzer/file_format/nginx.rb,
lib/request_log_analyzer/file_format/rails3.rb,
lib/request_log_analyzer/file_format/apache.rb,
lib/request_log_analyzer/file_format/haproxy.rb,
lib/request_log_analyzer/file_format/amazon_s3.rb,
lib/request_log_analyzer/file_format/postgresql.rb,
lib/request_log_analyzer/file_format/delayed_job.rb,
lib/request_log_analyzer/file_format/delayed_job2.rb,
lib/request_log_analyzer/file_format/delayed_job3.rb,
lib/request_log_analyzer/file_format/delayed_job21.rb,
lib/request_log_analyzer/file_format/rails_development.rb
Defined Under Namespace
Modules: CommonRegularExpressions Classes: AmazonS3, Apache, Base, DelayedJob, DelayedJob2, DelayedJob21, DelayedJob3, Haproxy, Merb, Mysql, Nginx, Oink, Postgresql, Rack, Rails, Rails3, RailsDevelopment, W3c
Class Method Summary (collapse)
-
+ (Object) all_formats
Returns an array of all FileFormat instances that are shipped with request-log-analyzer by default.
-
+ (Object) autodetect(file, line_count = 50)
Autodetects the filetype of a given file.
-
+ (Object) autodetect_score(parser)
Calculates a file format auto detection score based on the parser statistics.
-
+ (Object) load(file_format, *args)
Loads a FileFormat::Base subclass instance.
Class Method Details
+ (Object) all_formats
Returns an array of all FileFormat instances that are shipped with request-log-analyzer by default.
65 66 67 68 69 |
# File 'lib/request_log_analyzer/file_format.rb', line 65 def self.all_formats @all_formats ||= Dir[File.('file_format/*.rb', File.dirname(__FILE__))].map do |file| self.load(File.basename(file, '.rb')) end end |
+ (Object) autodetect(file, line_count = 50)
Autodetects the filetype of a given file.
Returns a FileFormat instance, by parsing the first couple of lines of the provided file with avery known file format and return the most promosing file format based on the parser statistics. The autodetect_score method is used to score the fitness of a format.
file |
The file to detect the file format for. |
line_count |
The number of lines to take into consideration |
79 80 81 82 83 84 85 86 87 88 89 90 |
# File 'lib/request_log_analyzer/file_format.rb', line 79 def self.autodetect(file, line_count = 50) parsers = all_formats.map { |f| RequestLogAnalyzer::Source::LogParser.new(f, :parse_strategy => 'cautious') } File.open(file, 'rb') do |io| while io.lineno < line_count && (line = io.gets) parsers.each { |parser| parser.parse_line(line) } end end parsers.select { |p| autodetect_score(p) > 0 }.max { |a, b| autodetect_score(a) <=> autodetect_score(b) }.file_format rescue nil end |
+ (Object) autodetect_score(parser)
Calculates a file format auto detection score based on the parser statistics.
This method returns a score as an integer. Usually, the score will increase as more lines are parsed. Usually, a file_format with a score of zero or lower should not be considered.
parser |
The parsed that was use to parse the initial lines of the log file. |
99 100 101 102 103 104 105 106 107 108 109 110 |
# File 'lib/request_log_analyzer/file_format.rb', line 99 def self.autodetect_score(parser) score = 0 score -= parser.file_format.line_definitions.length score -= parser.warnings * 3 score += parser.parsed_lines * 1 score += parser.parsed_requests * 10 # As Apache matches several simular formats, subtracting 1 will make a specific matcher have a higher score score -= 1 if parser.file_format.class == RequestLogAnalyzer::FileFormat::Apache score end |
+ (Object) load(file_format, *args)
Loads a FileFormat::Base subclass instance. You can provide:
-
A FileFormat instance (which will return itself)
-
A FileFormat class (of which an imstance will be returned)
-
A filename (from which the FileFormat class is loaded)
-
A symbol of a built-in file format (e.g. :rails)
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/request_log_analyzer/file_format.rb', line 29 def self.load(file_format, *args) klass = nil if file_format.kind_of?(RequestLogAnalyzer::FileFormat::Base) # this already is a file format! return itself return @current_file_format = file_format elsif file_format.kind_of?(Class) && file_format.ancestors.include?(RequestLogAnalyzer::FileFormat::Base) # a usable class is provided. Use this format class. klass = file_format elsif file_format.kind_of?(String) && File.exist?(file_format) && File.file?(file_format) # load a format from a ruby file require File.(file_format) const = RequestLogAnalyzer.to_camelcase(File.basename(file_format, '.rb')) if RequestLogAnalyzer::FileFormat.const_defined?(const) klass = RequestLogAnalyzer::FileFormat.const_get(const) elsif Object.const_defined?(const) klass = Object.const_get(const) else raise "Cannot load class #{const} from #{file_format}!" end else # load a provided file format klass = RequestLogAnalyzer::FileFormat.const_get(RequestLogAnalyzer.to_camelcase(file_format)) end # check the returned klass to see if it can be used raise "Could not load a file format from #{file_format.inspect}" if klass.nil? raise "Invalid FileFormat class from #{file_format.inspect}" unless klass.kind_of?(Class) && klass.ancestors.include?(RequestLogAnalyzer::FileFormat::Base) @current_file_format = klass.create(*args) # return an instance of the class end |