mongodb_logger 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
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