haproxy_log_parser 2.0.0 → 2.1.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/VERSION +1 -1
- data/lib/haproxy_log_parser/line.treetop +54 -2
- data/spec/haproxy_log_parser_spec.rb +36 -0
- data/spec/sample.log +1 -0
- data/spec/test_ips.log +16 -0
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 82510f6d05e2f12c1f2fdb34da5c49bfbfe7c416
|
4
|
+
data.tar.gz: 5099552b7e372eae22dc135d2234e74780cbd24f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ea79ad889e8b96dffb7cadb627ff419faa931f6abcc37ce3d82d31ca69506f2a52eaae26848bae953e53aec9e4a51bd2f4c737c85a579e9b8798446870e2a342
|
7
|
+
data.tar.gz: 45f033eb110c98d4e0018d02b9aa8cad1b3533e4f8c01304e31b18a62de77eea4450e76440bd84713ea2842904ec3f73d1bfa0e4e806fbd624054556a972e1ed
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.1.0
|
@@ -2,7 +2,7 @@ module HAProxyLogParser
|
|
2
2
|
grammar Line
|
3
3
|
rule line
|
4
4
|
syslog_portion:([^\[]+ '[' integer ']: ')
|
5
|
-
client_ip:
|
5
|
+
client_ip:ip_address ':' client_port:integer ' '
|
6
6
|
'[' accept_date '] '
|
7
7
|
suffix:(normal_suffix / error_suffix)
|
8
8
|
"\n"?
|
@@ -38,8 +38,60 @@ module HAProxyLogParser
|
|
38
38
|
([0-9] 2..2 ':') 2..2 ([0-9] 2..2)
|
39
39
|
end
|
40
40
|
|
41
|
+
rule ip_address
|
42
|
+
# Asserting port is a little hacky but required because of the way
|
43
|
+
# HAProxy writes IPv6 addresses in the logs. It uses a valid RFC5952
|
44
|
+
# method of IP:PORT, but this complicates things by having valid IP:PORT
|
45
|
+
# combos that are themselves valid IPv6 addresses.
|
46
|
+
# e.g. 1::2:123
|
47
|
+
ip4_address / ip6_address_assert_port
|
48
|
+
end
|
49
|
+
|
41
50
|
rule ip4_address
|
42
|
-
|
51
|
+
dec_octet '.' dec_octet '.' dec_octet '.' dec_octet
|
52
|
+
end
|
53
|
+
|
54
|
+
rule colon_port
|
55
|
+
':' integer ' '
|
56
|
+
end
|
57
|
+
|
58
|
+
rule ip6_address_assert_port
|
59
|
+
# Taken from https://tools.ietf.org/html/rfc3986#section-3.2.2
|
60
|
+
# Performs look-ahead assertion on the port, assuming format IP:PORT
|
61
|
+
( h16 ':' ) 6..6 ls32 &colon_port
|
62
|
+
/ '::' ( h16 ':' ) 5..5 ls32 &colon_port
|
63
|
+
/ ( h16 )? '::' ( h16 ':' ) 4..4 ls32 &colon_port
|
64
|
+
/ ( h16 ( ':' h16 ) ..1 )? '::' ( h16 ':' ) 3..3 ls32 &colon_port
|
65
|
+
/ ( h16 ( ':' h16 ) ..2 )? '::' ( h16 ':' ) 2..2 ls32 &colon_port
|
66
|
+
/ ( h16 ( ':' h16 ) ..3 )? '::' h16 ':' ls32 &colon_port
|
67
|
+
/ ( h16 ( ':' h16 ) ..4 )? '::' ls32 &colon_port
|
68
|
+
/ ( h16 ( ':' h16 ) ..5 )? '::' h16 &colon_port
|
69
|
+
/ ( h16 ( ':' h16 ) ..6 )? '::' &colon_port
|
70
|
+
end
|
71
|
+
|
72
|
+
rule ls32
|
73
|
+
# least-significant 32 bits of address
|
74
|
+
( h16 ':' h16 ) / ip4_address
|
75
|
+
end
|
76
|
+
|
77
|
+
rule h16
|
78
|
+
# 16 bits of address represented in hexadecimal
|
79
|
+
hex_digit 1..4
|
80
|
+
end
|
81
|
+
|
82
|
+
rule hex_digit
|
83
|
+
[a-f0-9A-F]
|
84
|
+
end
|
85
|
+
|
86
|
+
rule dec_octet
|
87
|
+
'25' [0-5]
|
88
|
+
/ '2' [0-4] dec_digit
|
89
|
+
/ '1' dec_digit 2..2
|
90
|
+
/ dec_digit 1..2
|
91
|
+
end
|
92
|
+
|
93
|
+
rule dec_digit
|
94
|
+
[0-9]
|
43
95
|
end
|
44
96
|
|
45
97
|
rule accept_date
|
@@ -6,6 +6,9 @@ RSpec.describe HAProxyLogParser do
|
|
6
6
|
map { |line| line.split(',', 2) }
|
7
7
|
]
|
8
8
|
|
9
|
+
TEST_IP_ADDRESSES = IO.readlines(File.join(File.dirname(__FILE__), 'test_ips.log')).
|
10
|
+
map { |line| line.chomp }
|
11
|
+
|
9
12
|
describe '.parse' do
|
10
13
|
it 'parses the good1 case correctly' do
|
11
14
|
entry = HAProxyLogParser.parse(LINES['good1'])
|
@@ -69,6 +72,39 @@ RSpec.describe HAProxyLogParser do
|
|
69
72
|
expect(entry.http_request).to eq('GET /images/image.gif HTTP/1.1')
|
70
73
|
end
|
71
74
|
|
75
|
+
TEST_IP_ADDRESSES.each do |test_ip|
|
76
|
+
it "parses generic case with test IP #{test_ip} correctly" do
|
77
|
+
entry = HAProxyLogParser.parse(LINES['generic_ip_test'].sub(/IPADDRESS/, test_ip))
|
78
|
+
expect(entry.client_ip).to eq(test_ip)
|
79
|
+
expect(entry.client_port).to eq(50679)
|
80
|
+
expect(entry.accept_date).to eq(Time.local(2012, 5, 21, 1, 35, 46, 146))
|
81
|
+
expect(entry.frontend_name).to eq('webapp')
|
82
|
+
expect(entry).to_not be_ssl
|
83
|
+
expect(entry.backend_name).to eq('webapp_backend')
|
84
|
+
expect(entry.server_name).to eq('web09')
|
85
|
+
expect(entry.tq).to eq(27)
|
86
|
+
expect(entry.tw).to eq(0)
|
87
|
+
expect(entry.tc).to eq(1)
|
88
|
+
expect(entry.tr).to eq(0)
|
89
|
+
expect(entry.tt).to eq(217)
|
90
|
+
expect(entry.status_code).to eq(200)
|
91
|
+
expect(entry.bytes_read).to eq(1367)
|
92
|
+
expect(entry.captured_request_cookie).to eq({'session' => 'abc'})
|
93
|
+
expect(entry.captured_response_cookie).to eq({'session' => 'xyz'})
|
94
|
+
expect(entry.termination_state).to eq('----')
|
95
|
+
expect(entry.actconn).to eq(600)
|
96
|
+
expect(entry.feconn).to eq(529)
|
97
|
+
expect(entry.beconn).to eq(336)
|
98
|
+
expect(entry.srv_conn).to eq(158)
|
99
|
+
expect(entry.retries).to eq(0)
|
100
|
+
expect(entry.srv_queue).to eq(0)
|
101
|
+
expect(entry.backend_queue).to eq(0)
|
102
|
+
expect(entry.captured_request_headers).to eq(['|| {5F41}', 'http://google.com/', ''])
|
103
|
+
expect(entry.captured_response_headers).to eq([])
|
104
|
+
expect(entry.http_request).to eq('GET /images/image.gif HTTP/1.1')
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
72
108
|
it 'parses connection error lines correctly' do
|
73
109
|
entry = HAProxyLogParser.parse(LINES['error1'])
|
74
110
|
expect(entry.client_ip).to eq('127.0.0.1')
|
data/spec/sample.log
CHANGED
@@ -1,3 +1,4 @@
|
|
1
1
|
good1,Aug 9 20:30:46 localhost haproxy[2022]: 10.0.8.2:34028 [09/Aug/2011:20:30:46.429] proxy-out~ proxy-out/cache1 1/0/2/126/+128 301 +223 - - LR-- 617/523/336/168/0 0/0 {www.sytadin.equipement.gouv.fr||http://trafic.1wt.eu/} {Apache|230|||http://www.sytadin.} "GET / HTTP/1.1"
|
2
2
|
good2,May 21 01:35:46 10.18.237.5 haproxy[26747]: 192.168.1.215:50679 [21/May/2012:01:35:46.146] webapp webapp_backend/web09 27/0/1/0/217 200 1367 session=abc session=xyz ---- 600/529/336/158/0 0/0 {#7C#7C #7B5F41#7D|http://google.com/|} "GET /images/image.gif HTTP/1.1"
|
3
|
+
generic_ip_test,May 21 01:35:46 10.18.237.5 haproxy[26747]: IPADDRESS:50679 [21/May/2012:01:35:46.146] webapp webapp_backend/web09 27/0/1/0/217 200 1367 session=abc session=xyz ---- 600/529/336/158/0 0/0 {#7C#7C #7B5F41#7D|http://google.com/|} "GET /images/image.gif HTTP/1.1"
|
3
4
|
error1,Dec 3 18:27:14 localhost haproxy[6103]: 127.0.0.1:56059 [03/Dec/2012:17:35:10.380] frt/f1: Connection error during SSL handshake
|
data/spec/test_ips.log
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
12::3a:829
|
2
|
+
123.41.31.2
|
3
|
+
127.0.0.1
|
4
|
+
2.3.4.50
|
5
|
+
2001:db8::42:8329
|
6
|
+
::ffff:192.0.2.128
|
7
|
+
2001:0db8:85a3:08d3:1319:8a2e:0370:7334
|
8
|
+
201:0db8:85a3::1319:8a2e:0370:7344
|
9
|
+
2001:0DB8:0::0:1428:57ab
|
10
|
+
2001:0DB8::1428:57ab
|
11
|
+
::ffff:192.168.89.9
|
12
|
+
::ffff:c0a8:5909
|
13
|
+
::1.2.3.4
|
14
|
+
::c0a8:5909
|
15
|
+
::192.0.2.128
|
16
|
+
1::2:123
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: haproxy_log_parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Toby Hsieh
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-06-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: treetop
|
@@ -56,6 +56,7 @@ files:
|
|
56
56
|
- lib/haproxy_log_parser/line.treetop
|
57
57
|
- spec/haproxy_log_parser_spec.rb
|
58
58
|
- spec/sample.log
|
59
|
+
- spec/test_ips.log
|
59
60
|
homepage: https://github.com/tobyhs/haproxy_log_parser
|
60
61
|
licenses:
|
61
62
|
- MIT
|
@@ -76,10 +77,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
76
77
|
version: '0'
|
77
78
|
requirements: []
|
78
79
|
rubyforge_project:
|
79
|
-
rubygems_version: 2.6.
|
80
|
+
rubygems_version: 2.6.11
|
80
81
|
signing_key:
|
81
82
|
specification_version: 4
|
82
83
|
summary: Parser for HAProxy logs in the HTTP log format
|
83
84
|
test_files:
|
84
85
|
- spec/haproxy_log_parser_spec.rb
|
85
86
|
- spec/sample.log
|
87
|
+
- spec/test_ips.log
|