logster 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 817153c3885fd064575528496f299e302802edff
4
- data.tar.gz: 2adf2a219859d1d5a1b7163fa98714a3e0d353fc
3
+ metadata.gz: 27abd7df3fc47f5af41862411fc506de6a205a43
4
+ data.tar.gz: 1875f195f059603f9e14093ea9afd200b927a125
5
5
  SHA512:
6
- metadata.gz: 40a5c76579e0f5145e3cdb490daab9550dd30e12d3e6be4609774aa045f46d33f3465ba20bcd0a1fe350de3000f92a9bff54c94cdb7032cbc1eccabb88765ea4
7
- data.tar.gz: 33401bae4031a18e2d0e40f22679acfc1ebf0cb8515df2ea9084ca06e0eccb82a781ee34abeadf5dc4a5592c3327c77f246623b7724a40959ea330a6f4768df8
6
+ metadata.gz: ea1b1899505c10ad68907ead7fcada96fd9998528c8750ffb877616cb29ac9a7064d8167097d7b9691337d2393a7843be3caf836986f835f41d142f2418761a5
7
+ data.tar.gz: 641d21916328714c2290d8d42fb24698b5d3f67d5a895fe531de6fc1487d4097d9f352382335972e2e6ad511ddcdb1376d77ff02013fa15693cc284541d04216
data/README.md CHANGED
@@ -74,3 +74,9 @@ Logster UI is built using [Ember.js](http://emberjs.com/)
74
74
  - Feature: Able to share logs, at /logs/show/(hexdigits)
75
75
  - Add protecting logs, so they aren't deleted when old (for use with sharing)
76
76
  - Restructured Redis data model
77
+ - 2014-07-17: Version 0.1.1
78
+ - Refactored report method into base_store.rb - will be easier to make a new log store
79
+ - Add link in UI to clear all (non-protected) logs
80
+ - Add example of submitting logs from Sidekiq jobs
81
+ - Show Protect/Share links on all tabs
82
+ - Render hashes provided via Logster.add_to_env
@@ -308,9 +308,11 @@ App.IndexController = Em.Controller.extend({
308
308
 
309
309
  clear: function() {
310
310
  var self = this;
311
- App.ajax("/clear", { type: "POST" }).success(function() {
312
- self.get('model').reload();
313
- });
311
+ if (confirm("Clear the logs?\n\nCancel = No, OK = Clear")) {
312
+ App.ajax("/clear", { type: "POST" }).success(function() {
313
+ self.get('model').reload();
314
+ });
315
+ }
314
316
  },
315
317
 
316
318
  protect: function(message) {
@@ -1,3 +1,4 @@
1
+ {{#link-to 'index'}}< Recent{{/link-to}}
1
2
  <div id="bottom-panel" class="full">
2
3
  {{message-info currentMessage=model}}
3
4
  </div>
data/lib/logster.rb CHANGED
@@ -34,8 +34,8 @@ module Logster
34
34
  end
35
35
  end
36
36
 
37
- Logster.config.current_context = lambda{|env, &block| block.call}
38
- Logster.config.authorize_callback = lambda{|env| true}
37
+ Logster.config.current_context = lambda{ |env, &block| block.call }
38
+ Logster.config.authorize_callback = lambda{ |env| true }
39
39
 
40
40
  if defined?(::Rails) && ::Rails::VERSION::MAJOR.to_i >= 3
41
41
  require 'logster/rails/railtie'
@@ -38,12 +38,11 @@ module Logster
38
38
  not_implemented
39
39
  end
40
40
 
41
- def report(severity, progname, message, opts = {})
42
- return if (!message || (String === message && message.empty?)) && skip_empty
41
+ def report(severity, progname, msg, opts = {})
42
+ return if (!msg || (String === msg && msg.empty?)) && skip_empty
43
43
  return if level && severity < level
44
- return if ignore && ignore.any? { |pattern| message =~ pattern}
45
44
 
46
- message = Logster::Message.new(severity, progname, message, opts[:timestamp])
45
+ message = Logster::Message.new(severity, progname, msg, opts[:timestamp])
47
46
 
48
47
  env = opts[:env]
49
48
  backtrace = opts[:backtrace]
@@ -66,6 +65,8 @@ module Logster
66
65
  message.backtrace = caller.join("\n")
67
66
  end
68
67
 
68
+ return if ignore && ignore.any? { |pattern| message =~ pattern}
69
+
69
70
  save message
70
71
 
71
72
  message
@@ -0,0 +1,61 @@
1
+ module Logster
2
+ class IgnorePattern
3
+
4
+ def initialize(message_pattern=nil, env_patterns=nil)
5
+ @msg_match = message_pattern
6
+ @env_match = env_patterns
7
+ end
8
+
9
+ def self.from_message_and_request_uri(msg, request)
10
+ IgnorePattern.new(msg, {REQUEST_URI: request})
11
+ end
12
+
13
+ def matches?(message)
14
+ if @msg_match
15
+ return false unless compare(message.message, @msg_match)
16
+ end
17
+
18
+ if @env_match
19
+ return false unless compare(message.env, @env_match)
20
+ end
21
+
22
+ true
23
+ end
24
+
25
+ def to_s
26
+ "<#Logster::IgnorePattern, msg_match: #{@msg_match.inspect}, env_match: #{@env_match.inspect}>"
27
+ end
28
+
29
+ private
30
+
31
+ def compare(message, pattern)
32
+ case pattern
33
+ when Regexp
34
+ message =~ pattern
35
+ when String
36
+ message.downcase =~ Regexp.new(pattern.downcase, Regexp::IGNORECASE)
37
+ when Hash
38
+ compare_hash(message, pattern)
39
+ when NilClass
40
+ true
41
+ else
42
+ true
43
+ end
44
+ end
45
+
46
+ def compare_hash(message_hash, pattern_hash)
47
+ return false unless message_hash
48
+ pattern_hash.each do |key, value|
49
+ return false unless compare(get_indifferent(message_hash, key), value)
50
+ end
51
+ true
52
+ end
53
+
54
+ def get_indifferent(hash, key)
55
+ return hash[key] if hash[key]
56
+ return hash[key.to_s] if hash[key.to_s]
57
+ return hash[key.to_sym] if hash[key.to_sym]
58
+ nil
59
+ end
60
+ end
61
+ end
@@ -92,6 +92,21 @@ module Logster
92
92
  self.key <=> other.key
93
93
  end
94
94
 
95
+ def =~(pattern)
96
+ case pattern
97
+ when Hash
98
+ IgnorePattern.new(nil, pattern).matches? self
99
+ when String
100
+ IgnorePattern.new(pattern, nil).matches? self
101
+ when Regexp
102
+ IgnorePattern.new(pattern, nil).matches? self
103
+ when IgnorePattern
104
+ pattern.matches? self
105
+ else
106
+ nil
107
+ end
108
+ end
109
+
95
110
  protected
96
111
 
97
112
  def get_timestamp
@@ -1,3 +1,3 @@
1
1
  module Logster
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
@@ -1,5 +1,6 @@
1
1
  require_relative '../test_helper'
2
2
  require 'logster/base_store'
3
+ require 'logster/ignore_pattern'
3
4
 
4
5
  class TestBaseStore < Minitest::Test
5
6
 
@@ -50,6 +51,57 @@ class TestBaseStore < Minitest::Test
50
51
  assert_equal(4, @store.count)
51
52
  end
52
53
 
54
+ def test_ignore_pattern_basic
55
+ @store.ignore = [
56
+ Logster::IgnorePattern.new(nil, {username: 'CausingErrors'})
57
+ ]
58
+ @store.report(Logger::WARN, "test", "Foobar") #
59
+ @store.report(Logger::WARN, "test", "Foobar", { env: { username: 'CausingErrors' }})
60
+ @store.report(Logger::WARN, "test", "Something Else", { env: { username: 'CausingErrors' }})
61
+ @store.report(Logger::WARN, "test", "Something Else", { env: { 'username' => 'CausingErrors' }})
62
+ @store.report(Logger::WARN, "test", "Something Else", { env: { username: 'GoodPerson' }}) #
63
+ @store.report(Logger::WARN, "test", "Can't verify CSRF token authenticity") #
64
+
65
+ assert_equal(3, @store.count)
66
+ end
67
+
68
+ def test_ignore_pattern_real
69
+ @store.ignore = [
70
+ /^ActionController::RoutingError \(No route matches/,
71
+ Logster::IgnorePattern.new("Can't verify CSRF token authenticity", { REQUEST_URI: /\/trackback\/$/ })
72
+ ]
73
+ # blocked
74
+ @store.report(Logger::WARN, "whatever", "Can't verify CSRF token authenticity", {
75
+ env: {
76
+ HTTP_HOST: 'meta.discourse.org',
77
+ REQUEST_URI: '/t/use-more-standard-smiley-codes-instead-of-smile/1822/trackback/',
78
+ REQUEST_METHOD: 'POST',
79
+ HTTP_USER_AGENT: 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)',
80
+ params: {
81
+ title: 'Something Spammy',
82
+ url: 'http://spam.example.net/whatever/spam.html',
83
+ excerpt: 'http://spam.example.com/pdf/blahblah.html free viagra',
84
+ blog_name: 'get free spam for cheap'
85
+ }
86
+ }
87
+ })
88
+ # logged
89
+ @store.report(Logger::WARN, "whatever", "Can't verify CSRF token authenticity", {
90
+ env: {
91
+ HTTP_HOST: 'meta.discourse.org',
92
+ REQUEST_URI: '/session',
93
+ REQUEST_METHOD: 'POST',
94
+ HTTP_USER_AGENT: 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36',
95
+ params: {
96
+ username: 'user',
97
+ password: 'password',
98
+ form_authenticity_token: 'incorrect'
99
+ }
100
+ }
101
+ })
102
+ assert_equal(1, @store.count)
103
+ end
104
+
53
105
  def test_timestamp
54
106
  time = Time.now - 24*60*60
55
107
  message = @store.report(Logger::WARN, "test", "B", timestamp: time)
@@ -1,9 +1,18 @@
1
- (function(){
1
+ (function() {
2
2
  var lastReport = null;
3
3
 
4
+ if (!window.Logster) {
5
+ window.Logster = {
6
+ enabled: true
7
+ };
8
+ }
9
+
4
10
  window.onerror = function(message, url, line, column, errorObj) {
5
11
  // never bother reporting more than once a minute
6
- if(lastReport && new Date() - lastReport < 1000 * 60) {
12
+ if (lastReport && new Date() - lastReport < 1000 * 60) {
13
+ return;
14
+ }
15
+ if (!Logster.enabled) {
7
16
  return;
8
17
  }
9
18
 
@@ -17,11 +26,11 @@
17
26
  window_location: window.location && (window.location + "")
18
27
  };
19
28
 
20
- if(errorObj && errorObj.stack) {
29
+ if (errorObj && errorObj.stack) {
21
30
  err.stacktrace = errorObj.stack;
22
31
  }
23
32
 
24
- $.ajax("<%= Logster.config.subdirectory || '/logs' %>" + "/report_js_error",{
33
+ $.ajax("<%= Logster.config.subdirectory || '/logs' %>" + "/report_js_error", {
25
34
  data: err,
26
35
  type: "POST",
27
36
  cache: false
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: 0.1.1
4
+ version: 0.1.2
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: 2014-07-17 00:00:00.000000000 Z
11
+ date: 2014-07-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -128,6 +128,7 @@ files:
128
128
  - lib/logster.rb
129
129
  - lib/logster/base_store.rb
130
130
  - lib/logster/configuration.rb
131
+ - lib/logster/ignore_pattern.rb
131
132
  - lib/logster/logger.rb
132
133
  - lib/logster/message.rb
133
134
  - lib/logster/middleware/debug_exceptions.rb