timber 2.0.24 → 2.1.0.rc1
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 +4 -4
- data/.travis.yml +2 -2
- data/CHANGELOG +3 -0
- data/README.md +314 -59
- data/bin/timber +11 -2
- data/lib/timber.rb +2 -7
- data/lib/timber/cli.rb +16 -28
- data/lib/timber/cli/api.rb +80 -14
- data/lib/timber/cli/api/application.rb +30 -0
- data/lib/timber/cli/config_file.rb +66 -0
- data/lib/timber/cli/file_helper.rb +43 -0
- data/lib/timber/cli/installer.rb +58 -0
- data/lib/timber/cli/installers.rb +37 -0
- data/lib/timber/cli/installers/other.rb +47 -0
- data/lib/timber/cli/installers/rails.rb +255 -0
- data/lib/timber/cli/installers/root.rb +189 -0
- data/lib/timber/cli/io.rb +97 -0
- data/lib/timber/cli/io/ansi.rb +22 -0
- data/lib/timber/cli/io/messages.rb +213 -0
- data/lib/timber/cli/os_helper.rb +53 -0
- data/lib/timber/config.rb +97 -43
- data/lib/timber/config/integrations.rb +63 -0
- data/lib/timber/config/integrations/rack.rb +74 -0
- data/lib/timber/context.rb +13 -10
- data/lib/timber/contexts.rb +1 -0
- data/lib/timber/contexts/custom.rb +16 -3
- data/lib/timber/contexts/http.rb +10 -3
- data/lib/timber/contexts/organization.rb +4 -0
- data/lib/timber/contexts/release.rb +46 -0
- data/lib/timber/contexts/runtime.rb +7 -1
- data/lib/timber/contexts/session.rb +8 -1
- data/lib/timber/contexts/system.rb +5 -1
- data/lib/timber/contexts/user.rb +9 -2
- data/lib/timber/current_context.rb +43 -11
- data/lib/timber/events/controller_call.rb +4 -0
- data/lib/timber/events/custom.rb +13 -5
- data/lib/timber/events/exception.rb +4 -0
- data/lib/timber/events/http_client_request.rb +4 -0
- data/lib/timber/events/http_client_response.rb +4 -0
- data/lib/timber/events/http_server_request.rb +5 -0
- data/lib/timber/events/http_server_response.rb +15 -3
- data/lib/timber/events/sql_query.rb +3 -0
- data/lib/timber/events/template_render.rb +3 -0
- data/lib/timber/integration.rb +40 -0
- data/lib/timber/integrations.rb +21 -14
- data/lib/timber/integrations/action_controller.rb +18 -0
- data/lib/timber/integrations/action_controller/log_subscriber.rb +2 -0
- data/lib/timber/integrations/action_controller/log_subscriber/timber_log_subscriber.rb +6 -0
- data/lib/timber/integrations/action_dispatch.rb +23 -0
- data/lib/timber/integrations/action_dispatch/debug_exceptions.rb +2 -0
- data/lib/timber/integrations/action_view.rb +18 -0
- data/lib/timber/integrations/action_view/log_subscriber.rb +2 -0
- data/lib/timber/integrations/action_view/log_subscriber/timber_log_subscriber.rb +10 -0
- data/lib/timber/integrations/active_record.rb +18 -0
- data/lib/timber/integrations/active_record/log_subscriber.rb +2 -0
- data/lib/timber/integrations/active_record/log_subscriber/timber_log_subscriber.rb +8 -0
- data/lib/timber/integrations/rack.rb +12 -2
- data/lib/timber/integrations/rack/exception_event.rb +38 -5
- data/lib/timber/integrations/rack/http_context.rb +4 -6
- data/lib/timber/integrations/rack/http_events.rb +177 -27
- data/lib/timber/integrations/rack/middleware.rb +28 -0
- data/lib/timber/integrations/rack/session_context.rb +5 -6
- data/lib/timber/integrations/rack/user_context.rb +90 -43
- data/lib/timber/integrations/rails.rb +22 -0
- data/lib/timber/integrations/rails/rack_logger.rb +2 -0
- data/lib/timber/integrator.rb +18 -3
- data/lib/timber/log_devices/http.rb +107 -99
- data/lib/timber/log_devices/http/dropping_sized_queue.rb +26 -0
- data/lib/timber/log_devices/http/flushable_sized_queue.rb +42 -0
- data/lib/timber/log_entry.rb +14 -2
- data/lib/timber/logger.rb +51 -36
- data/lib/timber/overrides.rb +2 -0
- data/lib/timber/overrides/active_support_3_tagged_logging.rb +103 -0
- data/lib/timber/overrides/active_support_tagged_logging.rb +53 -90
- data/lib/timber/timer.rb +21 -0
- data/lib/timber/util/hash.rb +1 -1
- data/lib/timber/util/http_event.rb +16 -3
- data/lib/timber/version.rb +1 -1
- data/spec/support/timber.rb +2 -3
- data/spec/timber/cli/installers/rails_spec.rb +160 -0
- data/spec/timber/cli/installers/root_spec.rb +100 -0
- data/spec/timber/config_spec.rb +28 -0
- data/spec/timber/current_context_spec.rb +61 -12
- data/spec/timber/events/custom_spec.rb +13 -2
- data/spec/timber/events/exception_spec.rb +15 -0
- data/spec/timber/events/http_server_request_spec.rb +3 -3
- data/spec/timber/integrations/rack/http_events_spec.rb +101 -0
- data/spec/timber/log_devices/http_spec.rb +20 -4
- data/spec/timber/log_entry_spec.rb +2 -1
- data/spec/timber/logger_spec.rb +8 -8
- metadata +40 -9
- data/benchmarks/rails.rb +0 -122
- data/lib/timber/cli/application.rb +0 -28
- data/lib/timber/cli/install.rb +0 -196
- data/lib/timber/cli/io_helper.rb +0 -65
- data/lib/timber/cli/messages.rb +0 -180
- data/lib/timber/integrations/active_support/tagged_logging.rb +0 -71
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3db79522e2f956e63a0d0954deecd94ed23ed105
|
4
|
+
data.tar.gz: 745fcb202414db0fd5db648b906499aadf832665
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fcf7dcefee624791ceac83ed31d016b3429dcc261e51eddb3305f66038f1eb065c73388b6daedee06d0a89fd1ebea068941535b0f76e65967af1a40f9e1c60df
|
7
|
+
data.tar.gz: 4a2549874d1b67f31333665a37043bda838375c6043041221ae744b5e94d0e3669341ce78b3992b47f3b43b588aaced3e4315434bfd8369d710a6627d9433029
|
data/.travis.yml
CHANGED
@@ -5,7 +5,7 @@ rvm:
|
|
5
5
|
- 1.9.3
|
6
6
|
- 2.2.6
|
7
7
|
- 2.3.3
|
8
|
-
- 2.4.
|
8
|
+
- 2.4.1
|
9
9
|
- jruby
|
10
10
|
gemfile:
|
11
11
|
- gemfiles/rails-3.0.gemfile
|
@@ -36,7 +36,7 @@ matrix:
|
|
36
36
|
- rvm: "1.9.3"
|
37
37
|
gemfile: "gemfiles/rails-3.2.gemfile"
|
38
38
|
allow_failures:
|
39
|
-
- rvm: 2.4.
|
39
|
+
- rvm: 2.4.1
|
40
40
|
- rvm: jruby
|
41
41
|
gemfile: gemfiles/rails-5.0.gemfile
|
42
42
|
- rvm: jruby
|
data/CHANGELOG
ADDED
data/README.md
CHANGED
@@ -1,7 +1,8 @@
|
|
1
|
-
# 🌲 Timber -
|
1
|
+
# 🌲 Timber - Automatic Ruby Structured Logging
|
2
2
|
|
3
3
|
[](LICENSE.md)
|
4
|
-
[](https://travis-ci.org/timberio/timber-ruby)
|
5
|
+
[](https://travis-ci.org/timberio/timber-ruby)
|
5
6
|
[](https://codeclimate.com/github/timberio/timber-ruby)
|
6
7
|
[](http://www.rubydoc.info/github/timberio/timber-ruby)
|
7
8
|
|
@@ -13,62 +14,129 @@
|
|
13
14
|
|
14
15
|
## Overview
|
15
16
|
|
16
|
-
Timber
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
17
|
+
Timber solves ruby structured logging so you don't have to. Go from raw text logs to rich
|
18
|
+
structured events in seconds. Spend more time focusing on your app and less time
|
19
|
+
focusing on logging.
|
20
|
+
|
21
|
+
1. **Easy setup.** - `bundle exec timber install`, [get setup in seconds](#installation).
|
22
|
+
|
23
|
+
2. **Automatically structures yours logs.** - Third-party and in-app logs are all structured
|
24
|
+
in a consistent format. See [how it works](#how-it-works) below.
|
25
|
+
|
26
|
+
3. **Seamlessly integrates with popular libraries and frameworks.** - Rails, Rack, Devise,
|
27
|
+
Omniauth, etc. [Automatically captures user context, HTTP context, and event data.](#third-party-support)
|
28
|
+
|
29
|
+
4. **Pairs with a modern console.** - Designed specifically for this librariy, instantly
|
30
|
+
usable, zero configuration.
|
31
|
+
|
32
|
+
|
33
|
+
## Installation
|
34
|
+
|
35
|
+
1. In `Gemfile`, add the `timber` gem:
|
36
|
+
|
37
|
+
```ruby
|
38
|
+
gem 'timber', '~> 2.0'
|
39
|
+
```
|
40
|
+
|
41
|
+
2. In your `shell`, run `bundle install`
|
42
|
+
|
43
|
+
3. In your `shell`, run `bundle exec timber install`
|
22
44
|
|
23
45
|
|
24
46
|
## How it works
|
25
47
|
|
26
|
-
|
48
|
+
Let's start with an example. Timber turns this familiar raw text log line:
|
27
49
|
|
28
50
|
```
|
29
|
-
Sent 200 in 45.
|
51
|
+
Sent 200 in 45.2ms
|
30
52
|
```
|
31
53
|
|
32
54
|
Into a rich [`http_server_response` event](https://timber.io/docs/ruby/events-and-context/http-server-response-event/).
|
33
55
|
|
34
56
|
```
|
35
|
-
Sent 200 in 45.2ms @metadata {"dt": "2017-02-02T01:33:21.154345Z", "level": "info", "context": {"user": {"id": 1, "name": "Ben Johnson"}, "http": {"method": "GET", "host": "timber.io", "path": "/path", "request_id": "abcd1234"}}, "event": {"http_server_response": {"status": 200, "time_ms": 45.2}}}
|
57
|
+
Sent 200 in 45.2ms @metadata {"dt": "2017-02-02T01:33:21.154345Z", "level": "info", "context": {"user": {"id": 1, "name": "Ben Johnson"}, "http": {"method": "GET", "host": "timber.io", "path": "/path", "request_id": "abcd1234"}, "system": {"hostname": "1.server.com", "pid": "254354"}}, "event": {"http_server_response": {"status": 200, "time_ms": 45.2}}}
|
36
58
|
```
|
37
59
|
|
38
|
-
|
39
|
-
|
40
|
-
|
60
|
+
Notice that instead of completely replacing your log messages,
|
61
|
+
Timber _augments_ your logs with structured metadata. Turning them into
|
62
|
+
[rich events with context](https://timber.io/docs/ruby/events-and-context) without sacrificing
|
63
|
+
readability.
|
41
64
|
|
42
|
-
|
43
|
-
|
44
|
-
3. `type:http_server_response` - View specific events (exceptions, sql queries, etc)
|
45
|
-
4. `http_server_response.time_ms:>=1000` - View slow responses with the ability to zoom out and view them in context (request, user, etc).
|
46
|
-
5. `level:info` - Levels in your logs!
|
65
|
+
This is all accomplished by using the
|
66
|
+
[Timber::Logger](http://www.rubydoc.info/github/timberio/timber-ruby/Timber/Logger):
|
47
67
|
|
48
|
-
|
68
|
+
```ruby
|
69
|
+
logger = Timber::Logger.new(STDOUT)
|
70
|
+
logger.info("Sent 200 in 45.2ms")
|
71
|
+
```
|
49
72
|
|
73
|
+
Here's a better look at the metadata:
|
74
|
+
|
75
|
+
```json
|
76
|
+
{
|
77
|
+
"dt": "2017-02-02T01:33:21.154345Z",
|
78
|
+
"level": "info",
|
79
|
+
"context": {
|
80
|
+
"user": {
|
81
|
+
"id": 1,
|
82
|
+
"name": "Ben Johnson"
|
83
|
+
},
|
84
|
+
"http": {
|
85
|
+
"method": "GET",
|
86
|
+
"host": "timber.io",
|
87
|
+
"path": "/path",
|
88
|
+
"request_id": "abcd1234"
|
89
|
+
},
|
90
|
+
"system": {
|
91
|
+
"hostname": "1.server.com",
|
92
|
+
"pid": "254354"
|
93
|
+
}
|
94
|
+
},
|
95
|
+
"event": {
|
96
|
+
"http_server_response": {
|
97
|
+
"status": 200,
|
98
|
+
"time_ms": 45.2
|
99
|
+
}
|
100
|
+
}
|
101
|
+
}
|
102
|
+
```
|
50
103
|
|
51
|
-
|
104
|
+
This structure isn't arbitrary either, it follows the
|
105
|
+
[simple log event JSON schema](https://github.com/timberio/log-event-json-schema), which
|
106
|
+
formalizes the data structure, creates a contract with downstream consumers, and
|
107
|
+
improves stability.
|
52
108
|
|
53
|
-
|
109
|
+
So what can you do with this data?
|
54
110
|
|
55
|
-
|
56
|
-
|
57
|
-
|
111
|
+
1. [**Tail a user** - `user.id:1`](https://timber.io/docs/app/tutorials/tail-a-user/)
|
112
|
+
2. [**Trace a request** - `http.request_id:abcd1234`](https://timber.io/docs/app/tutorials/view-in-request-context/)
|
113
|
+
3. **Narrow by host** - `system.hostname:1.server.com`
|
114
|
+
4. **View slow responses** - `http_server_response.time_ms:>=1000`
|
115
|
+
5. **Filter by log level** - `level:error`
|
116
|
+
6. **Quickly find exceptions** - `is:exception`
|
58
117
|
|
59
|
-
|
118
|
+
For a complete overview, see the [Timber for Ruby docs](https://timber.io/docs/ruby/overview/).
|
60
119
|
|
61
|
-
|
120
|
+
|
121
|
+
## Third-party support
|
122
|
+
|
123
|
+
1. **Rails**: Structures ([HTTP requests](https://timber.io/docs/ruby/events-and-context/http-server-request-event/), [HTTP respones](https://timber.io/docs/ruby/events-and-context/http-server-response-event/), [controller calls](https://timber.io/docs/ruby/events-and-context/controller-call-event/), [template renders](https://timber.io/docs/ruby/events-and-context/template-render-event/), and [sql queries](https://timber.io/docs/ruby/events-and-context/sql-query-event/)).
|
124
|
+
2. **Rack**: Structures [exceptions](https://timber.io/docs/ruby/events-and-context/exception-event/), captures [HTTP context](https://timber.io/docs/ruby/events-and-context/http-context/), captures [user context](https://timber.io/docs/ruby/events-and-context/user-context/), captures [session context](https://timber.io/docs/ruby/events-and-context/session-context/).
|
125
|
+
3. **Devise, Omniauth, Clearance**: captures [user context](https://timber.io/docs/ruby/events-and-context/user-context/)
|
126
|
+
5. **Heroku**: Captures [release context](https://timber.io/docs/ruby/events-and-context/release-context/) via [Heroku dyno metadata](https://devcenter.heroku.com/articles/dyno-metadata).
|
127
|
+
|
128
|
+
...and more. Timber will continue to evolve and support more libraries.
|
62
129
|
|
63
130
|
|
64
131
|
## Usage
|
65
132
|
|
66
133
|
<details><summary><strong>Basic logging</strong></summary><p>
|
67
134
|
|
68
|
-
Use `Logger`
|
135
|
+
Use the `Timber::Logger` just like you would `::Logger`:
|
69
136
|
|
70
137
|
```ruby
|
71
|
-
logger.
|
138
|
+
logger = Timber::Logger.new(STDOUT)
|
139
|
+
logger.info("My log message") # use warn, error, debug, etc.
|
72
140
|
|
73
141
|
# => My log message @metadata {"level": "info", "context": {...}}
|
74
142
|
```
|
@@ -83,6 +151,7 @@ Custom events allow you to extend beyond events already defined in
|
|
83
151
|
the [`Timber::Events`](lib/timber/events) namespace.
|
84
152
|
|
85
153
|
```ruby
|
154
|
+
logger = Timber::Logger.new(STDOUT)
|
86
155
|
logger.warn "Payment rejected", payment_rejected: {customer_id: "abcd1234", amount: 100, reason: "Card expired"}
|
87
156
|
|
88
157
|
# => Payment rejected @metadata {"level": "warn", "event": {"payment_rejected": {"customer_id": "abcd1234", "amount": 100, "reason": "Card expired"}}, "context": {...}}
|
@@ -99,10 +168,12 @@ logger.warn "Payment rejected", payment_rejected: {customer_id: "abcd1234", amou
|
|
99
168
|
<details><summary><strong>Custom contexts</strong></summary><p>
|
100
169
|
|
101
170
|
Context is additional data shared across log lines. Think of it like log join data.
|
171
|
+
This is how a query like `context.user.id:1` can show you all logs generated by that user.
|
102
172
|
Custom contexts allow you to extend beyond contexts already defined in
|
103
173
|
the [`Timber::Contexts`](lib/timber/contexts) namespace.
|
104
174
|
|
105
175
|
```ruby
|
176
|
+
logger = Timber::Logger.new(STDOUT)
|
106
177
|
logger.with_context(build: {version: "1.0.0"}) do
|
107
178
|
logger.info("My log message")
|
108
179
|
end
|
@@ -114,26 +185,229 @@ end
|
|
114
185
|
* In the [Timber console](https://app.timber.io) use queries like: `build.version:1.0.0`
|
115
186
|
* See more details on our [custom contexts docs page](https://timber.io/docs/ruby/custom-contexts/)
|
116
187
|
|
188
|
+
---
|
189
|
+
|
190
|
+
</p></details>
|
191
|
+
|
192
|
+
<details><summary><strong>Metrics & Timings</strong></summary><p>
|
193
|
+
|
194
|
+
Aggregates destroy details, and with Timber capturing metrics and timings is just logging events.
|
195
|
+
Timber is built on modern big-data principles, it can calculate aggregates across terrabytes of
|
196
|
+
data in seconds. Don't reduce the quality of your data because the system processing
|
197
|
+
your data is limited.
|
198
|
+
|
199
|
+
Here's a timing example. Notice how Timber automatically calculates the time and adds the timing
|
200
|
+
to the message.
|
201
|
+
|
202
|
+
```ruby
|
203
|
+
logger = Timber::Logger.new(STDOUT)
|
204
|
+
timer = Timber::Timer.start
|
205
|
+
# ... code to time ...
|
206
|
+
logger.info("Processed background job", background_job: {time_ms: timer})
|
207
|
+
|
208
|
+
# => Processed background job in 54.2ms @metadata {"level": "info", "event": {"background_job": {"time_ms": 54.2}}}
|
209
|
+
```
|
210
|
+
|
211
|
+
Or capture any metric you want:
|
212
|
+
|
213
|
+
```ruby
|
214
|
+
logger = Timber::Logger.new(STDOUT)
|
215
|
+
logger.info("Credit card charged", credit_card_charge: {amount: 123.23})
|
216
|
+
|
217
|
+
# => Credit card charged @metadata {"level": "info", "event": {"credit_card_charge": {"amount": 123.23}}}
|
218
|
+
```
|
219
|
+
|
220
|
+
In Timber you can easily sum, average, min, and max the `amount` attribute across any interval
|
221
|
+
you desire.
|
222
|
+
|
223
|
+
</p></details>
|
224
|
+
|
225
|
+
|
226
|
+
## Configuration
|
227
|
+
|
228
|
+
Below are a few popular configuration options, for a comprehensive list, see
|
229
|
+
[Timber::Config](http://www.rubydoc.info/github/timberio/timber-ruby/Timber/Config).
|
230
|
+
|
231
|
+
<details><summary><strong>Logrageify. Silence noisy logs (sql query, template renders)</strong></summary><p>
|
232
|
+
|
233
|
+
Timber allows you to silence noisy logs that aren't of value to you, just like
|
234
|
+
[lograge](https://github.com/roidrage/lograge). In fact, we've provided a convenience method
|
235
|
+
for anyone transitioning from lograge:
|
236
|
+
|
237
|
+
```ruby
|
238
|
+
# config/initializers/timber.rb
|
239
|
+
|
240
|
+
config = Timber::Config.instance
|
241
|
+
config.logrageify!()
|
242
|
+
```
|
243
|
+
|
244
|
+
It turns this:
|
245
|
+
|
246
|
+
```
|
247
|
+
Started GET "/" for 127.0.0.1 at 2012-03-10 14:28:14 +0100
|
248
|
+
Processing by HomeController#index as HTML
|
249
|
+
Rendered text template within layouts/application (0.0ms)
|
250
|
+
Rendered layouts/_assets.html.erb (2.0ms)
|
251
|
+
Rendered layouts/_top.html.erb (2.6ms)
|
252
|
+
Rendered layouts/_about.html.erb (0.3ms)
|
253
|
+
Rendered layouts/_google_analytics.html.erb (0.4ms)
|
254
|
+
Completed 200 OK in 79ms (Views: 78.8ms | ActiveRecord: 0.0ms)
|
255
|
+
```
|
256
|
+
|
257
|
+
Into this:
|
258
|
+
|
259
|
+
```
|
260
|
+
Get "/" sent 200 OK in 79ms @metadata {...}
|
261
|
+
```
|
262
|
+
|
263
|
+
Internally this is equivalent to:
|
264
|
+
|
265
|
+
```ruby
|
266
|
+
# config/initializers/timber.rb
|
267
|
+
|
268
|
+
config = Timber::Config.instance
|
269
|
+
config.integrations.action_controller.silence = true
|
270
|
+
config.integrations.action_view.silence = true
|
271
|
+
config.integrations.active_record.silence = true
|
272
|
+
config.integrations.rack.http_events.collapse_into_single_event = true
|
273
|
+
```
|
274
|
+
|
275
|
+
Feel free to deviate and customize which logs you silence. We recommend a slight deviation
|
276
|
+
from lograge with the following settings:
|
277
|
+
|
278
|
+
```ruby
|
279
|
+
# config/initializers/timber.rb
|
280
|
+
|
281
|
+
config = Timber::Config.instance
|
282
|
+
config.integrations.action_view.silence = true
|
283
|
+
config.integrations.active_record.silence = true
|
284
|
+
config.integrations.rack.http_events.collapse_into_single_event = true
|
285
|
+
```
|
286
|
+
|
287
|
+
This does _not_ silence the controller call log event. This is because Timber captures the
|
288
|
+
parameters passed to the controller, which is very valuable when debugging.
|
289
|
+
|
290
|
+
For a full list of integrations and settings, see
|
291
|
+
[Timber::Integrations](http://www.rubydoc.info/github/timberio/timber-ruby/Timber/Integrations)
|
292
|
+
|
293
|
+
---
|
294
|
+
|
117
295
|
</p></details>
|
118
296
|
|
119
|
-
<details><summary><strong>
|
297
|
+
<details><summary><strong>Silence specific requests (LB health checks, etc)</strong></summary><p>
|
298
|
+
|
299
|
+
The following will silence all `[GET] /_health` requests:
|
300
|
+
|
301
|
+
```ruby
|
302
|
+
# config/initializers/timber.rb
|
303
|
+
|
304
|
+
config = Timber::Config.instance
|
305
|
+
config.integrations.rack.http_events.silence_request = lambda do |rack_env, rack_request|
|
306
|
+
rack_request.path == "/_health"
|
307
|
+
end
|
308
|
+
```
|
309
|
+
|
310
|
+
We require a block because it gives you complete control over how you want to silence requests.
|
311
|
+
The first parameter being the traditional Rack env hash, the second being a
|
312
|
+
[Rack Request](http://www.rubydoc.info/gems/rack/Rack/Request) object.
|
120
313
|
|
121
|
-
|
122
|
-
|
123
|
-
|
314
|
+
---
|
315
|
+
|
316
|
+
</p></details>
|
317
|
+
|
318
|
+
<details><summary><strong>Change log formats</strong></summary><p>
|
319
|
+
|
320
|
+
Simply set the formatter like you would with any other logger:
|
321
|
+
|
322
|
+
```ruby
|
323
|
+
# This is set in your various environment files
|
324
|
+
logger = Timber::Logger.new(STDOUT)
|
325
|
+
logger.formatter = Timber::Logger::JSONFormatter.new
|
326
|
+
```
|
327
|
+
|
328
|
+
Your options are:
|
329
|
+
|
330
|
+
1. [`Timber::Logger::AugmentedFormatter`](http://www.rubydoc.info/github/timberio/timber-ruby/Timber/Logger/AugmentedFormatter) -
|
331
|
+
(default) A human readable format that _appends_ metadata to the original log line.
|
332
|
+
Ex: `My log message @metadata {"level":"info","dt":"2017-01-01T01:02:23.234321Z"}`
|
333
|
+
|
334
|
+
2. [`Timber::Logger::JSONFormatter`](http://www.rubydoc.info/github/timberio/timber-ruby/Timber/Logger/JSONFormatter) -
|
335
|
+
Ex: `{"level":"info","message":"My log message","dt":"2017-01-01T01:02:23.234321Z"}`
|
336
|
+
|
337
|
+
3. [`Timber::Logger::MessageOnlyFormatter`](http://www.rubydoc.info/github/timberio/timber-ruby/Timber/Logger/MessageOnlyFormatter) -
|
338
|
+
For use in development / test. Prints logs as strings with no metadata attached.
|
339
|
+
Ex: `My log message`
|
340
|
+
|
341
|
+
---
|
342
|
+
|
343
|
+
</p></details>
|
344
|
+
|
345
|
+
<details><summary><strong>Capture custom user context</strong></summary><p>
|
346
|
+
|
347
|
+
By default Timber automatically captures user context for most of the popular authentication
|
348
|
+
libraries (Devise, Omniauth, and Clearance). See
|
349
|
+
[Timber::Integrations::Rack::UserContext](http://www.rubydoc.info/github/timberio/timber-ruby/Timber/Integrations/Rack/UserContext)
|
350
|
+
for a complete list.
|
351
|
+
|
352
|
+
In cases where you Timber doesn't support your strategy, or you want to customize it further,
|
353
|
+
you can do so like:
|
354
|
+
|
355
|
+
```ruby
|
356
|
+
# config/initializers/timber.rb
|
357
|
+
|
358
|
+
config = Timber::Config.instance
|
359
|
+
config.integrations.rack.user_context.custom_user_hash = lambda do |rack_env|
|
360
|
+
user = rack_env['warden'].user
|
361
|
+
if user
|
362
|
+
{
|
363
|
+
id: user.id, # unique identifier for the user, can be an integer or string,
|
364
|
+
name: user.name, # identifiable name for the user,
|
365
|
+
email: user.email, # user's email address
|
366
|
+
}
|
367
|
+
else
|
368
|
+
nil
|
369
|
+
end
|
370
|
+
end
|
371
|
+
```
|
372
|
+
|
373
|
+
*All* of the user hash keys are optional, but you must provide at least one.
|
374
|
+
|
375
|
+
---
|
376
|
+
|
377
|
+
</p></details>
|
378
|
+
|
379
|
+
<details><summary><strong>Capture release / deploy context</strong></summary><p>
|
380
|
+
|
381
|
+
[Timber::Contexts::Release](http://www.rubydoc.info/github/timberio/timber-ruby/Timber/Contexts/Release)
|
382
|
+
tracks the current application release and version. If you are on Heroku, simply enable the
|
383
|
+
[dyno metadata](https://devcenter.heroku.com/articles/dyno-metadata) feature to get this
|
384
|
+
automatically. If you are not, simply add the follow environment variables to have the context
|
385
|
+
set automatically.
|
386
|
+
|
387
|
+
1. `RELEASE_COMMIT` - `2c3a0b24069af49b3de35b8e8c26765c1dba9ff0`
|
388
|
+
2. `RELEASE_CREATED_AT` - `2015-04-02T18:00:42Z`
|
389
|
+
3. `RELEASE_VERSION` - `v2.3.1`
|
390
|
+
|
391
|
+
---
|
124
392
|
|
125
393
|
</p></details>
|
126
394
|
|
127
395
|
|
128
396
|
## Jibber-Jabber
|
129
397
|
|
130
|
-
<details><summary><strong>Which
|
398
|
+
<details><summary><strong>Which events and context does Timber capture for me?</strong></summary><p>
|
131
399
|
|
132
|
-
Out of the box you get everything in the
|
400
|
+
Out of the box you get everything in the
|
401
|
+
[`Timber::Events`](http://www.rubydoc.info/github/timberio/timber-ruby/Timber/Events) namespace.
|
133
402
|
|
134
|
-
We also add context to every log, everything in the
|
403
|
+
We also add context to every log, everything in the
|
404
|
+
[`Timber::Contexts`](http://www.rubydoc.info/github/timberio/timber-ruby/Timber/Contexts)
|
135
405
|
namespace. Context is structured data representing the current environment when the log line
|
136
|
-
was written. It is included in every log line. Think of it like join data for your logs.
|
406
|
+
was written. It is included in every log line. Think of it like join data for your logs. It's
|
407
|
+
how Timber is able to accomplished tailing users (`context.user.id:1`).
|
408
|
+
|
409
|
+
Lastly, you can checkout the specific integrations in
|
410
|
+
[`Timber::Integrations`](lib/timber/integrations).
|
137
411
|
|
138
412
|
---
|
139
413
|
|
@@ -141,32 +415,13 @@ was written. It is included in every log line. Think of it like join data for yo
|
|
141
415
|
|
142
416
|
<details><summary><strong>What about my current log statements?</strong></summary><p>
|
143
417
|
|
144
|
-
They'll continue to work as expected. Timber adheres to the default
|
145
|
-
Your previous logger calls will work as they always do.
|
418
|
+
They'll continue to work as expected. Timber adheres to the default `::Logger` interface.
|
419
|
+
Your previous logger calls will work as they always do. Just swap in `Timber::Logger` and
|
420
|
+
you're good to go.
|
146
421
|
|
147
422
|
In fact, traditional log statements for non-meaningful events, debug statements, etc, are
|
148
423
|
encouraged. In cases where the data is meaningful, consider [logging a custom event](#usage).
|
149
424
|
|
150
|
-
</p></details>
|
151
|
-
|
152
|
-
<details><summary><strong>How is Timber different?</strong></summary><p>
|
153
|
-
|
154
|
-
1. **It's just _better_ logging**. Nothing beats well structured raw data. And that's exactly
|
155
|
-
what Timber aims to provide. There are no agents, special APIs, or proprietary data
|
156
|
-
sets that you can't access.
|
157
|
-
2. **Improved log data quality.** Instead of relying on parsing alone, Timber ships libraries that
|
158
|
-
structure and augment your logs from _within_ your application. Improving your log data at the
|
159
|
-
source.
|
160
|
-
3. **Human readability.** Timber _augments_ your logs without sacrificing human readability. For
|
161
|
-
example: `log message @metadata {...}`. And when you view your logs in the
|
162
|
-
[Timber console](https://app.timber.io), you'll see the human friendly messages
|
163
|
-
with the ability to view the associated metadata.
|
164
|
-
4. **Long retention**. Logging is notoriously expensive with low retention. Timber
|
165
|
-
offers _6 months_ of retention by default with sane prices.
|
166
|
-
5. **Normalized schema.** Have multiple apps? All of Timber's libraries adhere to our
|
167
|
-
[JSON schema](https://github.com/timberio/log-event-json-schema). This means queries, alerts,
|
168
|
-
and graphs for your ruby app can also be applied to your elixir app (for example).
|
169
|
-
|
170
425
|
---
|
171
426
|
|
172
427
|
</p></details>
|