clogger 2.2.1 → 2.3.0
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/.olddoc.yml +4 -1
- data/GIT-VERSION-GEN +1 -1
- data/README +25 -11
- data/ext/clogger_ext/clogger.c +31 -0
- data/lib/clogger.rb +9 -2
- data/lib/clogger/pure.rb +1 -0
- data/test/test_clogger.rb +39 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aa136dd8c34021aa1fe06bc527ddee6f0b2e3f1c6690292bba0566938efc11f4
|
4
|
+
data.tar.gz: c91b0dcb15b374bf6d89812b0dbcb002e9811b94a537465d96d5639191c55ab3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a3dc7e9f494fcd6acc52c82ba5f1c50d0bead5b5042189766f48f0229e595682c704f054a4d45ac5857a77a98c0c9d09e53c333f63a42e5c1232a2af9e1c1fe3
|
7
|
+
data.tar.gz: e72490ade869362cca1dd0df4cbd56c93c08a45f5baf32e88fd38b9a806b043286d1d58adaf3e31dae200a1f61f4e002b7f3e7bea15174d599af897609759cb2
|
data/.olddoc.yml
CHANGED
@@ -6,7 +6,10 @@ public_email: clogger-public@yhbt.net
|
|
6
6
|
ml_url:
|
7
7
|
- https://yhbt.net/clogger-public/
|
8
8
|
- http://ou63pmih66umazou.onion/clogger-public/
|
9
|
-
-
|
9
|
+
- imaps://news.public-inbox.org/inbox.comp.lang.ruby.clogger.0
|
10
|
+
- imap://ou63pmih66umazou.onion/inbox.comp.lang.ruby.clogger.0
|
11
|
+
- nntps://news.public-inbox.org/inbox.comp.lang.ruby.clogger
|
12
|
+
- nntp://ou63pmih66umazou.onion/inbox.comp.lang.ruby.clogger
|
10
13
|
source_code:
|
11
14
|
- git clone git://yhbt.net/clogger.git
|
12
15
|
- git clone https://yhbt.net/clogger.git
|
data/GIT-VERSION-GEN
CHANGED
data/README
CHANGED
@@ -69,10 +69,12 @@ that receives a "<<" method:
|
|
69
69
|
* $request_uri - the URI requested ($path_info?$query_string)
|
70
70
|
* $request - the first line of the HTTP request
|
71
71
|
($request_method $request_uri $http_version)
|
72
|
-
* $request_time, $request_time{PRECISION} -
|
73
|
-
(including response body iteration).
|
74
|
-
(milliseconds) if not specified but may be specified
|
75
|
-
0(seconds) to 6(microseconds).
|
72
|
+
* $request_time, $request_time{PRECISION}, $request_time{POWER,PRECISION} -
|
73
|
+
time taken for request (including response body iteration). PRECISION
|
74
|
+
defaults to 3 (milliseconds) if not specified but may be specified
|
75
|
+
anywhere from 0(seconds) to 6(microseconds). POWER will raise the time to
|
76
|
+
the provided power of 10, useful for converting to micro- or nanoseconds.
|
77
|
+
POWER defaults to 0 if not specified but may be specified any from 0 to 9
|
76
78
|
* $time_iso8601 - current local time in ISO 8601 format,
|
77
79
|
e.g. "1970-01-01T00:00:00+00:00"
|
78
80
|
* $time_local - current local time in Apache log format,
|
@@ -87,7 +89,7 @@ that receives a "<<" method:
|
|
87
89
|
* $ip - X-Forwarded-For request header if available, $remote_addr if not
|
88
90
|
* $pid - process ID of the current process
|
89
91
|
* $e{Thread.current} - Thread processing the request
|
90
|
-
* $e{
|
92
|
+
* $e{Fiber.current} - Fiber processing the request
|
91
93
|
* $env{variable_name} - any Rack environment variable (e.g. rack.url_scheme)
|
92
94
|
|
93
95
|
== REQUIREMENTS
|
@@ -106,18 +108,30 @@ You may also browse and download snapshot tarballs:
|
|
106
108
|
* https://yhbt.net/clogger.git
|
107
109
|
* http://repo.or.cz/w/clogger.git (gitweb)
|
108
110
|
|
109
|
-
|
110
|
-
development. Patches should always be sent inline
|
111
|
-
(git format-patch -M + git send-email) so we can reply to them inline.
|
111
|
+
We use email for coordination and development, see below:
|
112
112
|
|
113
113
|
== CONTACT
|
114
114
|
|
115
115
|
All feedback (bug reports, user/development discussion, patches, pull
|
116
|
-
requests)
|
116
|
+
requests) is done via publicly-archived email:
|
117
117
|
|
118
|
-
*
|
118
|
+
* https://yhbt.net/clogger-public/
|
119
|
+
* imaps://news.public-inbox.org/inbox.comp.lang.ruby.clogger.0
|
120
|
+
* nntps://news.public-inbox.org/inbox.comp.lang.ruby.clogger
|
121
|
+
|
122
|
+
Tor users may also access HTTP, IMAP, and NNTP archives via .onion:
|
123
|
+
|
124
|
+
* http://ou63pmih66umazou.onion/clogger-public/
|
125
|
+
* imap://ou63pmih66umazou.onion/inbox.comp.lang.ruby.clogger.0
|
126
|
+
* nntp://ou63pmih66umazou.onion/inbox.comp.lang.ruby.clogger
|
119
127
|
|
120
|
-
|
128
|
+
AUTH=ANONYMOUS is supported for IMAP and IMAPS, and any
|
129
|
+
username + password will work.
|
130
|
+
|
131
|
+
No subscription or real names will ever be required to email us.
|
132
|
+
Do not send HTML email, do not top post.
|
133
|
+
|
134
|
+
* mailto:clogger-public@yhbt.net
|
121
135
|
|
122
136
|
Homepage: https://yhbt.net/clogger/
|
123
137
|
|
data/ext/clogger_ext/clogger.c
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
/* quiet deprecation for _BSD_SOURCE and _SVID_SOURCE: */
|
2
|
+
#define _DEFAULT_SOURCE 1
|
3
|
+
|
1
4
|
#include <ruby.h>
|
2
5
|
#ifdef HAVE_RUBY_IO_H
|
3
6
|
# include <ruby/io.h>
|
@@ -374,12 +377,40 @@ static void append_ts(struct clogger *c, VALUE op, struct timespec *ts)
|
|
374
377
|
rb_str_buf_cat(c->log_buf, buf, nr);
|
375
378
|
}
|
376
379
|
|
380
|
+
#define NANO_PER_SEC (1000 * 1000 * 1000)
|
377
381
|
static void append_request_time_fmt(struct clogger *c, VALUE op)
|
378
382
|
{
|
379
383
|
struct timespec now;
|
384
|
+
unsigned long ipow = NUM2ULONG(rb_ary_entry(op, 3));
|
380
385
|
|
381
386
|
clock_gettime(hopefully_CLOCK_MONOTONIC, &now);
|
382
387
|
clock_diff(&now, &c->ts_start);
|
388
|
+
if (ipow) {
|
389
|
+
struct timespec prev;
|
390
|
+
unsigned long adj = 1;
|
391
|
+
/*
|
392
|
+
* n.b. timespec.tv_sec may not be time_t on some platforms,
|
393
|
+
* so we use a full timespec struct instead of time_t:
|
394
|
+
*/
|
395
|
+
prev.tv_sec = now.tv_sec;
|
396
|
+
do { adj *= 10; } while (--ipow);
|
397
|
+
now.tv_sec *= adj;
|
398
|
+
now.tv_nsec *= adj;
|
399
|
+
if (now.tv_nsec >= NANO_PER_SEC) {
|
400
|
+
int64_t add = now.tv_nsec / NANO_PER_SEC;
|
401
|
+
now.tv_sec += add;
|
402
|
+
now.tv_nsec %= NANO_PER_SEC;
|
403
|
+
}
|
404
|
+
if (now.tv_sec < prev.tv_sec) { /* overflowed */
|
405
|
+
now.tv_nsec = NANO_PER_SEC - 1;
|
406
|
+
/*
|
407
|
+
* some platforms may use unsigned .tv_sec, but
|
408
|
+
* they're not worth supporting, so keep unsigned:
|
409
|
+
*/
|
410
|
+
now.tv_sec = (time_t)(sizeof(now.tv_sec) == 4 ?
|
411
|
+
INT_MAX : LONG_MAX);
|
412
|
+
}
|
413
|
+
}
|
383
414
|
append_ts(c, op, &now);
|
384
415
|
}
|
385
416
|
|
data/lib/clogger.rb
CHANGED
@@ -51,7 +51,7 @@ private
|
|
51
51
|
|
52
52
|
SCAN = /([^$]*)(\$+(?:env\{\w+(?:\.[\w\.]+)?\}|
|
53
53
|
e\{[^\}]+\}|
|
54
|
-
(?:request_)?time\{\d
|
54
|
+
(?:request_)?time\{\d+(?:,\d+)?\}|
|
55
55
|
time_(?:utc|local)\{[^\}]+\}|
|
56
56
|
\w*))?([^$]*)/x
|
57
57
|
|
@@ -92,7 +92,14 @@ private
|
|
92
92
|
when /\A\$time\{(\d+)\}\z/
|
93
93
|
rv << [ OP_TIME, *usec_conv_pair(tok, $1.to_i) ]
|
94
94
|
when /\A\$request_time\{(\d+)\}\z/
|
95
|
-
rv << [ OP_REQUEST_TIME, *usec_conv_pair(tok, $1.to_i) ]
|
95
|
+
rv << [ OP_REQUEST_TIME, *usec_conv_pair(tok, $1.to_i), 0 ]
|
96
|
+
when /\A\$request_time\{(\d+),(\d+)\}\z/
|
97
|
+
ipow = $1.to_i
|
98
|
+
prec = $2.to_i
|
99
|
+
if ipow > 9 # nanosecond precision is the highest POSIX goes
|
100
|
+
raise ArgumentError, "#{tok}: too big: #{ipow} (max=9)"
|
101
|
+
end
|
102
|
+
rv << [ OP_REQUEST_TIME, *usec_conv_pair(tok, prec), ipow ]
|
96
103
|
else
|
97
104
|
tok_sym = tok[1..-1].to_sym
|
98
105
|
if special_code = SPECIAL_VARS[tok_sym]
|
data/lib/clogger/pure.rb
CHANGED
data/test/test_clogger.rb
CHANGED
@@ -167,10 +167,11 @@ class TestClogger < Test::Unit::TestCase
|
|
167
167
|
ary = compile_format(
|
168
168
|
'$remote_addr - $remote_user [$time_local] ' \
|
169
169
|
'"$request" $status $body_bytes_sent "$http_referer" ' \
|
170
|
-
'"$http_user_agent" "$http_cookie" $request_time ' \
|
170
|
+
'"$http_user_agent" "$http_cookie" $request_time $request_time{6,0} ' \
|
171
171
|
'$env{rack.url_scheme}' \
|
172
172
|
"\n")
|
173
173
|
}
|
174
|
+
|
174
175
|
expect = [
|
175
176
|
[ Clogger::OP_REQUEST, "REMOTE_ADDR" ],
|
176
177
|
[ Clogger::OP_LITERAL, " - " ],
|
@@ -190,7 +191,9 @@ class TestClogger < Test::Unit::TestCase
|
|
190
191
|
[ Clogger::OP_LITERAL, "\" \"" ],
|
191
192
|
[ Clogger::OP_REQUEST, "HTTP_COOKIE" ],
|
192
193
|
[ Clogger::OP_LITERAL, "\" " ],
|
193
|
-
[ Clogger::OP_REQUEST_TIME, '%d.%03d', 1000 ],
|
194
|
+
[ Clogger::OP_REQUEST_TIME, '%d.%03d', 1000, 0],
|
195
|
+
[ Clogger::OP_LITERAL, " " ],
|
196
|
+
[ Clogger::OP_REQUEST_TIME, '%d', 1, 6],
|
194
197
|
[ Clogger::OP_LITERAL, " " ],
|
195
198
|
[ Clogger::OP_REQUEST, "rack.url_scheme" ],
|
196
199
|
[ Clogger::OP_LITERAL, "\n" ],
|
@@ -209,6 +212,22 @@ class TestClogger < Test::Unit::TestCase
|
|
209
212
|
assert_equal "-#{current}-\n", str.string
|
210
213
|
end
|
211
214
|
|
215
|
+
def test_fiber
|
216
|
+
begin
|
217
|
+
current = Fiber.current.to_s
|
218
|
+
rescue NameError => e
|
219
|
+
warn "your Ruby does not support fibers #{e}"
|
220
|
+
return
|
221
|
+
end
|
222
|
+
str = StringIO.new
|
223
|
+
app = lambda { |env| [ 302, {}, [] ] }
|
224
|
+
cl = Clogger.new(app,
|
225
|
+
:logger => str,
|
226
|
+
:format => "-$e{Fiber.current}-\n")
|
227
|
+
status, headers, body = cl.call(@req)
|
228
|
+
assert_equal "-#{current}-\n", str.string
|
229
|
+
end
|
230
|
+
|
212
231
|
def test_pid
|
213
232
|
str = StringIO.new
|
214
233
|
app = lambda { |env| [ 302, {}, [] ] }
|
@@ -721,6 +740,24 @@ class TestClogger < Test::Unit::TestCase
|
|
721
740
|
assert s[-1].to_f <= 0.110
|
722
741
|
end
|
723
742
|
|
743
|
+
def test_request_time_with_multiplier
|
744
|
+
s = []
|
745
|
+
app = lambda { |env| sleep(0.1) ; [302, [], [] ] }
|
746
|
+
cl = Clogger.new(app, :logger => s, :format => "$request_time{9,0}")
|
747
|
+
status, headers, body = cl.call(@req)
|
748
|
+
assert_nothing_raised { body.each { |x| } ; body.close }
|
749
|
+
assert s[-1].to_f >= 100000000
|
750
|
+
assert s[-1].to_f <= 300000000
|
751
|
+
end
|
752
|
+
|
753
|
+
def test_request_time_with_invalid_multiplier
|
754
|
+
s = []
|
755
|
+
app = lambda { |env| sleep(0.1) ; [302, [], [] ] }
|
756
|
+
assert_raise(ArgumentError) {
|
757
|
+
cl = Clogger.new(app, :logger => s, :format => "$request_time{10,0}")
|
758
|
+
}
|
759
|
+
end
|
760
|
+
|
724
761
|
def test_insanely_long_time_format
|
725
762
|
s = []
|
726
763
|
app = lambda { |env| [200, [], [] ] }
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: clogger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- cloggers
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-08-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|