timber 2.1.3 → 2.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +97 -120
- data/lib/timber/contexts/user.rb +4 -2
- data/lib/timber/log_entry.rb +1 -1
- data/lib/timber/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8abcf84c32b728be216520c831ea391b2d8d4aff
|
4
|
+
data.tar.gz: bd66dceece6b234a4de867656eeaeebeb5c9a7a5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 71850c881fe047e8e80f850010f99989b0206be96087cbf15ff84adb09b6d9780b062ba492e65c2fffd659bd2d013c12f6e2b829c60847d0e750ae56f9d6268d
|
7
|
+
data.tar.gz: 27c4421fcfa563a47d6d92911effde2472a3e48b4ba5da9b7def6ee3fa031f1bcc2d3a9cd54da88a3aa13db1f0a19e5556eb6d5c84fba4394aa62f28ab353c54
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# 🌲 Timber -
|
1
|
+
# 🌲 Timber - Great Ruby Logging Made Easy
|
2
2
|
|
3
3
|
[![ISC License](https://img.shields.io/badge/license-ISC-ff69b4.svg)](LICENSE.md)
|
4
4
|
[![Yard Docs](http://img.shields.io/badge/yard-docs-blue.svg)](http://www.rubydoc.info/github/timberio/timber-ruby)
|
@@ -6,14 +6,15 @@
|
|
6
6
|
|
7
7
|
## Overview
|
8
8
|
|
9
|
-
Timber for Ruby is
|
10
|
-
|
11
|
-
|
12
|
-
[Timber console](#the-timber-console), Timber will
|
9
|
+
Timber for Ruby is a drop-in upgrade for your Ruby logs that unobtrusively
|
10
|
+
[structures your logs through augmentation](https://timber.io/docs/concepts/structuring-through-augmentation).
|
11
|
+
It's clean structured logging without the effort. When paired with the
|
12
|
+
[Timber console](#the-timber-console), Timber will
|
13
|
+
[fundamentally change the way you use your logs](#do-amazing-things-with-your-logs).
|
13
14
|
|
14
15
|
1. [**Easy setup** - `bundle exec timber install`](#installation)
|
15
|
-
2. [**Seamlessly integrates with popular libraries and frameworks**](#
|
16
|
-
3. [**
|
16
|
+
2. [**Seamlessly integrates with popular libraries and frameworks**](#integrations)
|
17
|
+
3. [**Do amazing things with your Ruby logs**](#do-amazing-things-with-your-logs)
|
17
18
|
|
18
19
|
|
19
20
|
## Installation
|
@@ -36,29 +37,39 @@ your logs into rich, useful, readable events. When paired with the
|
|
36
37
|
Use the `Timber::Logger` just like you would `::Logger`:
|
37
38
|
|
38
39
|
```ruby
|
39
|
-
logger.
|
40
|
-
|
41
|
-
|
40
|
+
logger.debug("Debug message")
|
41
|
+
logger.info("Info message")
|
42
|
+
logger.warn("Warn message")
|
43
|
+
logger.error("Error message")
|
44
|
+
logger.fatal("Fatal message")
|
42
45
|
```
|
43
46
|
|
47
|
+
We encourage standard / traditional log messages for non-meaningful events. And because Timber
|
48
|
+
[augments](https://timber.io/docs/concepts/structuring-through-augmentation) your logs with
|
49
|
+
metadata, you don't have to worry about making every log structured!
|
50
|
+
|
44
51
|
---
|
45
52
|
|
46
53
|
</p></details>
|
47
54
|
|
48
55
|
<details><summary><strong>Custom events</strong></summary><p>
|
49
56
|
|
50
|
-
Custom events allow you to extend beyond events already defined in
|
51
|
-
|
57
|
+
Custom events allow you to extend beyond events already defined in the
|
58
|
+
[`Timber::Events`](http://www.rubydoc.info/github/timberio/timber-ruby/Timber/Events) namespace.
|
59
|
+
If you aren't sure what an event is, please read the
|
60
|
+
["Metdata, Context, and Events" doc](https://timber.io/docs/concepts/metadata-context-and-events).
|
61
|
+
|
62
|
+
### How to use it
|
52
63
|
|
53
64
|
```ruby
|
54
65
|
logger.warn "Payment rejected", payment_rejected: {customer_id: "abcd1234", amount: 100, reason: "Card expired"}
|
55
|
-
|
56
|
-
# => Payment rejected @metadata {"level": "warn", "event": {"payment_rejected": {"customer_id": "abcd1234", "amount": 100, "reason": "Card expired"}}, "context": {...}}
|
57
66
|
```
|
58
67
|
|
59
|
-
|
60
|
-
|
61
|
-
|
68
|
+
1. [Search it](https://timber.io/docs/app/console/searching) with queries like: `type:payment_rejected` or `payment_rejected.amount:>100`
|
69
|
+
2. [Alert on it](https://timber.io/docs/app/console/alerts) with threshold based alerts
|
70
|
+
3. [Graph & visualize it](https://timber.io/docs/app/console/graphing)
|
71
|
+
4. [View this event's data and context](https://timber.io/docs/app/console/view-metdata-and-context)
|
72
|
+
5. ...read more in our [docs](https://timber.io/docs/languages/ruby/usage/custom-events)
|
62
73
|
|
63
74
|
---
|
64
75
|
|
@@ -66,22 +77,22 @@ logger.warn "Payment rejected", payment_rejected: {customer_id: "abcd1234", amou
|
|
66
77
|
|
67
78
|
<details><summary><strong>Custom contexts</strong></summary><p>
|
68
79
|
|
69
|
-
Context is additional data shared across log lines. Think of it like log join data.
|
70
|
-
This is how a query like `context.user.id:1` can show you all logs generated by that user.
|
71
80
|
Custom contexts allow you to extend beyond contexts already defined in
|
72
|
-
the [`Timber::Contexts`](
|
81
|
+
the [`Timber::Contexts`](http://www.rubydoc.info/github/timberio/timber-ruby/Timber/Contexts)
|
82
|
+
namespace. If you aren't sure what context is, please read the
|
83
|
+
["Metdata, Context, and Events" doc](https://timber.io/docs/concepts/metadata-context-and-events).
|
84
|
+
|
85
|
+
### How to use it
|
73
86
|
|
74
87
|
```ruby
|
75
88
|
logger.with_context(build: {version: "1.0.0"}) do
|
76
89
|
logger.info("My log message")
|
77
90
|
end
|
78
|
-
|
79
|
-
# => My log message @metadata {"level": "info", "context": {"build": {"version": "1.0.0"}}}
|
80
91
|
```
|
81
92
|
|
82
|
-
|
83
|
-
|
84
|
-
|
93
|
+
1. [Search it](https://timber.io/docs/app/console/searching) with queries like: `build.version:1.0.0`
|
94
|
+
2. [View this context when viewing a log's metadata](https://timber.io/docs/app/console/view-metdata-and-context)
|
95
|
+
3. ...read more in our [docs](https://timber.io/docs/languages/ruby/usage/custom-context)
|
85
96
|
|
86
97
|
---
|
87
98
|
|
@@ -89,20 +100,21 @@ end
|
|
89
100
|
|
90
101
|
<details><summary><strong>Metrics & Timings</strong></summary><p>
|
91
102
|
|
92
|
-
Aggregates destroy details,
|
93
|
-
|
94
|
-
data
|
95
|
-
|
103
|
+
Aggregates destroy details, events tell stories. With Timber, logging metrics and timings is simply
|
104
|
+
[logging an event](https://timber.io/docs/languages/ruby/usage/custom-events). Timber is based on
|
105
|
+
modern big-data principles and can aggregate inordinately large data sets in seconds. Logging
|
106
|
+
events (raw data as it exists), gives you the flexibility in the future to segment and aggregate
|
107
|
+
your data any way you see fit. This is superior to choosing specific paradigms before hand, when
|
108
|
+
you are unsure how you'll need to use your data in the future.
|
109
|
+
|
110
|
+
### How to use it
|
96
111
|
|
97
|
-
|
98
|
-
to the message.
|
112
|
+
Below is a contrived example of timing a background job:
|
99
113
|
|
100
114
|
```ruby
|
101
115
|
timer = Timber::Timer.start
|
102
116
|
# ... code to time ...
|
103
117
|
logger.info("Processed background job", background_job: {time_ms: timer})
|
104
|
-
|
105
|
-
# => Processed background job in 54.2ms @metadata {"level": "info", "event": {"background_job": {"time_ms": 54.2}}}
|
106
118
|
```
|
107
119
|
|
108
120
|
And of course, `time_ms` can also take a `Float` or `Fixnum`:
|
@@ -115,12 +127,13 @@ Lastly, metrics aren't limited to timings. You can capture any metric you want:
|
|
115
127
|
|
116
128
|
```ruby
|
117
129
|
logger.info("Credit card charged", credit_card_charge: {amount: 123.23})
|
118
|
-
|
119
|
-
# => Credit card charged @metadata {"level": "info", "event": {"credit_card_charge": {"amount": 123.23}}}
|
120
130
|
```
|
121
131
|
|
122
|
-
|
123
|
-
|
132
|
+
1. [Search it](https://timber.io/docs/app/console/searching) with queries like: `background_job.time_ms:>500`
|
133
|
+
2. [Alert on it](https://timber.io/docs/app/console/alerts) with threshold based alerts
|
134
|
+
3. [View this log's metadata in the console](https://timber.io/docs/app/console/view-metdata-and-context)
|
135
|
+
4. ...read more in our [docs](https://timber.io/docs/languages/ruby/usage/metrics-and-timings)
|
136
|
+
|
124
137
|
|
125
138
|
</p></details>
|
126
139
|
|
@@ -130,11 +143,13 @@ you desire.
|
|
130
143
|
Below are a few popular configuration options, for a comprehensive list, see
|
131
144
|
[Timber::Config](http://www.rubydoc.info/github/timberio/timber-ruby/Timber/Config).
|
132
145
|
|
133
|
-
<details><summary><strong>Logrageify. Silence noisy logs
|
146
|
+
<details><summary><strong>Logrageify. Silence noisy logs.</strong></summary><p>
|
134
147
|
|
135
148
|
Timber allows you to silence noisy logs that aren't of value to you, just like
|
136
|
-
[lograge](https://github.com/roidrage/lograge).
|
137
|
-
for anyone transitioning from lograge
|
149
|
+
[lograge](https://github.com/roidrage/lograge). As such, we've provided a convenience configuration
|
150
|
+
option for anyone transitioning from lograge.
|
151
|
+
|
152
|
+
### How to use it
|
138
153
|
|
139
154
|
```ruby
|
140
155
|
# config/initializers/timber.rb
|
@@ -143,6 +158,8 @@ config = Timber::Config.instance
|
|
143
158
|
config.logrageify!()
|
144
159
|
```
|
145
160
|
|
161
|
+
## How it works
|
162
|
+
|
146
163
|
It turns this:
|
147
164
|
|
148
165
|
```
|
@@ -174,6 +191,8 @@ config.integrations.active_record.silence = true
|
|
174
191
|
config.integrations.rack.http_events.collapse_into_single_event = true
|
175
192
|
```
|
176
193
|
|
194
|
+
### Pro-tip: Keep controller call logs (recommended)
|
195
|
+
|
177
196
|
Feel free to deviate and customize which logs you silence. We recommend a slight deviation
|
178
197
|
from lograge with the following settings:
|
179
198
|
|
@@ -198,6 +217,11 @@ For a full list of integration settings, see
|
|
198
217
|
|
199
218
|
<details><summary><strong>Silence specific requests (LB health checks, etc)</strong></summary><p>
|
200
219
|
|
220
|
+
Silencing noisy requests can be helpful for silencing load balance health checks, bot scanning,
|
221
|
+
or activity that generally is not meaningful to you.
|
222
|
+
|
223
|
+
### How to use it
|
224
|
+
|
201
225
|
The following will silence all `[GET] /_health` requests:
|
202
226
|
|
203
227
|
```ruby
|
@@ -217,33 +241,6 @@ The first parameter being the traditional Rack env hash, the second being a
|
|
217
241
|
|
218
242
|
</p></details>
|
219
243
|
|
220
|
-
<details><summary><strong>Change log formats</strong></summary><p>
|
221
|
-
|
222
|
-
Simply set the formatter like you would with any other logger:
|
223
|
-
|
224
|
-
```ruby
|
225
|
-
# This is set in your various environment files
|
226
|
-
logger.formatter = Timber::Logger::JSONFormatter.new
|
227
|
-
```
|
228
|
-
|
229
|
-
Your options are:
|
230
|
-
|
231
|
-
1. [`Timber::Logger::AugmentedFormatter`](http://www.rubydoc.info/github/timberio/timber-ruby/Timber/Logger/AugmentedFormatter) -
|
232
|
-
(default) A human readable format that _appends_ metadata to the original log line. The Timber
|
233
|
-
service can parse this data appropriately.
|
234
|
-
Ex: `My log message @metadata {"level":"info","dt":"2017-01-01T01:02:23.234321Z"}`
|
235
|
-
|
236
|
-
2. [`Timber::Logger::JSONFormatter`](http://www.rubydoc.info/github/timberio/timber-ruby/Timber/Logger/JSONFormatter) -
|
237
|
-
Ex: `{"level":"info","message":"My log message","dt":"2017-01-01T01:02:23.234321Z"}`
|
238
|
-
|
239
|
-
3. [`Timber::Logger::MessageOnlyFormatter`](http://www.rubydoc.info/github/timberio/timber-ruby/Timber/Logger/MessageOnlyFormatter) -
|
240
|
-
For use in development / test. Prints logs as strings with no metadata attached.
|
241
|
-
Ex: `My log message`
|
242
|
-
|
243
|
-
---
|
244
|
-
|
245
|
-
</p></details>
|
246
|
-
|
247
244
|
<details><summary><strong>Capture custom user context</strong></summary><p>
|
248
245
|
|
249
246
|
By default Timber automatically captures user context for most of the popular authentication
|
@@ -251,6 +248,8 @@ libraries (Devise, Omniauth, and Clearance). See
|
|
251
248
|
[Timber::Integrations::Rack::UserContext](http://www.rubydoc.info/github/timberio/timber-ruby/Timber/Integrations/Rack/UserContext)
|
252
249
|
for a complete list.
|
253
250
|
|
251
|
+
### How to use it
|
252
|
+
|
254
253
|
In cases where you Timber doesn't support your strategy, or you want to customize it further,
|
255
254
|
you can do so like:
|
256
255
|
|
@@ -281,7 +280,11 @@ end
|
|
281
280
|
<details><summary><strong>Capture release / deploy context</strong></summary><p>
|
282
281
|
|
283
282
|
[Timber::Contexts::Release](http://www.rubydoc.info/github/timberio/timber-ruby/Timber/Contexts/Release)
|
284
|
-
tracks the current application release and version.
|
283
|
+
tracks the current application release and version.
|
284
|
+
|
285
|
+
### How to use it
|
286
|
+
|
287
|
+
If you're on Heroku, simply enable the
|
285
288
|
[dyno metadata](https://devcenter.heroku.com/articles/dyno-metadata) feature. If you are not,
|
286
289
|
set the following environment variables and this context will be added automatically:
|
287
290
|
|
@@ -296,70 +299,44 @@ All variables are optional, but at least one must be present.
|
|
296
299
|
</p></details>
|
297
300
|
|
298
301
|
|
299
|
-
##
|
300
|
-
|
301
|
-
<details><summary><strong>Which log events does Timber structure for me?</strong></summary><p>
|
302
|
-
|
303
|
-
Out of the box you get everything in the [`Timber.Events`](lib/timber/events) namespace.
|
304
|
-
|
305
|
-
We also add context to every log, everything in the [`Timber.Contexts`](lib/timber/contexts)
|
306
|
-
namespace. Context is structured data representing the current environment when the log line
|
307
|
-
was written. It is included in every log line. Think of it like join data for your logs.
|
308
|
-
|
309
|
-
---
|
310
|
-
|
311
|
-
</p></details>
|
312
|
-
|
313
|
-
<details><summary><strong>What about my current log statements?</strong></summary><p>
|
314
|
-
|
315
|
-
They'll continue to work as expected. Timber adheres strictly to the default `Logger` interface
|
316
|
-
and will never deviate in *any* way.
|
302
|
+
## Integrations
|
317
303
|
|
318
|
-
|
319
|
-
|
304
|
+
[Timber for Ruby](https://github.com/timberio/timber-ruby) extends beyond your basic logging
|
305
|
+
functionality and integrates with popular libraries and frameworks. This makes structured quality
|
306
|
+
logging effortless. Below is a list of integrations we offer and the various events and contexts
|
307
|
+
they create.
|
320
308
|
|
321
|
-
|
309
|
+
1. [**Rails**](https://timber.io/docs/languages/ruby/integrations/rails)
|
310
|
+
2. [**Rack**](https://timber.io/docs/languages/ruby/integrations/rack)
|
311
|
+
3. [**Heroku**](https://timber.io/docs/languages/ruby/integrations/heroku)
|
312
|
+
4. [**Devise**](https://timber.io/docs/languages/ruby/integrations/devise)
|
313
|
+
5. [**Clearance**](https://timber.io/docs/languages/ruby/integrations/clearnace)
|
314
|
+
6. [**Omniauth**](https://timber.io/docs/languages/ruby/integrations/omniauth)
|
315
|
+
7. [**Warden**](https://timber.io/docs/languages/ruby/integrations/devise)
|
316
|
+
8. ...more coming soon! Make a request by [opening an issue](https://github.com/timberio/timber-ruby/issues/new)
|
322
317
|
|
323
|
-
<details><summary><strong>When to use metadata or events?</strong></summary><p>
|
324
318
|
|
325
|
-
|
326
|
-
data to your logs. And anyone that's implemented structured logging know's this can quickly get
|
327
|
-
out of hand. This is why we created events. Here's how we recommend using them:
|
319
|
+
## Do amazing things with your logs
|
328
320
|
|
329
|
-
|
330
|
-
|
331
|
-
2. Use metadata for debugging purposes; when you simply want additional insight without
|
332
|
-
polluting the message.
|
321
|
+
What does all of this mean? Doing amazing things with your logs! Being more productive, solving
|
322
|
+
problems faster, and _actually_ enjoying using your logs for application insight:
|
333
323
|
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
logger.info("Payment rejected", payment_rejected: {customer_id: "xiaus1934", amount: 1900, currency: "USD"})
|
341
|
-
```
|
342
|
-
|
343
|
-
### Example 2: Logging that an email was changed
|
344
|
-
|
345
|
-
This is definitely log worthy, but not something that is core to your business or application.
|
346
|
-
Instead of an event, use metadata:
|
347
|
-
|
348
|
-
```ruby
|
349
|
-
logger.info("Email successfully changed", old_email: old_email, new_email: new_email)
|
350
|
-
```
|
351
|
-
|
352
|
-
---
|
353
|
-
|
354
|
-
</p></details>
|
324
|
+
1. [**Live tail users on your app**](https://timber.io/docs/app/console/tail-a-user)
|
325
|
+
2. [**Trace HTTP requests**](https://timber.io/docs/app/console/trace-http-requests)
|
326
|
+
3. [**Inspect HTTP request parameters**](https://timber.io/docs/app/console/inspect-http-requests)
|
327
|
+
4. [**Powerful searching**](https://timber.io/docs/app/console/searching)
|
328
|
+
5. [**Threshold based alerting**](https://timber.io/docs/app/alerts)
|
329
|
+
6. ...and more! Checkout our [the Timber application docs](https://timber.io/docs/app)
|
355
330
|
|
356
331
|
|
357
332
|
## The Timber Console
|
358
333
|
|
359
|
-
[![Timber Console](http://files.timber.io/images/readme-interface7.gif)](https://
|
334
|
+
[![Timber Console](http://files.timber.io/images/readme-interface7.gif)](https://timber.io/docs/app)
|
335
|
+
|
336
|
+
[Learn more about our app.](https://timber.io/docs/app)
|
360
337
|
|
361
338
|
## Your Moment of Zen
|
362
339
|
|
363
340
|
<p align="center" style="background: #221f40;">
|
364
|
-
<a href="
|
341
|
+
<a href="https://timber.io"><img src="http://files.timber.io/images/readme-log-truth.png" height="947" /></a>
|
365
342
|
</p>
|
data/lib/timber/contexts/user.rb
CHANGED
@@ -13,17 +13,19 @@ module Timber
|
|
13
13
|
class User < Context
|
14
14
|
@keyspace = :user
|
15
15
|
|
16
|
-
attr_reader :id, :name, :email
|
16
|
+
attr_reader :id, :name, :email, :type, :meta
|
17
17
|
|
18
18
|
def initialize(attributes)
|
19
19
|
@id = attributes[:id]
|
20
20
|
@name = attributes[:name]
|
21
21
|
@email = attributes[:email]
|
22
|
+
@type = attributes[:type]
|
23
|
+
@meta = attributes[:meta]
|
22
24
|
end
|
23
25
|
|
24
26
|
# Builds a hash representation containing simple objects, suitable for serialization (JSON).
|
25
27
|
def as_json(_options = {})
|
26
|
-
{id: Timber::Util::Object.try(id, :to_s), name: name, email: email}
|
28
|
+
{id: Timber::Util::Object.try(id, :to_s), name: name, email: email, type: type, meta: meta}
|
27
29
|
end
|
28
30
|
end
|
29
31
|
end
|
data/lib/timber/log_entry.rb
CHANGED
@@ -9,7 +9,7 @@ module Timber
|
|
9
9
|
class LogEntry #:nodoc:
|
10
10
|
DT_PRECISION = 6.freeze
|
11
11
|
MESSAGE_MAX_BYTES = 8192.freeze
|
12
|
-
SCHEMA = "https://raw.githubusercontent.com/timberio/log-event-json-schema/v3.
|
12
|
+
SCHEMA = "https://raw.githubusercontent.com/timberio/log-event-json-schema/v3.1.1/schema.json".freeze
|
13
13
|
|
14
14
|
attr_reader :context_snapshot, :event, :level, :message, :progname, :tags, :time, :time_ms
|
15
15
|
|
data/lib/timber/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: timber
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.
|
4
|
+
version: 2.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Timber Technologies, Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-08-
|
11
|
+
date: 2017-08-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: msgpack
|