logster 0.0.4 → 0.0.5

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: 4b23208e3d79e4cb73cbe9e80126b478cf04d6a2
4
- data.tar.gz: 5b6eadd9d5eebe2c73ca8011fe95adf7f35ae1ff
3
+ metadata.gz: 709b0b8ef1153c5a292e07e8531764850b2edbf7
4
+ data.tar.gz: 79f01414100ed958a1c552b6d0145d94bab3d753
5
5
  SHA512:
6
- metadata.gz: 048c85e54a50b34845fb61cf9c9c59c22e7f35833713636b5a03f408f58a319bd34474f6c0aa034730308ace8b20f886bb14e3818e16573846ef8e0731ae5260
7
- data.tar.gz: e98d6c25f00340deae55c94ad6f5d929e3df88d8a287e8a0bcf9d6fb4fd0407f0b111bf6f5cac1a30a918a34f1d648054cd993c9b429b46908e4ce97599202bc
6
+ metadata.gz: fada9c1ddfe55e3fb129dee46480d9ae18d26966ed9756a8bf0fb1be19e3c96ab18e3c87c431e19f9e42a85246df1610c2866eedb24d337b3b010eb3da103426
7
+ data.tar.gz: 2eb3dc534fcebc02802dfc8271d587217728b290315d488ac7efee4d96ae6b5c701de65e14a671febfdaa57661e0e73194bf6554d2b7211d492f3f4e9cc03c45
data/README.md CHANGED
@@ -45,3 +45,6 @@ Logster UI is built using [Ember.js](http://emberjs.com/)
45
45
  - 2014-05-07: Version 0.0.4
46
46
  - Feature: Ability to ignore patterns with Logster.store.ignore = [/regex/]
47
47
  - Feature: Store backtraces, allow people to view them in the GUI
48
+ - 2014-05-12: Version 0.0.5
49
+ - Feature: We now log basic rack environment with the messages
50
+ - Add your on with Logster.add_to_env(env, key, value)
@@ -57,6 +57,18 @@ App.Message = Ember.Object.extend({
57
57
  return message;
58
58
  }.property("message","expanded"),
59
59
 
60
+ envDebug: function(){
61
+ var env = this.get("env");
62
+ if(env){
63
+ var buffer = [];
64
+ _.each(env, function(v,k){
65
+ buffer.push(k + ": " + v);
66
+ });
67
+ return buffer.join("\n");
68
+ }
69
+
70
+ }.property("env"),
71
+
60
72
  rowClass: function() {
61
73
  switch(this.get("severity")){
62
74
  case 0:
@@ -418,6 +430,7 @@ Handlebars.registerHelper('timeAgo', function(prop, options){
418
430
 
419
431
 
420
432
  App.TabbedSectionComponent = Ember.Component.extend({
433
+ tabs: Em.A(),
421
434
  selectTab: function(view){
422
435
  var selected = this.get("selected");
423
436
  if(selected){
@@ -426,23 +439,38 @@ App.TabbedSectionComponent = Ember.Component.extend({
426
439
  this.set("selected", view);
427
440
  view.set("active", true);
428
441
  },
429
- tabs: function(){
430
- var result = [],
431
- first = true,
432
- self = this;
433
-
434
- this.get("childViews").forEach(function(view){
435
- if(view.constructor + "" === "App.TabContentsComponent"){
436
- result.push(view);
437
- if(first){
438
- self.selectTab(view);
439
- first = false;
440
- }
441
- }
442
- });
443
- return result;
444
- }.property()
442
+ addTab: function(tab){
443
+ this.get("tabs").addObject(tab);
444
+ if(!this.get("selected")){
445
+ this.selectTab(tab);
446
+ }
447
+ },
448
+ removeTab: function(tab){
449
+
450
+ if(this.get("selected") === tab){
451
+ this.set("selected", null);
452
+ }
453
+ this.get("tabs").removeObject(tab);
454
+ }
445
455
  });
456
+
446
457
  App.TabContentsComponent = Ember.Component.extend({
447
- classNameBindings: ["active", ":content"]
458
+ classNameBindings: ["active", ":content"],
459
+
460
+ invokeParent: function(name){
461
+ var current = this.get("parentView");
462
+ while(current && !current[name]) {
463
+ current = current.get("parentView");
464
+ }
465
+ if(current){
466
+ current[name](this);
467
+ }
468
+ },
469
+
470
+ didInsertElement: function(){
471
+ this.invokeParent("addTab");
472
+ },
473
+ willDestroyElement: function(){
474
+ this.invokeParent("removeTab");
475
+ }
448
476
  });
@@ -23,6 +23,9 @@
23
23
  {{#tabbed-section}}
24
24
  {{#tab-contents name="info" hint="show info"}}<pre>{{currentMessage.message}}</pre>{{/tab-contents}}
25
25
  {{#tab-contents name="backtrace" hint="show backtrace"}}<pre>{{currentMessage.backtrace}}</pre>{{/tab-contents}}
26
+ {{#if currentMessage.env}}
27
+ {{#tab-contents name="env" hint="show environment"}}<pre>{{currentMessage.envDebug}}</pre>{{/tab-contents}}
28
+ {{/if}}
26
29
  {{/tabbed-section}}
27
30
  </div>
28
31
 
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This file was generated by Bundler.
4
+ #
5
+ # The application 'guard' is installed as part of a gem, and
6
+ # this file is here to facilitate running it.
7
+ #
8
+
9
+ require 'pathname'
10
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
11
+ Pathname.new(__FILE__).realpath)
12
+
13
+ require 'rubygems'
14
+ require 'bundler/setup'
15
+
16
+ load Gem.bin_path('guard', 'guard')
@@ -26,6 +26,11 @@ module Logster
26
26
  def self.config
27
27
  @config ||= Configuration.new
28
28
  end
29
+
30
+ def self.add_to_env(env, key, value)
31
+ logster_env = Logster::Message.populate_from_env(env)
32
+ logster_env[key] = value
33
+ end
29
34
  end
30
35
 
31
36
  if defined?(::Rails) && ::Rails::VERSION::MAJOR.to_i >= 3
@@ -2,6 +2,8 @@ require 'logger'
2
2
 
3
3
  module Logster
4
4
  class Logger < ::Logger
5
+ LOGSTER_ENV = "logster_env".freeze
6
+
5
7
  attr_accessor :store
6
8
 
7
9
  def initialize(store)
@@ -39,7 +41,9 @@ module Logster
39
41
  end
40
42
  end
41
43
 
42
- @store.report(severity, progname, message)
44
+ @store.report(severity, progname, message, {
45
+ env: Thread.current[LOGSTER_ENV]
46
+ })
43
47
 
44
48
  end
45
49
  end
@@ -1,6 +1,14 @@
1
1
  module Logster
2
2
  class Message
3
- attr_accessor :timestamp, :severity, :progname, :message, :key, :backtrace
3
+ LOGSTER_ENV = "_logster_env".freeze
4
+ ALLOWED_ENV = %w{
5
+ HTTP_HOST
6
+ REQUEST_URI
7
+ REQUEST_METHOD
8
+ HTTP_USER_AGENT
9
+ }
10
+
11
+ attr_accessor :timestamp, :severity, :progname, :message, :key, :backtrace, :env
4
12
 
5
13
  def initialize(severity, progname, message, timestamp = nil, key = nil)
6
14
  @timestamp = timestamp || get_timestamp
@@ -18,7 +26,8 @@ module Logster
18
26
  severity: @severity,
19
27
  timestamp: @timestamp,
20
28
  key: @key,
21
- backtrace: @backtrace
29
+ backtrace: @backtrace,
30
+ env: @env
22
31
  }
23
32
  end
24
33
 
@@ -34,9 +43,25 @@ module Logster
34
43
  parsed["timestamp"],
35
44
  parsed["key"] )
36
45
  msg.backtrace = parsed["backtrace"]
46
+ msg.env = parsed["env"]
37
47
  msg
38
48
  end
39
49
 
50
+ def populate_from_env(env)
51
+ @env = Message.populate_from_env(env)
52
+ end
53
+
54
+
55
+ def self.populate_from_env(env)
56
+ env[LOGSTER_ENV] ||= begin
57
+ scrubbed = {}
58
+ ALLOWED_ENV.map{ |k|
59
+ scrubbed[k] = env[k] if env[k]
60
+ }
61
+ scrubbed
62
+ end
63
+ end
64
+
40
65
  protected
41
66
 
42
67
  def get_timestamp
@@ -1,12 +1,16 @@
1
1
  module Logster
2
2
  module Middleware
3
3
  class Reporter
4
+
4
5
  def initialize(app, config={})
5
6
  @app = app
6
7
  end
7
8
 
8
9
  def call(env)
10
+ Thread.current[Logster::Logger::LOGSTER_ENV] = env
9
11
  @app.call(env)
12
+ ensure
13
+ Thread.current[Logster::Logger::LOGSTER_ENV] = nil
10
14
  end
11
15
  end
12
16
  end
@@ -5,6 +5,7 @@ module Logster::Rails
5
5
 
6
6
  if defined?(Redis)
7
7
  require 'logster/middleware/viewer'
8
+ require 'logster/middleware/reporter'
8
9
  require 'logster/redis_store'
9
10
 
10
11
  store = Logster.store ||= Logster::RedisStore.new
@@ -30,6 +31,8 @@ module Logster::Rails
30
31
  app.middleware.use Logster::Middleware::Viewer
31
32
  end
32
33
 
34
+ app.middleware.insert_before ActionDispatch::ShowExceptions, Logster::Middleware::Reporter
35
+
33
36
  app.config.colorize_logging = false
34
37
  end
35
38
  end
@@ -29,6 +29,10 @@ module Logster
29
29
  message.backtrace = caller.join("\n")
30
30
  end
31
31
 
32
+ if opts && env=opts[:env]
33
+ message.populate_from_env(env)
34
+ end
35
+
32
36
  @redis.rpush(list_key, message.to_json)
33
37
 
34
38
  # TODO make it atomic
@@ -1,3 +1,3 @@
1
1
  module Logster
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
@@ -3,7 +3,7 @@ require 'logster/logger'
3
3
  require 'logger'
4
4
 
5
5
  class NullStore
6
- def report(severity,progname,message)
6
+ def report(severity,progname,message,options=nil)
7
7
  end
8
8
  end
9
9
 
@@ -147,4 +147,21 @@ class TestRedisStore < Minitest::Test
147
147
  assert_equal(1, @store.latest.count)
148
148
  end
149
149
 
150
+ def test_env
151
+ env = {
152
+ "REQUEST_URI" => "/test",
153
+ "HTTP_HOST" => "www.site.com",
154
+ "REQUEST_METHOD" => "GET",
155
+ "HTTP_USER_AGENT" => "SOME WHERE"
156
+ }
157
+ orig = env.dup
158
+ orig["test"] = "tests"
159
+ orig["test1"] = "tests1"
160
+
161
+ Logster.add_to_env(env,"test","tests")
162
+ Logster.add_to_env(env,"test1","tests1")
163
+ @store.report(Logger::INFO, "test", "test", env: env)
164
+ assert_equal(orig, @store.latest.last.env)
165
+ end
166
+
150
167
  end
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.0.4
4
+ version: 0.0.5
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-05-07 00:00:00.000000000 Z
11
+ date: 2014-05-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -97,7 +97,8 @@ dependencies:
97
97
  description: UI for viewing logs in Rack
98
98
  email:
99
99
  - sam.saffron@gmail.com
100
- executables: []
100
+ executables:
101
+ - guard
101
102
  extensions: []
102
103
  extra_rdoc_files: []
103
104
  files:
@@ -120,6 +121,7 @@ files:
120
121
  - assets/javascript/templates/index.handlebars
121
122
  - assets/javascript/templates/message.handlebars
122
123
  - assets/stylesheets/app.css
124
+ - bin/guard
123
125
  - bower.json
124
126
  - lib/logster.rb
125
127
  - lib/logster/configuration.rb
@@ -155,7 +157,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
155
157
  version: '0'
156
158
  requirements: []
157
159
  rubyforge_project:
158
- rubygems_version: 2.2.0
160
+ rubygems_version: 2.2.2
159
161
  signing_key:
160
162
  specification_version: 4
161
163
  summary: UI for viewing logs in Rack