sherlog-holmes 0.3.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: eb0d8afe20c542e87e2b4872e64cceeb72328c38
4
- data.tar.gz: 7ed080295dcba9f9f1b201667d324e18793d6b6b
3
+ metadata.gz: 7de344c1bb4ad99a2e4cb1369d9781196242f877
4
+ data.tar.gz: d71b629b448d315815dd00d9fcc27cdc56c3b30c
5
5
  SHA512:
6
- metadata.gz: b937b606eaf4bc1b6f1a00fbe9968caa735c64820cbf4046a812e02a606a06ef897c4a76cb64d019ce88862f25ede73a0c814afbb347bebc3a026d581e0724e3
7
- data.tar.gz: 88022af4cfb6e6f40633ac75d0be21c5ea16f36faf83656cebc2e7f0660613c635683400449c2b7259b229a9a98120ba064aa87d54cc934b686694b803f80bb3
6
+ metadata.gz: 5e8d2263e831c1f7cb06ae3101465e448594f8c5aa4e44651733a7dc73cefaae0edf35a8cefa89e8a05689f1215490f5c2bb06dde28405e62f775ef29f2f7df9
7
+ data.tar.gz: 02a4e999969b868d738056068b52fd67466fa8ed0560c95ce3c1fb0cb6f348fc2469fae1e8be5157eefcf3e7c75475b918de300b3a47ad5b6df1f091571caafe
data/README.md CHANGED
@@ -51,6 +51,23 @@ jboss:
51
51
 
52
52
  The configuration should contain a unique id and at least a pattern for the log **entry**. Place you configuration file in a `*.yml` file inside your `$HOME/.sherlog/patterns` directory and you're ready to go!
53
53
 
54
+ ### Custom Attributes
55
+
56
+ Sherlog allows you to define custom attributes by using named capture groups. Any capture group name that differs from the main fields will be stored as a custom attribute in the entry object.
57
+
58
+ ### Configuration Inheritance
59
+
60
+ You can create a base configuration and then override some values to create another one. In this case, you need to specify the parent configuration with the `from` key:
61
+
62
+ ```yaml
63
+ base.java:
64
+ exception: (?<exception>\w+(\.\w+)+(Exception|Error))
65
+ stacktrace: ^(\s+at)|(Caused by\:)|(\s+\.{3}\s\d+\smore)
66
+ jboss:
67
+ from: base.java
68
+ entry: (?<time>[0-9,.:]+)\s+(?<level>\w+)\s+\[(?<category>\S+)\]\s\((?<origin>[^)]+)\)?\s?(?<message>.+)
69
+ ```
70
+
54
71
  ## Usage
55
72
 
56
73
  Shelog Holmes provides the command line tool `sherlog`. You can use this to pass a log, the filters you need to apply and the process that needs to be executed (like showing the filtered entries or counting the exceptions):
@@ -97,6 +114,14 @@ This will filter entries using the exception field. You can use the wildcard `*`
97
114
 
98
115
  This will filter entries with exceptions, regardless the kind.
99
116
 
117
+ `-f NAME, --field NAME`
118
+
119
+ This will filter entries using custom attributes found in named capture groups. This parameter specifies the custom attribute name. Use it with `-v | --value` for defining the expression.
120
+
121
+ `-v EXPRESSION, --value EXPRESSION`
122
+
123
+ Specifies the expression to use with the last `-f | --field` parameter. The wildcard `*` is accepted here.
124
+
100
125
  ### Logical Options
101
126
 
102
127
  `--and`
@@ -153,7 +178,9 @@ $ sherlog --count levels,categories log-file.log
153
178
 
154
179
  Currently, Sherlog has the following patterns:
155
180
 
181
+ - `base.java`: base pattern for Java outputs (contains patterns for exceptions and stacktraces only)
156
182
  - `jboss`: matches Wildfly | EAP logs
183
+ - `jboss.fuse`: matches JBoss Fuse logs
157
184
 
158
185
  ## License
159
186
 
data/bin/sherlog CHANGED
@@ -58,7 +58,7 @@ def print_table(name, data)
58
58
  puts
59
59
  end
60
60
 
61
- @opts.banner = 'Usage: sherlog [options] <logfile>'
61
+ @opts.banner = 'Usage: sherlog [options] [logfile ...]'
62
62
 
63
63
  @opts.separator "\n Config Options\n".bold.white
64
64
 
@@ -100,6 +100,14 @@ end
100
100
  add_filter Filter::exceptions
101
101
  end
102
102
 
103
+ @opts.on '-f NAME', '--field NAME', 'Sets the custom attribute filter name' do |name|
104
+ @field = name
105
+ end
106
+
107
+ @opts.on '-v EXPRESSION', '--value EXPRESSION', 'Sets the custom attribute filter expression' do |expression|
108
+ add_filter Filter::custom_attribute(@field, expression)
109
+ end
110
+
103
111
  @opts.separator "\n Logical Options\n".bold.white
104
112
 
105
113
  @opts.on '--and', 'Sets the next filter to use the AND operator' do
@@ -147,7 +155,6 @@ end
147
155
 
148
156
  @listeners[:print].hide_stacktrace if @no_stacktrace and @listeners[:print]
149
157
 
150
- file = ARGV.first
151
158
  parser = Sherlog.parser @type if @type
152
159
  parser ||= Parser::new
153
160
  parser.filter @filter
@@ -155,12 +162,14 @@ parser.filter @filter
155
162
  parser.on_new_entry listener
156
163
  end
157
164
  begin
158
- if file
159
- parser.parse file
160
- else
165
+ if ARGV.empty?
161
166
  ARGF.each_line do |line|
162
167
  parser.parse line.chomp
163
168
  end
169
+ else
170
+ ARGV.each do |file|
171
+ parser.parse file
172
+ end
164
173
  end
165
174
  @groups.each do |group|
166
175
  print_table group, @listeners[:count].send(group).sort_by { |name, count| -count }
data/changelog.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # Changelog
2
2
 
3
+ ## v0.4.0
4
+
5
+ - Added support for multiple log files
6
+ - Added support for custom attributes using capture groups
7
+ - Added JBoss Fuse pattern
8
+ - Added support for inheritance of patterns
9
+
10
+ ## v0.3.3
11
+
12
+ - Apply filters before the entire entry was parsed
13
+
3
14
  ## v0.3.2
4
15
 
5
16
  - Recognize 'Fault' in JBoss exception pattern
@@ -0,0 +1,9 @@
1
+ base.java:
2
+ exception: (?<exception>\w+(\.\w+)+(Exception|Error|Fault))
3
+ stacktrace: ^(\s+at)|(Caused by\:)|(\s+\.{3}\s\d+\smore)
4
+ jboss:
5
+ from: base.java
6
+ entry: (?<time>(?<date>\d{2,4}-\d{2}-\d{2,4}\s)?(\d{2}:\d{2}:\d{2},\d{3}))\s+(?<level>\w+)\s+\[(?<category>\S+)\]\s\((?<origin>[^)]+)\)?\s?(?<message>.+)
7
+ jboss.fuse:
8
+ from: base.java
9
+ entry: (?<time>(?<date>\d{2,4}-\d{2}-\d{2,4}\s)?(\d{2}:\d{2}:\d{2},\d{3}))\s+\|\s*(?<level>\w+)\s*\|\s*(?<origin>[^|]+)\s*\|\s*(?<category>[^|]+)\s*\|\s*(?<bundle>(?<bundle_id>\d+) - (?<bundle_name>\S+) - (?<bundle_version>\S+))\s*\|\s*(?<message>.+)
@@ -38,11 +38,12 @@ module Sherlog
38
38
  def self.load_patterns(file)
39
39
  patterns = YAML::load_file file
40
40
  patterns.each do |id, config|
41
- PATTERNS[id.to_sym] = {
42
- entry: Regexp::new(config['entry']),
43
- exception: Regexp::new(config['exception']),
44
- stacktrace: Regexp::new(config['stacktrace'])
45
- }
41
+ pattern_config = {}
42
+ pattern_config[:entry] = Regexp::new(config['entry']) if config['entry']
43
+ pattern_config[:exception] = Regexp::new(config['exception']) if config['exception']
44
+ pattern_config[:stacktrace] = Regexp::new(config['stacktrace']) if config['stacktrace']
45
+ pattern_config = PATTERNS[config['from'].to_sym].merge pattern_config if config['from']
46
+ PATTERNS[id.to_sym] = pattern_config
46
47
  end
47
48
  end
48
49
 
@@ -26,15 +26,18 @@ module Sherlog
26
26
  attr_accessor :time, :level, :category, :origin, :message, :exceptions, :stacktrace, :raw_content
27
27
 
28
28
  def initialize(params = {})
29
- @time = params[:time]
30
- @level = params[:level]
31
- @category = params[:category]
32
- @origin = params[:origin]
33
- @message = params[:message]
34
- @exceptions = [params[:exception]] if params[:exception]
35
- @exceptions ||= params[:exceptions]
29
+ params = params.dup
30
+ @time = params.delete :time if params[:time]
31
+ @level = params.delete :level if params[:level]
32
+ @category = params.delete :category if params[:category]
33
+ @origin = params.delete :origin if params[:origin]
34
+ @message = params.delete :message if params[:message]
35
+ @raw_content = params.delete :raw_content if params[:raw_content]
36
+ @exceptions = [params.delete(:exception)] if params[:exception]
37
+ @exceptions ||= params.delete(:exceptions) if params[:exceptions]
36
38
  @exceptions ||= []
37
39
  @stacktrace = []
40
+ @custom_attributes = params
38
41
  end
39
42
 
40
43
  def exception?
@@ -49,6 +52,10 @@ module Sherlog
49
52
  @message << $/ << line
50
53
  end
51
54
 
55
+ def [](custom_attribute)
56
+ @custom_attributes[custom_attribute.to_s] or @custom_attributes[custom_attribute.to_sym]
57
+ end
58
+
52
59
  def to_s
53
60
  format = []
54
61
  params = []
@@ -57,6 +57,7 @@ module Sherlog
57
57
  end
58
58
 
59
59
  def self.expression(expression)
60
+ expression = expression.to_s
60
61
  Filter::new do |object|
61
62
  wildcard_at_start = expression.start_with? '*'
62
63
  wildcard_at_end = expression.end_with? '*'
@@ -110,6 +111,12 @@ module Sherlog
110
111
  end
111
112
  end
112
113
 
114
+ def self.custom_attribute(attribute_name, expression)
115
+ Filter::new do |entry|
116
+ expression(expression).accept? entry[attribute_name]
117
+ end
118
+ end
119
+
113
120
  end
114
121
 
115
122
  end
@@ -60,12 +60,12 @@ module Sherlog
60
60
  foreach input do |line|
61
61
  try_guess_pattern line unless @patterns[:entry]
62
62
  if @patterns[:entry] =~ line
63
- entry_data = Hash[Regexp.last_match.names.map { |k| [k.to_sym, Regexp.last_match[k]] }]
64
- notify entry
63
+ entry_data = Hash[Regexp.last_match.names.map { |k| [k.to_sym, Regexp.last_match[k].to_s.strip] }]
64
+ # notify the last entry parsed
65
+ notify entry if entry and @filter.accept? entry
65
66
  entry = Entry::new entry_data
66
67
  entry.raw_content = line.chomp
67
68
  entry.exceptions << Regexp.last_match[:exception] if @patterns[:exception] =~ entry.message
68
- entry = nil unless @filter.accept? entry
69
69
  else
70
70
  if entry
71
71
  if entry.exception? and @patterns[:stacktrace] =~ line
@@ -78,7 +78,8 @@ module Sherlog
78
78
  end
79
79
  end
80
80
  end
81
- notify entry
81
+ # notify the last entry parsed
82
+ notify entry if entry and @filter.accept? entry
82
83
  end
83
84
 
84
85
  private
@@ -100,10 +101,9 @@ module Sherlog
100
101
 
101
102
  def try_guess_pattern(line)
102
103
  key, patterns = Sherlog.loaded_patterns.find do |key, patterns|
103
- patterns[:entry].match line
104
+ patterns[:entry].match line if patterns[:entry]
104
105
  end
105
- patterns ||= {entry: /(?<message>.+)/}
106
- @patterns.merge! patterns
106
+ @patterns.merge! patterns if patterns
107
107
  end
108
108
 
109
109
  end
@@ -21,5 +21,5 @@
21
21
  # THE SOFTWARE.
22
22
 
23
23
  module Sherlog
24
- VERSION = '0.3.2'
24
+ VERSION = '0.4.0'
25
25
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sherlog-holmes
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ataxexe
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-17 00:00:00.000000000 Z
11
+ date: 2015-12-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: yummi
@@ -93,7 +93,7 @@ files:
93
93
  - Rakefile
94
94
  - bin/sherlog
95
95
  - changelog.md
96
- - conf/patterns/jboss.yml
96
+ - conf/patterns/java.yml
97
97
  - lib/sherlog_holmes.rb
98
98
  - lib/sherlog_holmes/entry.rb
99
99
  - lib/sherlog_holmes/filter.rb
@@ -1,4 +0,0 @@
1
- jboss:
2
- entry: (?<time>(\d{2}-\d{2}-\d{4}\s)?(\d{2}:\d{2}:\d{2},\d{3}))\s+(?<level>\w+)\s+\[(?<category>\S+)\]\s\((?<origin>[^)]+)\)?\s?(?<message>.+)
3
- exception: (?<exception>\w+(\.\w+)+(Exception|Error|Fault))
4
- stacktrace: ^(\s+at)|(Caused by\:)|(\s+\.{3}\s\d+\smore)