mr_loga_loga 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/release.yml +2 -2
  3. data/.gitignore +1 -0
  4. data/.yardopts +1 -0
  5. data/CHANGELOG.md +17 -0
  6. data/Gemfile.lock +7 -3
  7. data/README.md +4 -4
  8. data/docs/MrLogaLoga/Configuration.html +376 -0
  9. data/docs/MrLogaLoga/Context.html +628 -0
  10. data/docs/MrLogaLoga/Error.html +124 -0
  11. data/docs/MrLogaLoga/Extensions/LogrageExtension.html +305 -0
  12. data/docs/MrLogaLoga/Extensions/RailsExtension/LoggerPatch.html +322 -0
  13. data/docs/MrLogaLoga/Extensions/RailsExtension/ServerPatch.html +201 -0
  14. data/docs/MrLogaLoga/Extensions/RailsExtension.html +242 -0
  15. data/docs/MrLogaLoga/Extensions.html +117 -0
  16. data/docs/MrLogaLoga/Formatters/Json.html +350 -0
  17. data/docs/MrLogaLoga/Formatters/KeyValue.html +338 -0
  18. data/docs/MrLogaLoga/Formatters.html +117 -0
  19. data/docs/MrLogaLoga/InstanceMethods.html +350 -0
  20. data/docs/MrLogaLoga/Logger.html +618 -0
  21. data/docs/MrLogaLoga/LoggerProxy.html +319 -0
  22. data/docs/MrLogaLoga.html +374 -0
  23. data/docs/_config.yml +1 -0
  24. data/docs/_index.html +280 -0
  25. data/docs/class_list.html +51 -0
  26. data/docs/css/common.css +1 -0
  27. data/docs/css/full_list.css +58 -0
  28. data/docs/css/style.css +497 -0
  29. data/docs/file.README.html +255 -0
  30. data/docs/file_list.html +56 -0
  31. data/docs/frames.html +17 -0
  32. data/docs/index.html +255 -0
  33. data/docs/js/app.js +314 -0
  34. data/docs/js/full_list.js +216 -0
  35. data/docs/js/jquery.js +4 -0
  36. data/docs/method_list.html +283 -0
  37. data/docs/top-level-namespace.html +110 -0
  38. data/lib/mr_loga_loga/context.rb +10 -0
  39. data/lib/mr_loga_loga/extensions/{lograge_patch.rb → lograge.rb} +19 -6
  40. data/lib/mr_loga_loga/extensions/rails.rb +142 -0
  41. data/lib/mr_loga_loga/instance_methods.rb +5 -1
  42. data/lib/mr_loga_loga/logger.rb +3 -5
  43. data/lib/mr_loga_loga/version.rb +1 -1
  44. data/lib/mr_loga_loga.rb +3 -3
  45. data/mr_loga_loga.gemspec +3 -2
  46. metadata +53 -8
  47. data/lib/mr_loga_loga/extensions/active_support_logger_patch.rb +0 -94
data/docs/index.html ADDED
@@ -0,0 +1,255 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>
7
+ File: README
8
+
9
+ &mdash; Documentation by YARD 0.9.27
10
+
11
+ </title>
12
+
13
+ <link rel="stylesheet" href="css/style.css" type="text/css" />
14
+
15
+ <link rel="stylesheet" href="css/common.css" type="text/css" />
16
+
17
+ <script type="text/javascript">
18
+ pathId = "README";
19
+ relpath = '';
20
+ </script>
21
+
22
+
23
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
24
+
25
+ <script type="text/javascript" charset="utf-8" src="js/app.js"></script>
26
+
27
+
28
+ </head>
29
+ <body>
30
+ <div class="nav_wrap">
31
+ <iframe id="nav" src="class_list.html?1"></iframe>
32
+ <div id="resizer"></div>
33
+ </div>
34
+
35
+ <div id="main" tabindex="-1">
36
+ <div id="header">
37
+ <div id="menu">
38
+
39
+ <a href="_index.html">Index</a> &raquo;
40
+ <span class="title">File: README</span>
41
+
42
+ </div>
43
+
44
+ <div id="search">
45
+
46
+ <a class="full_list_link" id="class_list_link"
47
+ href="class_list.html">
48
+
49
+ <svg width="24" height="24">
50
+ <rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect>
51
+ <rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect>
52
+ <rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect>
53
+ </svg>
54
+ </a>
55
+
56
+ </div>
57
+ <div class="clear"></div>
58
+ </div>
59
+
60
+ <div id="content"><div id='filecontents'><div align="center">
61
+
62
+ # Mr. Loga Loga
63
+
64
+ <img alt="logo" src="logo.png" width="300px" height="auto">
65
+
66
+ ### The simply bombastic, fantastic logger for Ruby 💎
67
+
68
+ [![Gem Version](https://badge.fury.io/rb/mr_loga_loga.svg)](https://badge.fury.io/rb/mr_loga_loga)
69
+ [![Main](https://github.com/hschne/mr-loga-loga/actions/workflows/main.yml/badge.svg)](https://github.com/hschne/mr-loga-loga/actions/workflows/main.yml)
70
+ ![License](https://img.shields.io/github/license/hschne/mr-loga-loga)
71
+ </div>
72
+
73
+ <h2 id="whats-this">What&#39;s this?</h2>
74
+
75
+ <p>MrLogaLoga is a logger for Ruby that allows you to easily attach contextual information to your log messages.
76
+ When writing logs, messages only tell half the story. MrLogaLoga allows you to make the most of your logs.</p>
77
+
78
+ <pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_logger'>logger</span><span class='period'>.</span><span class='id identifier rubyid_info'>info</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>message</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='label'>user:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>name</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='label'>data:</span> <span class='int'>1</span><span class='rparen'>)</span>
79
+ <span class='comment'># I, [2022-01-01T12:00:00.000000 #19074] INFO -- Main: message user=user data=1
80
+ </span></code></pre>
81
+
82
+ <p>You can find out more about the motivation behind the project <a href="#why-mrlogaloga">here</a>. For usage read <a href="#usage">Usage</a> or <a href="#advanced-usage">Advanced Usage</a></p>
83
+
84
+ <p><strong>Note</strong>: This gem is in early development. Try it out and leave some feedback, it really goes a long way in helping me out with development. Any <a href="https://github.com/hschne/mr-loga-loga/issues/new?assignees=&labels=type%3ABug&template=FEATURE_REQUEST.md&title=">feature request</a> or <a href="https://github.com/hschne/mr-loga-loga/issues/new?assignees=&labels=type%3AEnhancement&template=BUG_REPORT.md&title=">bug report</a> is welcome. If you like this project, leave a star to show your support! ⭐</p>
85
+
86
+ <h2 id="getting-started">Getting Started</h2>
87
+
88
+ <p>Add this line to your application&#39;s Gemfile:</p>
89
+
90
+ <pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_gem'>gem</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>mr_loga_loga</span><span class='tstring_end'>&#39;</span></span>
91
+ </code></pre>
92
+
93
+ <p>And then execute:</p>
94
+
95
+ <pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_bundle'>bundle</span> <span class='id identifier rubyid_install'>install</span>
96
+ </code></pre>
97
+
98
+ <h2 id="usage">Usage</h2>
99
+
100
+ <p>MrLogaLoga provides the same interface as the Ruby default logger you are used to. In addition, however, you can attach contextual information to your log messages.</p>
101
+
102
+ <pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_require'>require</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>mr_loga_loga</span><span class='tstring_end'>&#39;</span></span>
103
+
104
+ <span class='id identifier rubyid_logger'>logger</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="MrLogaLoga.html" title="MrLogaLoga (module)">MrLogaLoga</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="MrLogaLoga/Logger.html" title="MrLogaLoga::Logger (class)">Logger</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="MrLogaLoga/Logger.html#initialize-instance_method" title="MrLogaLoga::Logger#initialize (method)">new</a></span></span>
105
+ <span class='id identifier rubyid_logger'>logger</span><span class='period'>.</span><span class='id identifier rubyid_info'>info</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>message</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='label'>user:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>name</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='label'>data:</span> <span class='int'>1</span><span class='rparen'>)</span>
106
+ <span class='comment'># I, [2022-01-01T12:00:00.000000 #19074] INFO -- Main: message user=user data=1
107
+ </span><span class='id identifier rubyid_logger'>logger</span><span class='period'>.</span><span class='id identifier rubyid_context'>context</span><span class='lparen'>(</span><span class='label'>class:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>classname</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_warn'>warn</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>message</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
108
+ <span class='comment'># W, [2022-01-01T12:00:00.000000 #19074] WARN -- Main: message class=classname
109
+ </span></code></pre>
110
+
111
+ <p>To customize how log messages are formatted see [Formatters][#formatters].</p>
112
+
113
+ <h2 id="advanced-usage">Advanced Usage</h2>
114
+
115
+ <p>MrLogaLoga provides a fluent interface to build log messages. For example, to attach an additional <code>user</code> field to a log message you can use any of the following:</p>
116
+
117
+ <pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_logger'>logger</span><span class='period'>.</span><span class='id identifier rubyid_info'>info</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>message</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='label'>user:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>name</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
118
+ <span class='id identifier rubyid_logger'>logger</span><span class='period'>.</span><span class='id identifier rubyid_context'>context</span><span class='lparen'>(</span><span class='label'>user:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>name</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_info'>info</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>message</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span> <span class='comment'># Explicit context
119
+ </span><span class='id identifier rubyid_logger'>logger</span><span class='period'>.</span><span class='id identifier rubyid_context'>context</span> <span class='lbrace'>{</span> <span class='lbrace'>{</span> <span class='label'>user:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>name</span><span class='tstring_end'>&#39;</span></span> <span class='rbrace'>}</span> <span class='rbrace'>}</span><span class='period'>.</span><span class='id identifier rubyid_info'>info</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>message</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span> <span class='comment'># Block context
120
+ </span><span class='id identifier rubyid_logger'>logger</span><span class='period'>.</span><span class='id identifier rubyid_user'>user</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>name</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_info'>info</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>message</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span> <span class='comment'># Dynamic context method
121
+ </span><span class='id identifier rubyid_logger'>logger</span><span class='period'>.</span><span class='id identifier rubyid_user'>user</span> <span class='lbrace'>{</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>name</span><span class='tstring_end'>&#39;</span></span> <span class='rbrace'>}</span><span class='period'>.</span><span class='id identifier rubyid_info'>info</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>message</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span> <span class='comment'># Dynamic context block
122
+ </span></code></pre>
123
+
124
+ <p>The block syntax <a href="https://ruby-doc.org/stdlib-2.4.0/libdoc/logger/rdoc/Logger.html#class-Logger-label-How+to+log+a+message"> is recommended when logging calculated properties </a>. You can find more in-depth information about specific method in the <a href="./doc">Code Documentation</a>.</p>
125
+
126
+ <h4 id="shared-context">Shared Context</h4>
127
+
128
+ <p>If multiple log messages within the same class should share a context include the <code>MrLogaLoga</code> module. Using <code>logger</code> will result in the defined context being included per default:</p>
129
+
130
+ <pre class="code ruby"><code class="ruby"><span class='kw'>class</span> <span class='const'>MyClass</span>
131
+ <span class='id identifier rubyid_include'>include</span> <span class='const'><span class='object_link'><a href="MrLogaLoga.html" title="MrLogaLoga (module)">MrLogaLoga</a></span></span>
132
+
133
+ <span class='comment'># This is the default. You may overwrite this in your own classes
134
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_loga_context'>loga_context</span>
135
+ <span class='lbrace'>{</span> <span class='label'>class_name:</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_class'>class</span><span class='period'>.</span><span class='id identifier rubyid_name'>name</span> <span class='rbrace'>}</span>
136
+ <span class='kw'>end</span>
137
+
138
+ <span class='kw'>def</span> <span class='id identifier rubyid_log'>log</span>
139
+ <span class='comment'># This includes the class name in the log message now
140
+ </span> <span class='id identifier rubyid_logger'>logger</span><span class='period'>.</span><span class='id identifier rubyid_debug'>debug</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>debug</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span> <span class='comment'># debug class_name=MyClass
141
+ </span> <span class='comment'># Additional context will be merged
142
+ </span> <span class='id identifier rubyid_logger'>logger</span><span class='period'>.</span><span class='id identifier rubyid_debug'>debug</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>debug</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='label'>user:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>user</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span> <span class='comment'># debug class_name=MyClass user=user
143
+ </span> <span class='kw'>end</span>
144
+ <span class='kw'>end</span>
145
+ </code></pre>
146
+
147
+ <p>When used with <a href="#rails">Rails</a> logger will default to <code>Rails.logger</code>. If you use MrLogaLoga outside of Rails, you can either configure the logger instance to be used globally, or by overwriting the <code>loga_loga</code> method:</p>
148
+
149
+ <pre class="code ruby"><code class="ruby"><span class='comment'># In some configuration class
150
+ </span><span class='const'><span class='object_link'><a href="MrLogaLoga.html" title="MrLogaLoga (module)">MrLogaLoga</a></span></span><span class='period'>.</span><span class='id identifier rubyid_configure'><span class='object_link'><a href="MrLogaLoga.html#configure-class_method" title="MrLogaLoga.configure (method)">configure</a></span></span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_configuration'>configuration</span><span class='op'>|</span>
151
+ <span class='id identifier rubyid_logger'>logger</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="MrLogaLoga.html" title="MrLogaLoga (module)">MrLogaLoga</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="MrLogaLoga/Logger.html" title="MrLogaLoga::Logger (class)">Logger</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="MrLogaLoga/Logger.html#initialize-instance_method" title="MrLogaLoga::Logger#initialize (method)">new</a></span></span><span class='lparen'>(</span><span class='gvar'>$stdout</span><span class='rparen'>)</span>
152
+ <span class='kw'>end</span>
153
+
154
+ <span class='comment'># In the class where you do the logging itself
155
+ </span><span class='kw'>class</span> <span class='const'>MyClass</span>
156
+ <span class='id identifier rubyid_include'>include</span> <span class='const'><span class='object_link'><a href="MrLogaLoga.html" title="MrLogaLoga (module)">MrLogaLoga</a></span></span>
157
+
158
+ <span class='kw'>def</span> <span class='id identifier rubyid_loga_loga'>loga_loga</span>
159
+ <span class='const'><span class='object_link'><a href="MrLogaLoga.html" title="MrLogaLoga (module)">MrLogaLoga</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="MrLogaLoga/Logger.html" title="MrLogaLoga::Logger (class)">Logger</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="MrLogaLoga/Logger.html#initialize-instance_method" title="MrLogaLoga::Logger#initialize (method)">new</a></span></span><span class='lparen'>(</span><span class='gvar'>$stdout</span><span class='rparen'>)</span>
160
+ <span class='kw'>end</span>
161
+
162
+ <span class='kw'>def</span> <span class='id identifier rubyid_log'>log</span>
163
+ <span class='comment'># ...
164
+ </span> <span class='kw'>end</span>
165
+ <span class='kw'>end</span>
166
+ </code></pre>
167
+
168
+ <h3 id="formatters">Formatters</h3>
169
+
170
+ <p>MrLogaLoga uses the <a href="https://github.com/hschne/mr-loga-loga/blob/main/lib/mr_loga_loga/formatters/key_value.rb">KeyValue</a> formatter per default. The <a href="https://github.com/hschne/mr-loga-loga/blob/main/lib/mr_loga_loga/formatters/json.rb">Json</a> formatter is also included. To use a specific formatter pass it to the logger constructor:</p>
171
+
172
+ <pre class="code Ruby"><code class="Ruby">
173
+ MrLogaLoga::Logger.new(STDOUT, formatter: MrLogaLoga::Formatters::KeyValue.new)
174
+ </code></pre>
175
+
176
+ <p>You can implement and add your own formatters like so:</p>
177
+
178
+ <pre class="code ruby"><code class="ruby"><span class='kw'>class</span> <span class='const'>MyFormatter</span>
179
+ <span class='kw'>def</span> <span class='id identifier rubyid_call'>call</span><span class='lparen'>(</span><span class='id identifier rubyid_severity'>severity</span><span class='comma'>,</span> <span class='id identifier rubyid_datetime'>datetime</span><span class='comma'>,</span> <span class='id identifier rubyid_progname'>progname</span><span class='comma'>,</span> <span class='id identifier rubyid_message'>message</span><span class='comma'>,</span> <span class='id identifier rubyid_context'>context</span><span class='rparen'>)</span>
180
+ <span class='id identifier rubyid_context'>context</span> <span class='op'>=</span> <span class='id identifier rubyid_context'>context</span><span class='period'>.</span><span class='id identifier rubyid_map'>map</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_key'>key</span><span class='comma'>,</span> <span class='id identifier rubyid_value'>value</span><span class='op'>|</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_key'>key</span><span class='embexpr_end'>}</span><span class='tstring_content'>=</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_value'>value</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span> <span class='rbrace'>}</span><span class='period'>.</span><span class='id identifier rubyid_compact'>compact</span><span class='period'>.</span><span class='id identifier rubyid_join'>join</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'> </span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
181
+ <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_severity'>severity</span><span class='embexpr_end'>}</span><span class='tstring_content'> </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_datetime'>datetime</span><span class='period'>.</span><span class='id identifier rubyid_strftime'>strftime</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>%Y-%m-%dT%H:%M:%S.%6N</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span><span class='embexpr_end'>}</span><span class='tstring_content'> </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_progname'>progname</span><span class='embexpr_end'>}</span><span class='tstring_content'> </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_message'>message</span><span class='embexpr_end'>}</span><span class='tstring_content'> </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_context'>context</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span>
182
+ <span class='kw'>end</span>
183
+ <span class='kw'>end</span>
184
+
185
+ <span class='const'><span class='object_link'><a href="MrLogaLoga.html" title="MrLogaLoga (module)">MrLogaLoga</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="MrLogaLoga/Logger.html" title="MrLogaLoga::Logger (class)">Logger</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="MrLogaLoga/Logger.html#initialize-instance_method" title="MrLogaLoga::Logger#initialize (method)">new</a></span></span><span class='lparen'>(</span><span class='const'>STDOUT</span><span class='comma'>,</span> <span class='label'>formatter:</span> <span class='const'>MyFormatter</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='rparen'>)</span>
186
+ </code></pre>
187
+
188
+ <h3 id="rails">Rails</h3>
189
+
190
+ <p>Using MrLogaLoga in Ruby on Rails is straightforward. Set up MrLogaLoga as logger in your <code>application.rb</code> or environment files and you are off to the races:</p>
191
+
192
+ <pre class="code ruby"><code class="ruby"><span class='comment'># application.rb
193
+ </span><span class='id identifier rubyid_config'>config</span><span class='period'>.</span><span class='id identifier rubyid_logger'>logger</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="MrLogaLoga.html" title="MrLogaLoga (module)">MrLogaLoga</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="MrLogaLoga/Logger.html" title="MrLogaLoga::Logger (class)">Logger</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="MrLogaLoga/Logger.html#initialize-instance_method" title="MrLogaLoga::Logger#initialize (method)">new</a></span></span><span class='lparen'>(</span><span class='const'>STDOUT</span><span class='rparen'>)</span>
194
+ <span class='id identifier rubyid_config'>config</span><span class='period'>.</span><span class='id identifier rubyid_log_level'>log_level</span> <span class='op'>=</span> <span class='symbol'>:info</span>
195
+ </code></pre>
196
+
197
+ <p>Note that setting <code>config.log_formatter</code> does not work. You must set the formatter in the logger constructor as described in <a href="#formatters">Formatters</a>.</p>
198
+
199
+ <h3 id="lograge">Lograge</h3>
200
+
201
+ <p><a href="https://github.com/roidrage/lograge">LogRage</a> and MrLogaLoga work well together. When using both gems Lograge will be patched so that data will be available as <code>context</code> in MrLogaLoga. Make sure that MrLogaLoga is required <strong>after</strong> Lograge: </p>
202
+
203
+ <pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_gem'>gem</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>lograge</span><span class='tstring_end'>&#39;</span></span>
204
+ <span class='id identifier rubyid_gem'>gem</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>mr_loga_loga</span><span class='tstring_end'>&#39;</span></span>
205
+ </code></pre>
206
+
207
+ <p>Note that Lograge&#39;s formatters won&#39;t be used. Use MrLogaLoga&#39;s own <a href="#formatters">formatters</a> instead.</p>
208
+
209
+ <h2 id="why-mrlogaloga">Why MrLogaLoga?</h2>
210
+
211
+ <p>The more context your logs provide, the more use you will get out of them. The standard Ruby logger only takes a string as an argument, so you have to resort to something like this:</p>
212
+
213
+ <pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_logger'>logger</span><span class='period'>.</span><span class='id identifier rubyid_debug'>debug</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>my message user=</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_user'>user</span><span class='embexpr_end'>}</span><span class='tstring_content'> more_data=</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_data'>data</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
214
+ </code></pre>
215
+
216
+ <p>This is fine, as long as you do not need to change your log format. Changing your log formatter will not change the format of your message, nor the formatting of the contextual information you provided.</p>
217
+
218
+ <p>MrLogaLoga addresses this by allowing you to attach contextual information to your logs and giving you full control over how both message and context are formatted. There are other gems doing similar things, most notably <a href="https://logger.rocketjob.io/">Semantic Logger</a>. Where Semantic Logger provides lots of functionality related to logging, MrLogaLoga focuses on making it nice to write log messages - and nothing more. </p>
219
+
220
+ <h2 id="credit">Credit</h2>
221
+
222
+ <p>This little library was inspired by <a href="https://github.com/roidrage/lograge">Lograge</a> first and foremost. I would like to thank the amazing <a href="https://twitter.com/LenaSchnedlitz">@LenaSchnedlitz</a> for the incredible logo! 🤩</p>
223
+
224
+ <h2 id="development">Development</h2>
225
+
226
+ <p>After checking out the repo, run <code>bin/setup</code> to install dependencies. Then, run <code>rake</code> to run the tests and linter. You can also run <code>bin/console</code> for an interactive prompt that will allow you to experiment.</p>
227
+
228
+ <p>To install this gem onto your local machine, run <code>bundle exec rake install</code>. To release a new version, update the version number in <code>version.rb</code>, and then run <code>bundle exec rake release</code>, which will create a git tag for the version, push git commits and the created tag, and push the <code>.gem</code> file to <a href="https://rubygems.org">rubygems.org</a>.</p>
229
+
230
+ <h2 id="contributing">Contributing</h2>
231
+
232
+ <p>Thank you for contributing! :heart:</p>
233
+
234
+ <p>We welcome all support, whether on bug reports, code, design, reviews, tests, documentation, translations, or just feature requests.</p>
235
+
236
+ <p>Please use <a href="https://github.com/hschne/rails-mini-profiler/issues">GitHub issues</a> to submit bugs or feature requests.</p>
237
+
238
+ <h2 id="license">License</h2>
239
+
240
+ <p>The gem is available as open-source under the terms of the <a href="https://opensource.org/licenses/MIT">MIT License</a>.</p>
241
+
242
+ <h2 id="code-of-conduct">Code of Conduct</h2>
243
+
244
+ <p>Everyone interacting in the MrLogaLoga project&#39;s codebases, issue trackers, chat rooms, and mailing lists is expected to follow the <a href="https://github.com/hschne/mr_loga_loga/blob/master/CODE_OF_CONDUCT.md">code of conduct</a>.</p>
245
+ </div></div>
246
+
247
+ <div id="footer">
248
+ Generated on Wed Jan 5 09:59:09 2022 by
249
+ <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
250
+ 0.9.27 (ruby-3.0.0).
251
+ </div>
252
+
253
+ </div>
254
+ </body>
255
+ </html>
data/docs/js/app.js ADDED
@@ -0,0 +1,314 @@
1
+ (function() {
2
+
3
+ var localStorage = {}, sessionStorage = {};
4
+ try { localStorage = window.localStorage; } catch (e) { }
5
+ try { sessionStorage = window.sessionStorage; } catch (e) { }
6
+
7
+ function createSourceLinks() {
8
+ $('.method_details_list .source_code').
9
+ before("<span class='showSource'>[<a href='#' class='toggleSource'>View source</a>]</span>");
10
+ $('.toggleSource').toggle(function() {
11
+ $(this).parent().nextAll('.source_code').slideDown(100);
12
+ $(this).text("Hide source");
13
+ },
14
+ function() {
15
+ $(this).parent().nextAll('.source_code').slideUp(100);
16
+ $(this).text("View source");
17
+ });
18
+ }
19
+
20
+ function createDefineLinks() {
21
+ var tHeight = 0;
22
+ $('.defines').after(" <a href='#' class='toggleDefines'>more...</a>");
23
+ $('.toggleDefines').toggle(function() {
24
+ tHeight = $(this).parent().prev().height();
25
+ $(this).prev().css('display', 'inline');
26
+ $(this).parent().prev().height($(this).parent().height());
27
+ $(this).text("(less)");
28
+ },
29
+ function() {
30
+ $(this).prev().hide();
31
+ $(this).parent().prev().height(tHeight);
32
+ $(this).text("more...");
33
+ });
34
+ }
35
+
36
+ function createFullTreeLinks() {
37
+ var tHeight = 0;
38
+ $('.inheritanceTree').toggle(function() {
39
+ tHeight = $(this).parent().prev().height();
40
+ $(this).parent().toggleClass('showAll');
41
+ $(this).text("(hide)");
42
+ $(this).parent().prev().height($(this).parent().height());
43
+ },
44
+ function() {
45
+ $(this).parent().toggleClass('showAll');
46
+ $(this).parent().prev().height(tHeight);
47
+ $(this).text("show all");
48
+ });
49
+ }
50
+
51
+ function searchFrameButtons() {
52
+ $('.full_list_link').click(function() {
53
+ toggleSearchFrame(this, $(this).attr('href'));
54
+ return false;
55
+ });
56
+ window.addEventListener('message', function(e) {
57
+ if (e.data === 'navEscape') {
58
+ $('#nav').slideUp(100);
59
+ $('#search a').removeClass('active inactive');
60
+ $(window).focus();
61
+ }
62
+ });
63
+
64
+ $(window).resize(function() {
65
+ if ($('#search:visible').length === 0) {
66
+ $('#nav').removeAttr('style');
67
+ $('#search a').removeClass('active inactive');
68
+ $(window).focus();
69
+ }
70
+ });
71
+ }
72
+
73
+ function toggleSearchFrame(id, link) {
74
+ var frame = $('#nav');
75
+ $('#search a').removeClass('active').addClass('inactive');
76
+ if (frame.attr('src') === link && frame.css('display') !== "none") {
77
+ frame.slideUp(100);
78
+ $('#search a').removeClass('active inactive');
79
+ }
80
+ else {
81
+ $(id).addClass('active').removeClass('inactive');
82
+ if (frame.attr('src') !== link) frame.attr('src', link);
83
+ frame.slideDown(100);
84
+ }
85
+ }
86
+
87
+ function linkSummaries() {
88
+ $('.summary_signature').click(function() {
89
+ document.location = $(this).find('a').attr('href');
90
+ });
91
+ }
92
+
93
+ function summaryToggle() {
94
+ $('.summary_toggle').click(function(e) {
95
+ e.preventDefault();
96
+ localStorage.summaryCollapsed = $(this).text();
97
+ $('.summary_toggle').each(function() {
98
+ $(this).text($(this).text() == "collapse" ? "expand" : "collapse");
99
+ var next = $(this).parent().parent().nextAll('ul.summary').first();
100
+ if (next.hasClass('compact')) {
101
+ next.toggle();
102
+ next.nextAll('ul.summary').first().toggle();
103
+ }
104
+ else if (next.hasClass('summary')) {
105
+ var list = $('<ul class="summary compact" />');
106
+ list.html(next.html());
107
+ list.find('.summary_desc, .note').remove();
108
+ list.find('a').each(function() {
109
+ $(this).html($(this).find('strong').html());
110
+ $(this).parent().html($(this)[0].outerHTML);
111
+ });
112
+ next.before(list);
113
+ next.toggle();
114
+ }
115
+ });
116
+ return false;
117
+ });
118
+ if (localStorage.summaryCollapsed == "collapse") {
119
+ $('.summary_toggle').first().click();
120
+ } else { localStorage.summaryCollapsed = "expand"; }
121
+ }
122
+
123
+ function constantSummaryToggle() {
124
+ $('.constants_summary_toggle').click(function(e) {
125
+ e.preventDefault();
126
+ localStorage.summaryCollapsed = $(this).text();
127
+ $('.constants_summary_toggle').each(function() {
128
+ $(this).text($(this).text() == "collapse" ? "expand" : "collapse");
129
+ var next = $(this).parent().parent().nextAll('dl.constants').first();
130
+ if (next.hasClass('compact')) {
131
+ next.toggle();
132
+ next.nextAll('dl.constants').first().toggle();
133
+ }
134
+ else if (next.hasClass('constants')) {
135
+ var list = $('<dl class="constants compact" />');
136
+ list.html(next.html());
137
+ list.find('dt').each(function() {
138
+ $(this).addClass('summary_signature');
139
+ $(this).text( $(this).text().split('=')[0]);
140
+ if ($(this).has(".deprecated").length) {
141
+ $(this).addClass('deprecated');
142
+ };
143
+ });
144
+ // Add the value of the constant as "Tooltip" to the summary object
145
+ list.find('pre.code').each(function() {
146
+ console.log($(this).parent());
147
+ var dt_element = $(this).parent().prev();
148
+ var tooltip = $(this).text();
149
+ if (dt_element.hasClass("deprecated")) {
150
+ tooltip = 'Deprecated. ' + tooltip;
151
+ };
152
+ dt_element.attr('title', tooltip);
153
+ });
154
+ list.find('.docstring, .tags, dd').remove();
155
+ next.before(list);
156
+ next.toggle();
157
+ }
158
+ });
159
+ return false;
160
+ });
161
+ if (localStorage.summaryCollapsed == "collapse") {
162
+ $('.constants_summary_toggle').first().click();
163
+ } else { localStorage.summaryCollapsed = "expand"; }
164
+ }
165
+
166
+ function generateTOC() {
167
+ if ($('#filecontents').length === 0) return;
168
+ var _toc = $('<ol class="top"></ol>');
169
+ var show = false;
170
+ var toc = _toc;
171
+ var counter = 0;
172
+ var tags = ['h2', 'h3', 'h4', 'h5', 'h6'];
173
+ var i;
174
+ var curli;
175
+ if ($('#filecontents h1').length > 1) tags.unshift('h1');
176
+ for (i = 0; i < tags.length; i++) { tags[i] = '#filecontents ' + tags[i]; }
177
+ var lastTag = parseInt(tags[0][1], 10);
178
+ $(tags.join(', ')).each(function() {
179
+ if ($(this).parents('.method_details .docstring').length != 0) return;
180
+ if (this.id == "filecontents") return;
181
+ show = true;
182
+ var thisTag = parseInt(this.tagName[1], 10);
183
+ if (this.id.length === 0) {
184
+ var proposedId = $(this).attr('toc-id');
185
+ if (typeof(proposedId) != "undefined") this.id = proposedId;
186
+ else {
187
+ var proposedId = $(this).text().replace(/[^a-z0-9-]/ig, '_');
188
+ if ($('#' + proposedId).length > 0) { proposedId += counter; counter++; }
189
+ this.id = proposedId;
190
+ }
191
+ }
192
+ if (thisTag > lastTag) {
193
+ for (i = 0; i < thisTag - lastTag; i++) {
194
+ if ( typeof(curli) == "undefined" ) {
195
+ curli = $('<li/>');
196
+ toc.append(curli);
197
+ }
198
+ toc = $('<ol/>');
199
+ curli.append(toc);
200
+ curli = undefined;
201
+ }
202
+ }
203
+ if (thisTag < lastTag) {
204
+ for (i = 0; i < lastTag - thisTag; i++) {
205
+ toc = toc.parent();
206
+ toc = toc.parent();
207
+ }
208
+ }
209
+ var title = $(this).attr('toc-title');
210
+ if (typeof(title) == "undefined") title = $(this).text();
211
+ curli =$('<li><a href="#' + this.id + '">' + title + '</a></li>');
212
+ toc.append(curli);
213
+ lastTag = thisTag;
214
+ });
215
+ if (!show) return;
216
+ html = '<div id="toc"><p class="title hide_toc"><a href="#"><strong>Table of Contents</strong></a></p></div>';
217
+ $('#content').prepend(html);
218
+ $('#toc').append(_toc);
219
+ $('#toc .hide_toc').toggle(function() {
220
+ $('#toc .top').slideUp('fast');
221
+ $('#toc').toggleClass('hidden');
222
+ $('#toc .title small').toggle();
223
+ }, function() {
224
+ $('#toc .top').slideDown('fast');
225
+ $('#toc').toggleClass('hidden');
226
+ $('#toc .title small').toggle();
227
+ });
228
+ }
229
+
230
+ function navResizeFn(e) {
231
+ if (e.which !== 1) {
232
+ navResizeFnStop();
233
+ return;
234
+ }
235
+
236
+ sessionStorage.navWidth = e.pageX.toString();
237
+ $('.nav_wrap').css('width', e.pageX);
238
+ $('.nav_wrap').css('-ms-flex', 'inherit');
239
+ }
240
+
241
+ function navResizeFnStop() {
242
+ $(window).unbind('mousemove', navResizeFn);
243
+ window.removeEventListener('message', navMessageFn, false);
244
+ }
245
+
246
+ function navMessageFn(e) {
247
+ if (e.data.action === 'mousemove') navResizeFn(e.data.event);
248
+ if (e.data.action === 'mouseup') navResizeFnStop();
249
+ }
250
+
251
+ function navResizer() {
252
+ $('#resizer').mousedown(function(e) {
253
+ e.preventDefault();
254
+ $(window).mousemove(navResizeFn);
255
+ window.addEventListener('message', navMessageFn, false);
256
+ });
257
+ $(window).mouseup(navResizeFnStop);
258
+
259
+ if (sessionStorage.navWidth) {
260
+ navResizeFn({which: 1, pageX: parseInt(sessionStorage.navWidth, 10)});
261
+ }
262
+ }
263
+
264
+ function navExpander() {
265
+ var done = false, timer = setTimeout(postMessage, 500);
266
+ function postMessage() {
267
+ if (done) return;
268
+ clearTimeout(timer);
269
+ var opts = { action: 'expand', path: pathId };
270
+ document.getElementById('nav').contentWindow.postMessage(opts, '*');
271
+ done = true;
272
+ }
273
+
274
+ window.addEventListener('message', function(event) {
275
+ if (event.data === 'navReady') postMessage();
276
+ return false;
277
+ }, false);
278
+ }
279
+
280
+ function mainFocus() {
281
+ var hash = window.location.hash;
282
+ if (hash !== '' && $(hash)[0]) {
283
+ $(hash)[0].scrollIntoView();
284
+ }
285
+
286
+ setTimeout(function() { $('#main').focus(); }, 10);
287
+ }
288
+
289
+ function navigationChange() {
290
+ // This works around the broken anchor navigation with the YARD template.
291
+ window.onpopstate = function() {
292
+ var hash = window.location.hash;
293
+ if (hash !== '' && $(hash)[0]) {
294
+ $(hash)[0].scrollIntoView();
295
+ }
296
+ };
297
+ }
298
+
299
+ $(document).ready(function() {
300
+ navResizer();
301
+ navExpander();
302
+ createSourceLinks();
303
+ createDefineLinks();
304
+ createFullTreeLinks();
305
+ searchFrameButtons();
306
+ linkSummaries();
307
+ summaryToggle();
308
+ constantSummaryToggle();
309
+ generateTOC();
310
+ mainFocus();
311
+ navigationChange();
312
+ });
313
+
314
+ })();