mongodb_logger 0.1.4 → 0.1.5

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.
Files changed (38) hide show
  1. data/README.md +1 -1
  2. data/SUPPORTED_RAILS_VERSIONS +3 -1
  3. data/config.ru +1 -1
  4. data/examples/server_config.yml +1 -0
  5. data/lib/mongodb_logger/logger.rb +2 -1
  6. data/lib/mongodb_logger/server/coffee/{application.coffee → logs.coffee} +59 -8
  7. data/lib/mongodb_logger/server/content_for.rb +58 -0
  8. data/lib/mongodb_logger/server/model/additional_filter.rb +70 -0
  9. data/lib/mongodb_logger/server/model/filter.rb +52 -32
  10. data/lib/mongodb_logger/server/public/images/date.png +0 -0
  11. data/lib/mongodb_logger/server/public/images/external.png +0 -0
  12. data/lib/mongodb_logger/server/public/javascripts/{application.js → logs.js} +68 -10
  13. data/lib/mongodb_logger/server/public/javascripts/vendors/highlight.pack.js +1 -0
  14. data/lib/mongodb_logger/server/public/javascripts/{jquery-1.7.min.js → vendors/jquery-1.7.min.js} +0 -0
  15. data/lib/mongodb_logger/server/public/javascripts/{jquery-ui-1.8.16.effects.min.js → vendors/jquery-ui-1.8.16.effects.min.js} +0 -0
  16. data/lib/mongodb_logger/server/public/javascripts/vendors/jquery.pjax.js +264 -0
  17. data/lib/mongodb_logger/server/public/stylesheets/all.css +2 -1
  18. data/lib/mongodb_logger/server/public/stylesheets/group-buttons.css +27 -29
  19. data/lib/mongodb_logger/server/public/stylesheets/group-forms.css +1 -1
  20. data/lib/mongodb_logger/server/public/stylesheets/group-tables.css +29 -1
  21. data/lib/mongodb_logger/server/public/stylesheets/highlight/zenburn.css +115 -0
  22. data/lib/mongodb_logger/server/public/stylesheets/layout.css +32 -10
  23. data/lib/mongodb_logger/server/public/stylesheets/library.css +169 -19
  24. data/lib/mongodb_logger/server/view_helpers.rb +35 -0
  25. data/lib/mongodb_logger/server/views/layout.erb +31 -7
  26. data/lib/mongodb_logger/server/views/overview.erb +40 -51
  27. data/lib/mongodb_logger/server/views/shared/_dynamic_filter.erb +30 -0
  28. data/lib/mongodb_logger/server/views/shared/_log.erb +6 -6
  29. data/lib/mongodb_logger/server/views/shared/_log_info.erb +9 -7
  30. data/lib/mongodb_logger/server/views/shared/_message_tabs.erb +15 -0
  31. data/lib/mongodb_logger/server/views/shared/_tabs.erb +2 -2
  32. data/lib/mongodb_logger/server/views/shared/_tail_panel.erb +13 -0
  33. data/lib/mongodb_logger/server/views/shared/_top_panel.erb +7 -0
  34. data/lib/mongodb_logger/server/views/show_log.erb +31 -15
  35. data/lib/mongodb_logger/server.rb +17 -3
  36. data/lib/mongodb_logger/version.rb +1 -1
  37. data/mongodb_logger.gemspec +9 -9
  38. metadata +47 -36
@@ -0,0 +1,264 @@
1
+ // jquery.pjax.js
2
+ // copyright chris wanstrath
3
+ // https://github.com/defunkt/jquery-pjax
4
+
5
+ (function($){
6
+
7
+ // When called on a link, fetches the href with ajax into the
8
+ // container specified as the first parameter or with the data-pjax
9
+ // attribute on the link itself.
10
+ //
11
+ // Tries to make sure the back button and ctrl+click work the way
12
+ // you'd expect.
13
+ //
14
+ // Accepts a jQuery ajax options object that may include these
15
+ // pjax specific options:
16
+ //
17
+ // container - Where to stick the response body. Usually a String selector.
18
+ // $(container).html(xhr.responseBody)
19
+ // push - Whether to pushState the URL. Defaults to true (of course).
20
+ // replace - Want to use replaceState instead? That's cool.
21
+ //
22
+ // For convenience the first parameter can be either the container or
23
+ // the options object.
24
+ //
25
+ // Returns the jQuery object
26
+ $.fn.pjax = function( container, options ) {
27
+ if ( options )
28
+ options.container = container
29
+ else
30
+ options = $.isPlainObject(container) ? container : {container:container}
31
+
32
+ // We can't persist $objects using the history API so we must use
33
+ // a String selector. Bail if we got anything else.
34
+ if ( options.container && typeof options.container !== 'string' ) {
35
+ throw "pjax container must be a string selector!"
36
+ return false
37
+ }
38
+
39
+ return this.live('click', function(event){
40
+ // Middle click, cmd click, and ctrl click should open
41
+ // links in a new tab as normal.
42
+ if ( event.which > 1 || event.metaKey )
43
+ return true
44
+
45
+ var defaults = {
46
+ url: this.href,
47
+ container: $(this).attr('data-pjax'),
48
+ clickedElement: $(this),
49
+ fragment: null
50
+ }
51
+
52
+ $.pjax($.extend({}, defaults, options))
53
+
54
+ event.preventDefault()
55
+ })
56
+ }
57
+
58
+
59
+ // Loads a URL with ajax, puts the response body inside a container,
60
+ // then pushState()'s the loaded URL.
61
+ //
62
+ // Works just like $.ajax in that it accepts a jQuery ajax
63
+ // settings object (with keys like url, type, data, etc).
64
+ //
65
+ // Accepts these extra keys:
66
+ //
67
+ // container - Where to stick the response body. Must be a String.
68
+ // $(container).html(xhr.responseBody)
69
+ // push - Whether to pushState the URL. Defaults to true (of course).
70
+ // replace - Want to use replaceState instead? That's cool.
71
+ //
72
+ // Use it just like $.ajax:
73
+ //
74
+ // var xhr = $.pjax({ url: this.href, container: '#main' })
75
+ // console.log( xhr.readyState )
76
+ //
77
+ // Returns whatever $.ajax returns.
78
+ var pjax = $.pjax = function( options ) {
79
+ var $container = $(options.container),
80
+ success = options.success || $.noop
81
+
82
+ // We don't want to let anyone override our success handler.
83
+ delete options.success
84
+
85
+ // We can't persist $objects using the history API so we must use
86
+ // a String selector. Bail if we got anything else.
87
+ if ( typeof options.container !== 'string' )
88
+ throw "pjax container must be a string selector!"
89
+
90
+ options = $.extend(true, {}, pjax.defaults, options)
91
+
92
+ if ( $.isFunction(options.url) ) {
93
+ options.url = options.url()
94
+ }
95
+
96
+ options.context = $container
97
+
98
+ options.success = function(data){
99
+ if ( options.fragment ) {
100
+ // If they specified a fragment, look for it in the response
101
+ // and pull it out.
102
+ var $fragment = $(data).find(options.fragment)
103
+ if ( $fragment.length )
104
+ data = $fragment.children()
105
+ else
106
+ return window.location = options.url
107
+ } else {
108
+ // If we got no data or an entire web page, go directly
109
+ // to the page and let normal error handling happen.
110
+ if ( !$.trim(data) || /<html/i.test(data) )
111
+ return window.location = options.url
112
+ }
113
+
114
+ // Make it happen.
115
+ this.html(data)
116
+
117
+ // If there's a <title> tag in the response, use it as
118
+ // the page's title.
119
+ var oldTitle = document.title,
120
+ title = $.trim( this.find('title').remove().text() )
121
+ if ( title ) document.title = title
122
+
123
+ // No <title>? Fragment? Look for data-title and title attributes.
124
+ if ( !title && options.fragment ) {
125
+ title = $fragment.attr('title') || $fragment.data('title')
126
+ }
127
+
128
+ var state = {
129
+ pjax: options.container,
130
+ fragment: options.fragment,
131
+ timeout: options.timeout
132
+ }
133
+
134
+ // If there are extra params, save the complete URL in the state object
135
+ var query = $.param(options.data)
136
+ if ( query != "_pjax=true" )
137
+ state.url = options.url + (/\?/.test(options.url) ? "&" : "?") + query
138
+
139
+ if ( options.replace ) {
140
+ window.history.replaceState(state, document.title, options.url)
141
+ } else if ( options.push ) {
142
+ // this extra replaceState before first push ensures good back
143
+ // button behavior
144
+ if ( !pjax.active ) {
145
+ window.history.replaceState($.extend({}, state, {url:null}), oldTitle)
146
+ pjax.active = true
147
+ }
148
+
149
+ window.history.pushState(state, document.title, options.url)
150
+ }
151
+
152
+ // Google Analytics support
153
+ if ( (options.replace || options.push) && window._gaq )
154
+ _gaq.push(['_trackPageview'])
155
+
156
+ // If the URL has a hash in it, make sure the browser
157
+ // knows to navigate to the hash.
158
+ var hash = window.location.hash.toString()
159
+ if ( hash !== '' ) {
160
+ window.location.href = hash
161
+ }
162
+
163
+ // Invoke their success handler if they gave us one.
164
+ success.apply(this, arguments)
165
+ }
166
+
167
+ // Cancel the current request if we're already pjaxing
168
+ var xhr = pjax.xhr
169
+ if ( xhr && xhr.readyState < 4) {
170
+ xhr.onreadystatechange = $.noop
171
+ xhr.abort()
172
+ }
173
+
174
+ pjax.options = options
175
+ pjax.xhr = $.ajax(options)
176
+ $(document).trigger('pjax', [pjax.xhr, options])
177
+
178
+ return pjax.xhr
179
+ }
180
+
181
+
182
+ pjax.defaults = {
183
+ timeout: 650,
184
+ push: true,
185
+ replace: false,
186
+ // We want the browser to maintain two separate internal caches: one for
187
+ // pjax'd partial page loads and one for normal page loads. Without
188
+ // adding this secret parameter, some browsers will often confuse the two.
189
+ data: { _pjax: true },
190
+ type: 'GET',
191
+ dataType: 'html',
192
+ beforeSend: function(xhr){
193
+ this.trigger('pjax:start', [xhr, pjax.options])
194
+ // start.pjax is deprecated
195
+ this.trigger('start.pjax', [xhr, pjax.options])
196
+ xhr.setRequestHeader('X-PJAX', 'true')
197
+ },
198
+ error: function(xhr, textStatus, errorThrown){
199
+ if ( textStatus !== 'abort' )
200
+ window.location = pjax.options.url
201
+ },
202
+ complete: function(xhr){
203
+ this.trigger('pjax:end', [xhr, pjax.options])
204
+ // end.pjax is deprecated
205
+ this.trigger('end.pjax', [xhr, pjax.options])
206
+ }
207
+ }
208
+
209
+
210
+ // Used to detect initial (useless) popstate.
211
+ // If history.state exists, assume browser isn't going to fire initial popstate.
212
+ var popped = ('state' in window.history), initialURL = location.href
213
+
214
+
215
+ // popstate handler takes care of the back and forward buttons
216
+ //
217
+ // You probably shouldn't use pjax on pages with other pushState
218
+ // stuff yet.
219
+ $(window).bind('popstate', function(event){
220
+ // Ignore inital popstate that some browsers fire on page load
221
+ var initialPop = !popped && location.href == initialURL
222
+ popped = true
223
+ if ( initialPop ) return
224
+
225
+ var state = event.state
226
+
227
+ if ( state && state.pjax ) {
228
+ var container = state.pjax
229
+ if ( $(container+'').length )
230
+ $.pjax({
231
+ url: state.url || location.href,
232
+ fragment: state.fragment,
233
+ container: container,
234
+ push: false,
235
+ timeout: state.timeout
236
+ })
237
+ else
238
+ window.location = location.href
239
+ }
240
+ })
241
+
242
+
243
+ // Add the state property to jQuery's event object so we can use it in
244
+ // $(window).bind('popstate')
245
+ if ( $.inArray('state', $.event.props) < 0 )
246
+ $.event.props.push('state')
247
+
248
+
249
+ // Is pjax supported by this browser?
250
+ $.support.pjax =
251
+ window.history && window.history.pushState && window.history.replaceState
252
+ // pushState isn't reliable on iOS yet.
253
+ && !navigator.userAgent.match(/(iPod|iPhone|iPad|WebApps\/.+CFNetwork)/)
254
+
255
+
256
+ // Fall back to normalcy for older browsers.
257
+ if ( !$.support.pjax ) {
258
+ $.pjax = function( options ) {
259
+ window.location = $.isFunction(options.url) ? options.url() : options.url
260
+ }
261
+ $.fn.pjax = function() { return this }
262
+ }
263
+
264
+ })(jQuery);
@@ -6,4 +6,5 @@
6
6
  @import "group-headers.css";
7
7
  @import "group-buttons.css";
8
8
  @import "group-forms.css";
9
- @import "group-tables.css";
9
+ @import "group-tables.css";
10
+ @import "highlight/zenburn.css";
@@ -1,16 +1,25 @@
1
1
  .button {
2
2
  display: inline-block;
3
- height: 30px;
4
- padding: 0 20px;
5
- line-height: 30px;
3
+ padding: 5px 20px;
6
4
  border: 1px solid #777;
7
5
  border-radius: 3px;
8
6
  box-shadow: 0 1px 2px rgba(100,100,100,0.4), 0 1px 0 rgba(255,255,255,0.3) inset;
9
- background: rgb(255,255,255);
10
7
  text-decoration: none;
11
8
  font-weight: bold;
12
- color: #333;
9
+ color: #fff;
13
10
  cursor: pointer;
11
+ background: rgb(5,171,239);
12
+ background: -moz-linear-gradient(top, rgba(5,171,239,1) 0%, rgba(3,105,173,1) 100%);
13
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(5,171,239,1)), color-stop(100%,rgba(3,105,173,1)));
14
+ background: -webkit-linear-gradient(top, rgba(5,171,239,1) 0%,rgba(3,105,173,1) 100%);
15
+ background: -o-linear-gradient(top, rgba(5,171,239,1) 0%,rgba(3,105,173,1) 100%);
16
+ background: -ms-linear-gradient(top, rgba(5,171,239,1) 0%,rgba(3,105,173,1) 100%);
17
+ background: linear-gradient(top, rgba(5,171,239,1) 0%,rgba(3,105,173,1) 100%);
18
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#05abef', endColorstr='#0369ad',GradientType=0 );
19
+ }
20
+
21
+ .button.grey {
22
+ color: #333;
14
23
  background: -moz-linear-gradient(top, rgba(255,255,255,1) 0%, rgba(229,229,229,1) 100%);
15
24
  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,1)), color-stop(100%,rgba(229,229,229,1)));
16
25
  background: -webkit-linear-gradient(top, rgba(255,255,255,1) 0%,rgba(229,229,229,1) 100%);
@@ -21,22 +30,7 @@
21
30
  }
22
31
 
23
32
  .button.small {
24
- height: 24px;
25
- line-height: 24px;
26
- padding: 0 10px;
27
- }
28
-
29
- .button:hover {
30
- color: #fff;
31
- text-shadow: 0 1px 0 rgba(0,0,0,0.4);
32
- background: rgb(5,171,239);
33
- background: -moz-linear-gradient(top, rgba(5,171,239,1) 0%, rgba(3,105,173,1) 100%);
34
- background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(5,171,239,1)), color-stop(100%,rgba(3,105,173,1)));
35
- background: -webkit-linear-gradient(top, rgba(5,171,239,1) 0%,rgba(3,105,173,1) 100%);
36
- background: -o-linear-gradient(top, rgba(5,171,239,1) 0%,rgba(3,105,173,1) 100%);
37
- background: -ms-linear-gradient(top, rgba(5,171,239,1) 0%,rgba(3,105,173,1) 100%);
38
- background: linear-gradient(top, rgba(5,171,239,1) 0%,rgba(3,105,173,1) 100%);
39
- filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#05abef', endColorstr='#0369ad',GradientType=0 );
33
+ padding: 2px 10px;
40
34
  }
41
35
 
42
36
  .button.negative {
@@ -52,32 +46,36 @@
52
46
  }
53
47
 
54
48
  .button.primary {
55
- height: 24px;
56
- line-height: 24px;
57
- padding: 0 10px;
49
+ padding: 3px 10px;
58
50
  color: #fff;
59
51
  background: #68B902;
60
52
  border-color: #5E8C22;
61
53
  text-shadow: 0 1px 0 rgba(0,0,0,0.4);
62
54
  }
63
55
 
56
+ .button:hover {
57
+ color: #fff;
58
+ }
59
+
60
+ .button.grey:hover {
61
+ color: #333;
62
+ }
63
+
64
+
64
65
  .button.primary:hover {
65
66
  background: #6bc102;
66
67
  border-color: #57910C;
67
68
  }
68
69
 
69
- .button:hover .start {
70
- background-position: 0 -29px;
71
- }
72
70
 
73
71
  .start {
74
72
  display: inline-block;
75
73
  padding-left: 13px;
76
- background: url(../images/play-icon.png) no-repeat 0 10px;
74
+ background: url(../images/play-icon.png) no-repeat 0 -35px;
77
75
  }
78
76
 
79
77
  .stop {
80
78
  display: inline-block;
81
79
  padding-left: 13px;
82
- background: url(../images/stop-icon.png) no-repeat 0 11px;
80
+ background: url(../images/stop-icon.png) no-repeat 0 5px;
83
81
  }
@@ -20,7 +20,7 @@ textarea {
20
20
 
21
21
  select {
22
22
  padding: 1px;
23
- width: auto;
23
+ width: 100%;
24
24
  font: 12px arial, sans-serif;
25
25
  }
26
26
 
@@ -54,6 +54,34 @@ td:last-child {
54
54
  text-align: center;
55
55
  }
56
56
 
57
+
58
+ .url-text {
59
+ max-width: 120px;
60
+ white-space: nowrap;
61
+ overflow: hidden;
62
+ text-overflow: ellipsis;
63
+ }
64
+
65
+ .td-time {
66
+ width: 100px;
67
+ }
68
+
69
+ .td-controller {
70
+ width: 15%;
71
+ }
72
+
73
+ .td-action {
74
+ width: 15%;
75
+ }
76
+
77
+ .td-ip {
78
+ width: 15%;
79
+ }
80
+
81
+ .td-runtime {
82
+ width: 15%;
83
+ }
84
+
57
85
  .url_log {
58
- width: 10%;
86
+ width: 15%;
59
87
  }
@@ -0,0 +1,115 @@
1
+ /*
2
+
3
+ Zenburn style from voldmar.ru (c) Vladimir Epifanov <voldmar@voldmar.ru>
4
+ based on dark.css by Ivan Sagalaev
5
+
6
+ */
7
+
8
+ pre code {
9
+ display: block; padding: 0.5em;
10
+ background: #3F3F3F;
11
+ color: #DCDCDC;
12
+ }
13
+
14
+ pre .keyword,
15
+ pre .tag,
16
+ pre .django .tag,
17
+ pre .django .keyword,
18
+ pre .css .class,
19
+ pre .css .id,
20
+ pre .lisp .title {
21
+ color: #E3CEAB;
22
+ }
23
+
24
+ pre .django .template_tag,
25
+ pre .django .variable,
26
+ pre .django .filter .argument {
27
+ color: #DCDCDC;
28
+ }
29
+
30
+ pre .number,
31
+ pre .date {
32
+ color: #8CD0D3;
33
+ }
34
+
35
+ pre .dos .envvar,
36
+ pre .dos .stream,
37
+ pre .variable,
38
+ pre .apache .sqbracket {
39
+ color: #EFDCBC;
40
+ }
41
+
42
+ pre .dos .flow,
43
+ pre .diff .change,
44
+ pre .python .exception,
45
+ pre .python .built_in,
46
+ pre .literal,
47
+ pre .tex .special {
48
+ color: #EFEFAF;
49
+ }
50
+
51
+ pre .diff .chunk,
52
+ pre .ruby .subst {
53
+ color: #8F8F8F;
54
+ }
55
+
56
+ pre .dos .keyword,
57
+ pre .python .decorator,
58
+ pre .class .title,
59
+ pre .haskell .label,
60
+ pre .function .title,
61
+ pre .ini .title,
62
+ pre .diff .header,
63
+ pre .ruby .class .parent,
64
+ pre .apache .tag,
65
+ pre .nginx .built_in,
66
+ pre .tex .command,
67
+ pre .input_number {
68
+ color: #efef8f;
69
+ }
70
+
71
+ pre .dos .winutils,
72
+ pre .ruby .symbol,
73
+ pre .ruby .symbol .string,
74
+ pre .ruby .symbol .keyword,
75
+ pre .ruby .symbol .keymethods,
76
+ pre .ruby .string,
77
+ pre .ruby .instancevar {
78
+ color: #DCA3A3;
79
+ }
80
+
81
+ pre .diff .deletion,
82
+ pre .string,
83
+ pre .tag .value,
84
+ pre .preprocessor,
85
+ pre .built_in,
86
+ pre .sql .aggregate,
87
+ pre .javadoc,
88
+ pre .smalltalk .class,
89
+ pre .smalltalk .localvars,
90
+ pre .smalltalk .array,
91
+ pre .css .rules .value,
92
+ pre .attr_selector,
93
+ pre .pseudo,
94
+ pre .apache .cbracket,
95
+ pre .tex .formula {
96
+ color: #CC9393;
97
+ }
98
+
99
+ pre .shebang,
100
+ pre .diff .addition,
101
+ pre .comment,
102
+ pre .java .annotation,
103
+ pre .template_comment,
104
+ pre .pi,
105
+ pre .doctype {
106
+ color: #7F9F7F;
107
+ }
108
+
109
+ pre .xml .css,
110
+ pre .xml .javascript,
111
+ pre .xml .vbscript,
112
+ pre .tex .formula {
113
+ opacity: 0.5;
114
+ }
115
+
@@ -3,6 +3,7 @@ html, body {
3
3
  }
4
4
 
5
5
  body {
6
+ min-width: 1000px;
6
7
  font: 12px/140% helvetica, arial, sans-serif;
7
8
  color: #333;
8
9
  background: #F3F4EB;
@@ -23,7 +24,9 @@ body {
23
24
  }
24
25
 
25
26
  .wrapper {
26
- margin: 0 20px;
27
+ width: 96%;
28
+ max-width: 1600px;
29
+ margin: 0 auto;
27
30
  position: relative;
28
31
  }
29
32
 
@@ -43,8 +46,7 @@ body {
43
46
  }
44
47
 
45
48
  .content {
46
- padding-bottom: 120px;
47
- padding-top: 20px;
49
+ padding: 20px 0;
48
50
  }
49
51
 
50
52
  .header {
@@ -118,13 +120,6 @@ body {
118
120
  background-color: #fefefe;
119
121
  box-shadow: 2px 2px 5px #e4e4e4 inset;
120
122
  background: rgb(255,255,255);
121
- background: -moz-linear-gradient(top, rgba(255,255,255,1) 1%, rgba(244,244,244,1) 49%, rgba(255,255,255,1) 100%);
122
- background: -webkit-gradient(linear, left top, left bottom, color-stop(1%,rgba(255,255,255,1)), color-stop(49%,rgba(244,244,244,1)), color-stop(100%,rgba(255,255,255,1)));
123
- background: -webkit-linear-gradient(top, rgba(255,255,255,1) 1%,rgba(244,244,244,1) 49%,rgba(255,255,255,1) 100%);
124
- background: -o-linear-gradient(top, rgba(255,255,255,1) 1%,rgba(244,244,244,1) 49%,rgba(255,255,255,1) 100%);
125
- background: -ms-linear-gradient(top, rgba(255,255,255,1) 1%,rgba(244,244,244,1) 49%,rgba(255,255,255,1) 100%);
126
- background: linear-gradient(top, rgba(255,255,255,1) 1%,rgba(244,244,244,1) 49%,rgba(255,255,255,1) 100%);
127
- filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#ffffff',GradientType=0 );
128
123
  min-height: 400px;
129
124
  }
130
125
 
@@ -176,6 +171,33 @@ body {
176
171
  margin-left: -110px;
177
172
  left: 50%;
178
173
  }
174
+
175
+ .stats {
176
+ position: relative;
177
+ width: 25%;
178
+ height: 50px;
179
+ color: #fff;
180
+ font-size: 11px;
181
+ line-height: 1.1;
182
+ text-shadow: 0 1px 0 rgba(0,0,0, 0.7);
183
+ background: rgb(119,73,43);
184
+ background: -moz-linear-gradient(top, rgba(119,73,43,1) 0%, rgba(89,54,32,1) 100%);
185
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(119,73,43,1)), color-stop(100%,rgba(89,54,32,1)));
186
+ background: -webkit-linear-gradient(top, rgba(119,73,43,1) 0%,rgba(89,54,32,1) 100%);
187
+ background: -o-linear-gradient(top, rgba(119,73,43,1) 0%,rgba(89,54,32,1) 100%);
188
+ background: -ms-linear-gradient(top, rgba(119,73,43,1) 0%,rgba(89,54,32,1) 100%);
189
+ background: linear-gradient(top, rgba(119,73,43,1) 0%,rgba(89,54,32,1) 100%);
190
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#77492b', endColorstr='#593620',GradientType=0 );
191
+
192
+ }
193
+
194
+ .stats strong {
195
+ display: inline-block;
196
+ width: 60px;
197
+ color: #e7c5a9;
198
+ }
199
+
200
+
179
201
  /*
180
202
  http://localhost:3000/mongodblogs/overview
181
203
  ./bin/mongodb_logger_web ../mongo.yml -F