logster 2.5.0 → 2.5.1

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
  SHA256:
3
- metadata.gz: 320e0b49302b25ebcaa67631295be41ddc7f0a14aa0dc7436ef1eefa5b662c77
4
- data.tar.gz: 85c9ab97bebdbf09bbff49c4a93d8824ffe20968c1f3a4efe975f12072fdeb54
3
+ metadata.gz: 0fe7e01b692cb4454d249da6f9c9c1c03d5c765056e6ae6ee1a5571ddb38691c
4
+ data.tar.gz: 13ac426322e9993fb067144cf6a95fa3950602cd0d8e41c3521d8115751207e6
5
5
  SHA512:
6
- metadata.gz: 0e99100761c77ee1191498ef11d2b8903b6ed23de85ba39bcd690e237ccb7b1e7e6c9fa5b27050bfe4870cb5caf0549c27cdc9903c2addb4afc75516384f46d2
7
- data.tar.gz: 6b29eab99fc93e87a8a577fdb6eccff52308dcdf571a407ac42a6c458ae3b1175b48dbf94f7c48a93de8d614c584bfb1c5c3442675a7a66724aa3e913c404d8b
6
+ metadata.gz: c695dfd4d37c625fa8a51026f26cc5d1120aa370eba416828cac9bca3ea03e9412fbb8475af4b30684383ec7713f251a096e88ed9dbdfb830e80863dbef692cf
7
+ data.tar.gz: 3aa441c84018af760b9b2a7ca607a123cd27fd636cc6e29b4e8855518437f5c46417cc9513a51cd3d97dd213cfaf2c9ccbd7613931b5b80a03a60c3389b1e238
@@ -1,5 +1,13 @@
1
1
  # CHANGELOG
2
2
 
3
+ - 2019-12-13: 2.5.1
4
+
5
+ - DEV: Bump puma from 4.2.1 to 4.3.1 in /website (#100)
6
+ - FIX: Don't include messages that were removed from groups due to max size limit
7
+ - FIX: loadingEnv is an attribute of model
8
+ - FIX: Prevent crashing when reporting a non-string message to Logster
9
+ - UX: Group count attribute should be a long-running number of errors, not just the number of errors the group currently contains
10
+
3
11
  - 2019-12-12: 2.5.0
4
12
 
5
13
  - DEV: Update to latest version of gems
@@ -57,7 +57,7 @@ this.model.selectRow(e,t)},tabChangedAction:function(e){this.model.tabChanged(e)
57
57
  confirm("Clear the logs?\n\nCancel = No, OK = Clear")&&(0,t.ajax)("/clear",{type:"POST"}).then(function(){e.model.reload()})},removeMessage:function(e){var t=this.model.currentRow.group?this.model.currentRow:null,n=this.model.rows,a=t?n.indexOf(t):n.indexOf(e)
58
58
  e.destroy(),e.set("selected",!1),this.model.set("total",this.model.total-1)
59
59
  var s=!1,i=0
60
- t?(i=t.messages.indexOf(e),t.messages.removeObject(e),i=Math.min(i,t.messages.length-1),t.decrementProperty("count"),0===t.messages.length&&(n.removeObject(t),s=!0)):(n.removeObject(e),s=!0),s?a>0?this.model.selectRow(n[a-1]):this.model.total>0?this.model.selectRow(n[0]):this.model.reload():t&&this.model.selectRow(n[a],{messageIndex:i})},solveMessage:function(e){this.model.solve(e)},groupedMessageChangedAction:function(e){this.model.groupedMessageChanged(e)},envChangedAction:function(e){this.model.envChanged(e)},updateFilter:function(e){var t=this
60
+ t?(i=t.messages.indexOf(e),t.messages.removeObject(e),i=Math.min(i,t.messages.length-1),0===t.messages.length&&(n.removeObject(t),s=!0)):(n.removeObject(e),s=!0),s?a>0?this.model.selectRow(n[a-1]):this.model.total>0?this.model.selectRow(n[0]):this.model.reload():t&&this.model.selectRow(n[a],{messageIndex:i})},solveMessage:function(e){this.model.solve(e)},groupedMessageChangedAction:function(e){this.model.groupedMessageChanged(e)},envChangedAction:function(e){this.model.envChanged(e)},updateFilter:function(e){var t=this
61
61
  this.toggleProperty(e)
62
62
  var n=[];["Debug","Info","Warn","Err","Fatal"].forEach(function(e,a){t.get("show".concat(e))&&n.push(a)}),n.push(5),this.model.set("filter",n),this.model.reload().then(function(){return t.model.updateSelectedRow()})},updateSearch:function(e){e&&1===e.length||Ember.run.debounce(this,this.doSearch,e,250)}},doSearch:function(e){var t=this
63
63
  this.model.set("search",e),this.model.reload().then(function(){return t.model.updateSelectedRow()})}})
@@ -207,10 +207,10 @@ var t=Ember.HTMLBars.template({id:"zCP0V00P",block:'{"symbols":["tab","&default"
207
207
  e.default=t}),define("client-app/templates/components/time-formatter",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
208
208
  var t=Ember.HTMLBars.template({id:"sp53cTcH",block:'{"symbols":[],"statements":[[1,[21,"time"],false],[0,"\\n"]],"hasEval":false}',meta:{moduleName:"client-app/templates/components/time-formatter.hbs"}})
209
209
  e.default=t}),define("client-app/templates/index",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
210
- var t=Ember.HTMLBars.template({id:"ORfs9ULA",block:'{"symbols":["row"],"statements":[[7,"div"],[11,"id","top-panel"],[9],[0,"\\n "],[7,"div"],[11,"id","log-table"],[9],[0,"\\n"],[4,"if",[[23,["model","moreBefore"]]],null,{"statements":[[0," "],[7,"div"],[11,"class","show-more"],[9],[0,"\\n"],[4,"if",[[23,["model","hideCountInLoadMore"]]],null,{"statements":[[0," Load more\\n"]],"parameters":[]},{"statements":[[0," Select to see "],[1,[23,["model","totalBefore"]],false],[0," more\\n"]],"parameters":[]}],[0," "],[3,"action",[[22,0,[]],"showMoreBefore"]],[10],[0,"\\n"]],"parameters":[]},null],[4,"each",[[23,["model","rows"]]],null,{"statements":[[0," "],[1,[27,"message-row",null,[["model","selectRow"],[[22,1,[]],[27,"action",[[22,0,[]],"selectRowAction",[22,1,[]]],null]]]],false],[0,"\\n"]],"parameters":[1]},null],[0," "],[10],[0,"\\n"],[10],[0,"\\n"],[7,"div"],[11,"id","bottom-panel"],[12,"class",[28,[[27,"if",[[23,["model","currentRow","group"]],"group-view"],null]]]],[9],[0,"\\n"],[4,"if",[[23,["model","currentRow","group"]]],null,{"statements":[[0," "],[1,[27,"page-nav",null,[["list","position","extraClasses","navigate"],[[23,["model","currentRow","messages"]],[23,["model","currentGroupedMessagesPosition"]],"group-nav",[27,"action",[[22,0,[]],"groupedMessageChangedAction"],null]]]],false],[0,"\\n"]],"parameters":[]},null],[0," "],[1,[27,"message-info",null,[["currentMessage","loadingEnv","removeMessage","solveMessage","onTabChange","envChangedAction","currentEnvPosition","actionsInMenu"],[[23,["model","currentMessage"]],[23,["loadingEnv"]],[27,"action",[[22,0,[]],"removeMessage"],null],[27,"action",[[22,0,[]],"solveMessage"],null],[27,"action",[[22,0,[]],"tabChangedAction"],null],[27,"action",[[22,0,[]],"envChangedAction"],null],[23,["model","currentEnvPosition"]],[23,["actionsInMenu"]]]]],false],[0,"\\n\\n "],[7,"div"],[11,"class","action-panel"],[9],[0,"\\n "],[7,"div"],[11,"class","severity-filters"],[9],[0,"\\n "],[7,"div"],[11,"class","more-wrapping"],[9],[0,"\\n "],[7,"label"],[11,"class","debug"],[9],[0,"\\n "],[7,"input"],[12,"checked",[21,"showDebug"]],[12,"onchange",[27,"action",[[22,0,[]],[27,"action",[[22,0,[]],"updateFilter","showDebug"],null]],null]],[11,"type","checkbox"],[9],[10],[0,"\\n "],[7,"span"],[9],[0,"Debug"],[10],[0,"\\n "],[10],[0,"\\n "],[7,"label"],[11,"class","info"],[9],[0,"\\n "],[7,"input"],[12,"checked",[21,"showInfo"]],[12,"onchange",[27,"action",[[22,0,[]],[27,"action",[[22,0,[]],"updateFilter","showInfo"],null]],null]],[11,"type","checkbox"],[9],[10],[0,"\\n "],[7,"span"],[9],[0,"Info"],[10],[0,"\\n "],[10],[0,"\\n "],[7,"label"],[11,"class","warn"],[9],[0,"\\n "],[7,"input"],[12,"checked",[21,"showWarn"]],[12,"onchange",[27,"action",[[22,0,[]],[27,"action",[[22,0,[]],"updateFilter","showWarn"],null]],null]],[11,"type","checkbox"],[9],[10],[0,"\\n "],[7,"i"],[11,"class","fa fa-exclamation-circle warning"],[9],[10],[0,"\\n "],[7,"span"],[9],[0,"Warning"],[10],[0,"\\n "],[10],[0,"\\n "],[7,"label"],[11,"class","error"],[9],[0,"\\n "],[7,"input"],[12,"checked",[21,"showErr"]],[12,"onchange",[27,"action",[[22,0,[]],[27,"action",[[22,0,[]],"updateFilter","showErr"],null]],null]],[11,"type","checkbox"],[9],[10],[0,"\\n "],[7,"i"],[11,"class","fa fa-times-circle error"],[9],[10],[0,"\\n "],[7,"span"],[9],[0,"Error"],[10],[0,"\\n "],[10],[0,"\\n "],[7,"label"],[11,"class","fatal"],[9],[0,"\\n "],[7,"input"],[12,"checked",[21,"showFatal"]],[12,"onchange",[27,"action",[[22,0,[]],[27,"action",[[22,0,[]],"updateFilter","showFatal"],null]],null]],[11,"type","checkbox"],[9],[10],[0,"\\n "],[7,"i"],[11,"class","fa fa-times-circle fatal"],[9],[10],[0,"\\n "],[7,"span"],[9],[0,"Fatal"],[10],[0,"\\n "],[10],[0,"\\n "],[10],[0,"\\n "],[10],[0,"\\n "],[7,"div"],[11,"class","search-clear-all"],[9],[0,"\\n "],[7,"input"],[11,"class","search"],[11,"placeholder","Search"],[12,"onkeyup",[27,"action",[[22,0,[]],"updateSearch"],[["value"],["target.value"]]]],[11,"type","text"],[9],[10],[0,"\\n "],[7,"div"],[11,"class","footer-btns"],[9],[0,"\\n"],[4,"if",[[23,["showSettings"]]],null,{"statements":[[4,"link-to",["settings"],[["class"],["settings btn no-text"]],{"statements":[[0," "],[7,"i"],[11,"class","fa fa-cog"],[9],[10],[0,"\\n"]],"parameters":[]},null]],"parameters":[]},null],[0," "],[7,"button"],[11,"class","clear btn danger"],[9],[7,"i"],[11,"class","fa fa-trash-o"],[9],[10],[7,"span"],[9],[0,"Clear logs"],[10],[3,"action",[[22,0,[]],"clear"]],[10],[0,"\\n "],[10],[0,"\\n "],[10],[0,"\\n "],[10],[0,"\\n"],[10],[0,"\\n"],[1,[21,"panel-resizer"],false],[0,"\\n"]],"hasEval":false}',meta:{moduleName:"client-app/templates/index.hbs"}})
210
+ var t=Ember.HTMLBars.template({id:"ZfZsvZU6",block:'{"symbols":["row"],"statements":[[7,"div"],[11,"id","top-panel"],[9],[0,"\\n "],[7,"div"],[11,"id","log-table"],[9],[0,"\\n"],[4,"if",[[23,["model","moreBefore"]]],null,{"statements":[[0," "],[7,"div"],[11,"class","show-more"],[9],[0,"\\n"],[4,"if",[[23,["model","hideCountInLoadMore"]]],null,{"statements":[[0," Load more\\n"]],"parameters":[]},{"statements":[[0," Select to see "],[1,[23,["model","totalBefore"]],false],[0," more\\n"]],"parameters":[]}],[0," "],[3,"action",[[22,0,[]],"showMoreBefore"]],[10],[0,"\\n"]],"parameters":[]},null],[4,"each",[[23,["model","rows"]]],null,{"statements":[[0," "],[1,[27,"message-row",null,[["model","selectRow"],[[22,1,[]],[27,"action",[[22,0,[]],"selectRowAction",[22,1,[]]],null]]]],false],[0,"\\n"]],"parameters":[1]},null],[0," "],[10],[0,"\\n"],[10],[0,"\\n"],[7,"div"],[11,"id","bottom-panel"],[12,"class",[28,[[27,"if",[[23,["model","currentRow","group"]],"group-view"],null]]]],[9],[0,"\\n"],[4,"if",[[23,["model","currentRow","group"]]],null,{"statements":[[0," "],[1,[27,"page-nav",null,[["list","position","extraClasses","navigate"],[[23,["model","currentRow","messages"]],[23,["model","currentGroupedMessagesPosition"]],"group-nav",[27,"action",[[22,0,[]],"groupedMessageChangedAction"],null]]]],false],[0,"\\n"]],"parameters":[]},null],[0," "],[1,[27,"message-info",null,[["currentMessage","loadingEnv","removeMessage","solveMessage","onTabChange","envChangedAction","currentEnvPosition","actionsInMenu"],[[23,["model","currentMessage"]],[23,["model","loadingEnv"]],[27,"action",[[22,0,[]],"removeMessage"],null],[27,"action",[[22,0,[]],"solveMessage"],null],[27,"action",[[22,0,[]],"tabChangedAction"],null],[27,"action",[[22,0,[]],"envChangedAction"],null],[23,["model","currentEnvPosition"]],[23,["actionsInMenu"]]]]],false],[0,"\\n\\n "],[7,"div"],[11,"class","action-panel"],[9],[0,"\\n "],[7,"div"],[11,"class","severity-filters"],[9],[0,"\\n "],[7,"div"],[11,"class","more-wrapping"],[9],[0,"\\n "],[7,"label"],[11,"class","debug"],[9],[0,"\\n "],[7,"input"],[12,"checked",[21,"showDebug"]],[12,"onchange",[27,"action",[[22,0,[]],[27,"action",[[22,0,[]],"updateFilter","showDebug"],null]],null]],[11,"type","checkbox"],[9],[10],[0,"\\n "],[7,"span"],[9],[0,"Debug"],[10],[0,"\\n "],[10],[0,"\\n "],[7,"label"],[11,"class","info"],[9],[0,"\\n "],[7,"input"],[12,"checked",[21,"showInfo"]],[12,"onchange",[27,"action",[[22,0,[]],[27,"action",[[22,0,[]],"updateFilter","showInfo"],null]],null]],[11,"type","checkbox"],[9],[10],[0,"\\n "],[7,"span"],[9],[0,"Info"],[10],[0,"\\n "],[10],[0,"\\n "],[7,"label"],[11,"class","warn"],[9],[0,"\\n "],[7,"input"],[12,"checked",[21,"showWarn"]],[12,"onchange",[27,"action",[[22,0,[]],[27,"action",[[22,0,[]],"updateFilter","showWarn"],null]],null]],[11,"type","checkbox"],[9],[10],[0,"\\n "],[7,"i"],[11,"class","fa fa-exclamation-circle warning"],[9],[10],[0,"\\n "],[7,"span"],[9],[0,"Warning"],[10],[0,"\\n "],[10],[0,"\\n "],[7,"label"],[11,"class","error"],[9],[0,"\\n "],[7,"input"],[12,"checked",[21,"showErr"]],[12,"onchange",[27,"action",[[22,0,[]],[27,"action",[[22,0,[]],"updateFilter","showErr"],null]],null]],[11,"type","checkbox"],[9],[10],[0,"\\n "],[7,"i"],[11,"class","fa fa-times-circle error"],[9],[10],[0,"\\n "],[7,"span"],[9],[0,"Error"],[10],[0,"\\n "],[10],[0,"\\n "],[7,"label"],[11,"class","fatal"],[9],[0,"\\n "],[7,"input"],[12,"checked",[21,"showFatal"]],[12,"onchange",[27,"action",[[22,0,[]],[27,"action",[[22,0,[]],"updateFilter","showFatal"],null]],null]],[11,"type","checkbox"],[9],[10],[0,"\\n "],[7,"i"],[11,"class","fa fa-times-circle fatal"],[9],[10],[0,"\\n "],[7,"span"],[9],[0,"Fatal"],[10],[0,"\\n "],[10],[0,"\\n "],[10],[0,"\\n "],[10],[0,"\\n "],[7,"div"],[11,"class","search-clear-all"],[9],[0,"\\n "],[7,"input"],[11,"class","search"],[11,"placeholder","Search"],[12,"onkeyup",[27,"action",[[22,0,[]],"updateSearch"],[["value"],["target.value"]]]],[11,"type","text"],[9],[10],[0,"\\n "],[7,"div"],[11,"class","footer-btns"],[9],[0,"\\n"],[4,"if",[[23,["showSettings"]]],null,{"statements":[[4,"link-to",["settings"],[["class"],["settings btn no-text"]],{"statements":[[0," "],[7,"i"],[11,"class","fa fa-cog"],[9],[10],[0,"\\n"]],"parameters":[]},null]],"parameters":[]},null],[0," "],[7,"button"],[11,"class","clear btn danger"],[9],[7,"i"],[11,"class","fa fa-trash-o"],[9],[10],[7,"span"],[9],[0,"Clear logs"],[10],[3,"action",[[22,0,[]],"clear"]],[10],[0,"\\n "],[10],[0,"\\n "],[10],[0,"\\n "],[10],[0,"\\n"],[10],[0,"\\n"],[1,[21,"panel-resizer"],false],[0,"\\n"]],"hasEval":false}',meta:{moduleName:"client-app/templates/index.hbs"}})
211
211
  e.default=t}),define("client-app/templates/settings",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
212
212
  var t=Ember.HTMLBars.template({id:"VCEsnuWV",block:'{"symbols":[],"statements":[[7,"div"],[11,"class","settings-page"],[9],[0,"\\n "],[4,"link-to",["index"],null,{"statements":[[0,"Home"]],"parameters":[]},null],[0,"\\n "],[7,"div"],[11,"class","settings-header"],[9],[0,"\\n "],[7,"h1"],[11,"class","header-title"],[9],[0,"Settings"],[10],[0,"\\n "],[7,"img"],[11,"class","header-logo"],[12,"src",[27,"logster-url",["images/icon_144x144.png"],null]],[9],[10],[0,"\\n "],[10],[0,"\\n\\n "],[7,"div"],[11,"class","settings-section suppression-patterns"],[9],[0,"\\n "],[7,"h2"],[11,"class","section-title"],[9],[0,"Suppression Patterns"],[10],[0,"\\n "],[7,"div"],[9],[0,"New messages that match these Regular Expression patterns will be suppressed. Checking Apply retroactively will remove all existing messages that match the patterns."],[10],[0,"\\n\\n"],[4,"if",[[23,["showCodedSuppression"]]],null,{"statements":[[0," "],[7,"h3"],[11,"class","subsection-title"],[9],[0,"Hard-coded patterns:"],[10],[0,"\\n "],[7,"div"],[11,"class","tip"],[9],[0,"These patterns can\'t be removed via the UI because they are commited to the source code of your app."],[10],[0,"\\n "],[1,[27,"patterns-list",null,[["patterns","mutable"],[[23,["codedSuppression"]],false]]],false],[0,"\\n"]],"parameters":[]},null],[0,"\\n "],[7,"h3"],[11,"class","subsection-title"],[9],[0,"Custom patterns:"],[10],[0,"\\n "],[1,[27,"patterns-list",null,[["patterns","key","applyRetroactivelyCheckbox","mutable"],[[23,["customSuppression"]],"suppression",true,true]]],false],[0,"\\n "],[10],[0,"\\n "],[7,"div"],[11,"class","settings-section grouping-patterns"],[9],[0,"\\n "],[7,"h2"],[11,"class","section-title"],[9],[0,"Grouping Patterns"],[10],[0,"\\n "],[7,"div"],[9],[0,"Add a Regular Expression pattern to group all new and existing messages into a single row when viewing the logs."],[10],[0,"\\n\\n "],[1,[27,"patterns-list",null,[["patterns","key","mutable"],[[23,["grouping"]],"grouping",true]]],false],[0,"\\n "],[10],[0,"\\n"],[10],[0,"\\n"]],"hasEval":false}',meta:{moduleName:"client-app/templates/settings.hbs"}})
213
213
  e.default=t}),define("client-app/templates/show",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
214
214
  var t=Ember.HTMLBars.template({id:"Z9BtSx7U",block:'{"symbols":[],"statements":[[4,"link-to",["index"],null,{"statements":[[0,"Recent"]],"parameters":[]},null],[0,"\\n"],[7,"div"],[11,"id","bottom-panel"],[11,"class","full"],[9],[0,"\\n "],[1,[27,"message-info",null,[["currentMessage","showTitle","envChangedAction","currentEnvPosition","actionsInMenu"],[[23,["model"]],"true",[27,"action",[[22,0,[]],"envChanged"],null],[23,["envPosition"]],false]]],false],[0,"\\n"],[10],[0,"\\n"]],"hasEval":false}',meta:{moduleName:"client-app/templates/show.hbs"}})
215
215
  e.default=t}),define("client-app/config/environment",[],function(){try{var e="client-app/config/environment",t=document.querySelector('meta[name="'+e+'"]').getAttribute("content"),n={default:JSON.parse(decodeURIComponent(t))}
216
- return Object.defineProperty(n,"__esModule",{value:!0}),n}catch(a){throw new Error('Could not read config from meta tag with name "'+e+'".')}}),runningTests||require("client-app/app").default.create({name:"client-app",version:"0.0.0+24d6cc97"})
216
+ return Object.defineProperty(n,"__esModule",{value:!0}),n}catch(a){throw new Error('Could not read config from meta tag with name "'+e+'".')}}),runningTests||require("client-app/app").default.create({name:"client-app",version:"0.0.0+43e54768"})
@@ -70,7 +70,6 @@ export default Controller.extend({
70
70
  messageIndex = group.messages.indexOf(msg);
71
71
  group.messages.removeObject(msg);
72
72
  messageIndex = Math.min(messageIndex, group.messages.length - 1);
73
- group.decrementProperty("count");
74
73
  if (group.messages.length === 0) {
75
74
  rows.removeObject(group);
76
75
  removedRow = true;
@@ -24,7 +24,7 @@
24
24
  {{/if}}
25
25
  {{message-info
26
26
  currentMessage=model.currentMessage
27
- loadingEnv=loadingEnv
27
+ loadingEnv=model.loadingEnv
28
28
  removeMessage=(action "removeMessage")
29
29
  solveMessage=(action "solveMessage")
30
30
  onTabChange=(action "tabChangedAction")
@@ -5,12 +5,13 @@ module Logster
5
5
  MAX_SIZE = 100
6
6
 
7
7
  attr_reader :key, :messages_keys, :timestamp, :messages
8
- attr_accessor :changed
8
+ attr_accessor :changed, :pattern, :count
9
9
 
10
- def initialize(key, messages_keys = [], timestamp: 0)
10
+ def initialize(key, messages_keys = [], timestamp: 0, count: 0)
11
11
  @key = key
12
12
  @messages_keys = messages_keys || []
13
13
  @timestamp = timestamp
14
+ @count = count
14
15
  @changed = true
15
16
  end
16
17
 
@@ -19,7 +20,8 @@ module Logster
19
20
  group = new(
20
21
  hash["key"],
21
22
  hash["messages_keys"],
22
- timestamp: hash["timestamp"] || 0
23
+ timestamp: hash["timestamp"] || 0,
24
+ count: hash["count"] || 0
23
25
  )
24
26
  group.changed = false
25
27
  group
@@ -33,14 +35,15 @@ module Logster
33
35
  {
34
36
  key: @key,
35
37
  messages_keys: @messages_keys,
36
- timestamp: @timestamp
38
+ timestamp: @timestamp,
39
+ count: @count
37
40
  }
38
41
  end
39
42
 
40
43
  def to_h_web
41
44
  {
42
45
  regex: @key,
43
- count: self.count,
46
+ count: @count,
44
47
  timestamp: @timestamp,
45
48
  messages: @messages,
46
49
  severity: -1,
@@ -55,6 +58,7 @@ module Logster
55
58
  def add_message(message)
56
59
  if !@messages_keys.include?(message.key)
57
60
  @messages_keys.unshift(message.key)
61
+ @count += 1
58
62
  @changed = true
59
63
  end
60
64
  if @timestamp < message.timestamp
@@ -101,10 +105,6 @@ module Logster
101
105
  @changed
102
106
  end
103
107
 
104
- def count
105
- @messages_keys.size
106
- end
107
-
108
108
  private
109
109
 
110
110
  def max_size
@@ -16,6 +16,7 @@ module Logster
16
16
  m.message =~ self.pattern && existing_groups.none? { |g| g.messages_keys.include?(m.key) }
17
17
  end
18
18
  group.messages = messages
19
+ group.count = messages.size
19
20
  @store.save_pattern_group(group) if group.changed?
20
21
  @store.clear_patterns_cache(CACHE_KEY)
21
22
  end
@@ -254,6 +254,7 @@ module Logster
254
254
 
255
255
  def truncate_message(msg)
256
256
  return msg unless msg
257
+ msg = msg.inspect unless String === msg
257
258
  msg.size <= MAX_MESSAGE_LENGTH ? msg : msg[0...MAX_MESSAGE_LENGTH] + "..."
258
259
  end
259
260
 
@@ -134,11 +134,12 @@ module Logster
134
134
 
135
135
  row = filter_search(row, search)
136
136
  if row
137
+ matches_pattern = pattern_groups.any? { |g| row.message =~ g.pattern }
137
138
  group = pattern_groups.find { |g| g.messages_keys.include?(row.key) }
138
139
  if group && !known_groups.include?(group.key)
139
140
  known_groups << group.key
140
141
  temp << serialize_group(group, row.key)
141
- elsif !group
142
+ elsif !matches_pattern
142
143
  temp << row
143
144
  end
144
145
  end
@@ -350,6 +351,7 @@ module Logster
350
351
  jsons.map! do |json|
351
352
  if json && json.size > 0
352
353
  group = Logster::Group.from_json(json)
354
+ group.pattern = patterns[mapped.index(group.key)]
353
355
  if load_messages
354
356
  group.messages = bulk_get(group.messages_keys, with_env: false)
355
357
  end
@@ -361,7 +363,7 @@ module Logster
361
363
  end
362
364
 
363
365
  def save_pattern_group(group)
364
- if group.count == 0
366
+ if group.messages_keys.size == 0
365
367
  @redis.hdel(pattern_groups_key, group.key)
366
368
  else
367
369
  @redis.hset(pattern_groups_key, group.key, group.to_json)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Logster
4
- VERSION = "2.5.0"
4
+ VERSION = "2.5.1"
5
5
  end
@@ -14,7 +14,8 @@ class TestGroup < MiniTest::Test
14
14
  json = JSON.generate(
15
15
  key: '/somekey/',
16
16
  messages_keys: [111, 222, 333].map(&:to_s),
17
- timestamp: time
17
+ timestamp: time,
18
+ count: 3
18
19
  )
19
20
  group = Logster::Group.from_json(json)
20
21
  refute group.changed?
@@ -49,6 +50,7 @@ class TestGroup < MiniTest::Test
49
50
  ]
50
51
  messages << messages[0]
51
52
  group.messages = messages
53
+ group.count = 4
52
54
  assert_equal 4, group.count
53
55
  assert_equal 74, group.timestamp
54
56
  expected = messages.uniq(&:key).sort_by(&:timestamp).map(&:key).reverse
@@ -67,13 +69,15 @@ class TestGroup < MiniTest::Test
67
69
  get_message(390)
68
70
  ]
69
71
  messages.each { |m| group.add_message(m) }
70
- assert_equal 5, group.count
72
+ # the count attr keeps track of the number of messages
73
+ # that has ever been added to the group.
74
+ # It should never decrease
75
+ assert_equal 6, group.count
71
76
  assert_equal 390, group.timestamp
72
77
  refute_includes group.messages_keys, messages.find { |m| m.timestamp == 10 }.key
73
78
 
74
79
  group = get_group
75
80
  group.messages = messages
76
- assert_equal 5, group.count
77
81
  assert_equal 390, group.timestamp
78
82
  refute_includes group.messages.map(&:timestamp), 5
79
83
  ensure
@@ -938,7 +938,8 @@ class TestRedisStore < Minitest::Test
938
938
  end
939
939
  groups = @store.find_pattern_groups
940
940
  assert_equal 1, groups.size
941
- assert_equal 4, groups[0].count
941
+ assert_equal 4, groups[0].messages_keys.size
942
+ assert_equal 5, groups[0].count
942
943
  assert_equal keys[1..-1].reverse, groups[0].messages_keys
943
944
  ensure
944
945
  @store.max_backlog = prev_max_backlog
@@ -965,12 +966,35 @@ class TestRedisStore < Minitest::Test
965
966
  def test_adding_grouping_pattern_doesnt_add_a_message_to_more_than_one_group
966
967
  Logster.config.enable_custom_patterns_via_ui = true
967
968
  @store.report(Logger::WARN, '', 'trim this plz')
969
+ @store.report(Logger::WARN, '', 'trim this plz 2')
968
970
  Logster::GroupingPattern.new(/trim/, store: @store).save
969
971
  Logster::GroupingPattern.new(/this/, store: @store).save
970
972
  groups = @store.find_pattern_groups
971
973
  assert_equal 1, groups.size
974
+ assert_equal 2, groups[0].count
975
+ ensure
976
+ Logster.config.enable_custom_patterns_via_ui = false
977
+ end
978
+
979
+ def test_latest_doesnt_include_rows_that_are_removed_from_grouping_patterns_due_to_max_size
980
+ Logster.config.enable_custom_patterns_via_ui = true
981
+ Logster::Group.instance_variable_set(:@max_size, 5)
982
+ msg1 = @store.report(Logger::WARN, '', 'first message')
983
+ msg2 = @store.report(Logger::WARN, '', 'second message')
984
+ Logster::GroupingPattern.new(/noisy/, store: @store).save
985
+
986
+ grouped = []
987
+ 7.times do |n|
988
+ grouped << @store.report(Logger::WARN, '', "noisy message #{n}", timestamp: n).key
989
+ end
990
+ msg3 = @store.report(Logger::WARN, '', 'third message')
991
+ results = @store.latest
992
+
993
+ assert_equal [msg1.key, msg2.key, '/noisy/', msg3.key], results.map(&:key)
994
+ assert_equal grouped.reverse.first(5), results[2].messages.map(&:key)
972
995
  ensure
973
996
  Logster.config.enable_custom_patterns_via_ui = false
997
+ Logster::Group.remove_instance_variable(:@max_size)
974
998
  end
975
999
 
976
1000
  private
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logster
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.5.0
4
+ version: 2.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - UI for viewing logs in Rack
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-12 00:00:00.000000000 Z
11
+ date: 2019-12-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler