summaryrefslogtreecommitdiffstats
path: root/collectors/log2journal/tests.d
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 02:57:58 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 02:57:58 +0000
commitbe1c7e50e1e8809ea56f2c9d472eccd8ffd73a97 (patch)
tree9754ff1ca740f6346cf8483ec915d4054bc5da2d /collectors/log2journal/tests.d
parentInitial commit. (diff)
downloadnetdata-be1c7e50e1e8809ea56f2c9d472eccd8ffd73a97.tar.xz
netdata-be1c7e50e1e8809ea56f2c9d472eccd8ffd73a97.zip
Adding upstream version 1.44.3.upstream/1.44.3upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r--collectors/log2journal/tests.d/default.output20
-rw-r--r--collectors/log2journal/tests.d/full.output77
-rw-r--r--collectors/log2journal/tests.d/full.yaml76
-rw-r--r--collectors/log2journal/tests.d/json-exclude.output153
-rw-r--r--collectors/log2journal/tests.d/json-include.output54
-rw-r--r--collectors/log2journal/tests.d/json.log3
-rw-r--r--collectors/log2journal/tests.d/json.output294
-rw-r--r--collectors/log2journal/tests.d/logfmt.log5
-rw-r--r--collectors/log2journal/tests.d/logfmt.output37
-rw-r--r--collectors/log2journal/tests.d/logfmt.yaml34
-rw-r--r--collectors/log2journal/tests.d/nginx-combined.log14
-rw-r--r--collectors/log2journal/tests.d/nginx-combined.output210
-rw-r--r--collectors/log2journal/tests.d/nginx-json.log9
-rw-r--r--collectors/log2journal/tests.d/nginx-json.output296
14 files changed, 1282 insertions, 0 deletions
diff --git a/collectors/log2journal/tests.d/default.output b/collectors/log2journal/tests.d/default.output
new file mode 100644
index 00000000..ef17cb2c
--- /dev/null
+++ b/collectors/log2journal/tests.d/default.output
@@ -0,0 +1,20 @@
+MESSAGE=key1=value01 key2=value02 key3=value03 key4=value04
+PRIORITY=6
+SYSLOG_IDENTIFIER=log2journal
+
+MESSAGE=key1=value11 key2=value12 key3=value13 key4=
+PRIORITY=6
+SYSLOG_IDENTIFIER=log2journal
+
+MESSAGE=key1=value21 key2=value22 key3=value23 key4=value24
+PRIORITY=6
+SYSLOG_IDENTIFIER=log2journal
+
+MESSAGE=key1=value31 key2=value32 key3=value33 key4=
+PRIORITY=6
+SYSLOG_IDENTIFIER=log2journal
+
+MESSAGE=key1=value41 key2=value42 key3=value43 key4=value44
+PRIORITY=6
+SYSLOG_IDENTIFIER=log2journal
+
diff --git a/collectors/log2journal/tests.d/full.output b/collectors/log2journal/tests.d/full.output
new file mode 100644
index 00000000..074092d4
--- /dev/null
+++ b/collectors/log2journal/tests.d/full.output
@@ -0,0 +1,77 @@
+pattern: |
+ (?x) # Enable PCRE2 extended mode
+ ^
+ (?<NGINX_REMOTE_ADDR>[^ ]+) \s - \s # NGINX_REMOTE_ADDR
+ (?<NGINX_REMOTE_USER>[^ ]+) \s # NGINX_REMOTE_USER
+ \[
+ (?<NGINX_TIME_LOCAL>[^\]]+) # NGINX_TIME_LOCAL
+ \]
+ \s+ "
+ (?<MESSAGE>
+ (?<NGINX_METHOD>[A-Z]+) \s+ # NGINX_METHOD
+ (?<NGINX_URL>[^ ]+) \s+
+ HTTP/(?<NGINX_HTTP_VERSION>[^"]+)
+ )
+ " \s+
+ (?<NGINX_STATUS>\d+) \s+ # NGINX_STATUS
+ (?<NGINX_BODY_BYTES_SENT>\d+) \s+ # NGINX_BODY_BYTES_SENT
+ "(?<NGINX_HTTP_REFERER>[^"]*)" \s+ # NGINX_HTTP_REFERER
+ "(?<NGINX_HTTP_USER_AGENT>[^"]*)" # NGINX_HTTP_USER_AGENT
+
+prefix: NGINX_
+
+filename:
+ key: NGINX_LOG_FILENAME
+
+filter:
+ include: '.*'
+ exclude: '.*HELLO.*WORLD.*'
+
+rename:
+ - new_key: TEST1
+ old_key: TEST2
+ - new_key: TEST3
+ old_key: TEST4
+
+inject:
+ - key: SYSLOG_IDENTIFIER
+ value: nginx-log
+ - key: SYSLOG_IDENTIFIER2
+ value: nginx-log2
+ - key: PRIORITY
+ value: '${NGINX_STATUS}'
+ - key: NGINX_STATUS_FAMILY
+ value: '${NGINX_STATUS}${NGINX_METHOD}'
+
+rewrite:
+ - key: PRIORITY
+ value: '${NGINX_STATUS}'
+ inject: yes
+ stop: no
+ - key: PRIORITY
+ match: '^[123]'
+ value: 6
+ - key: PRIORITY
+ match: '^4'
+ value: 5
+ - key: PRIORITY
+ match: '^5'
+ value: 3
+ - key: PRIORITY
+ match: '.*'
+ value: 4
+ - key: NGINX_STATUS_FAMILY
+ match: '^(?<first_digit>[1-5])'
+ value: '${first_digit}xx'
+ - key: NGINX_STATUS_FAMILY
+ match: '.*'
+ value: UNKNOWN
+
+unmatched:
+ key: MESSAGE
+
+ inject:
+ - key: PRIORITY
+ value: 1
+ - key: PRIORITY2
+ value: 2
diff --git a/collectors/log2journal/tests.d/full.yaml b/collectors/log2journal/tests.d/full.yaml
new file mode 100644
index 00000000..86cafb5a
--- /dev/null
+++ b/collectors/log2journal/tests.d/full.yaml
@@ -0,0 +1,76 @@
+pattern: |
+ (?x) # Enable PCRE2 extended mode
+ ^
+ (?<NGINX_REMOTE_ADDR>[^ ]+) \s - \s # NGINX_REMOTE_ADDR
+ (?<NGINX_REMOTE_USER>[^ ]+) \s # NGINX_REMOTE_USER
+ \[
+ (?<NGINX_TIME_LOCAL>[^\]]+) # NGINX_TIME_LOCAL
+ \]
+ \s+ "
+ (?<MESSAGE>
+ (?<NGINX_METHOD>[A-Z]+) \s+ # NGINX_METHOD
+ (?<NGINX_URL>[^ ]+) \s+
+ HTTP/(?<NGINX_HTTP_VERSION>[^"]+)
+ )
+ " \s+
+ (?<NGINX_STATUS>\d+) \s+ # NGINX_STATUS
+ (?<NGINX_BODY_BYTES_SENT>\d+) \s+ # NGINX_BODY_BYTES_SENT
+ "(?<NGINX_HTTP_REFERER>[^"]*)" \s+ # NGINX_HTTP_REFERER
+ "(?<NGINX_HTTP_USER_AGENT>[^"]*)" # NGINX_HTTP_USER_AGENT
+
+prefix: NGINX_
+
+filename:
+ key: NGINX_LOG_FILENAME
+
+filter:
+ include: '.*'
+ exclude: '.*HELLO.*WORLD.*'
+
+rename:
+ - new_key: TEST1
+ old_key: TEST2
+ - new_key: TEST3
+ old_key: TEST4
+
+inject:
+ - key: SYSLOG_IDENTIFIER
+ value: 'nginx-log'
+ - key: SYSLOG_IDENTIFIER2
+ value: 'nginx-log2'
+ - key: PRIORITY
+ value: '${NGINX_STATUS}'
+ - key: NGINX_STATUS_FAMILY
+ value: '${NGINX_STATUS}${NGINX_METHOD}'
+
+rewrite:
+ - key: "PRIORITY"
+ value: "${NGINX_STATUS}"
+ inject: yes
+ stop: no
+ - key: "PRIORITY"
+ match: "^[123]"
+ value: 6
+ - key: "PRIORITY"
+ match: "^4"
+ value: 5
+ - key: "PRIORITY"
+ match: "^5"
+ value: 3
+ - key: "PRIORITY"
+ match: ".*"
+ value: 4
+ - key: "NGINX_STATUS_FAMILY"
+ match: "^(?<first_digit>[1-5])"
+ value: "${first_digit}xx"
+ - key: "NGINX_STATUS_FAMILY"
+ match: ".*"
+ value: "UNKNOWN"
+
+unmatched:
+ key: MESSAGE
+ inject:
+ - key: PRIORITY
+ value: 1
+ - key: PRIORITY2
+ value: 2
diff --git a/collectors/log2journal/tests.d/json-exclude.output b/collectors/log2journal/tests.d/json-exclude.output
new file mode 100644
index 00000000..a8f6f83e
--- /dev/null
+++ b/collectors/log2journal/tests.d/json-exclude.output
@@ -0,0 +1,153 @@
+ARRAY2_0=1
+ARRAY2_1=-2.345
+ARRAY2_2=Array Element
+ARRAY2_3=true
+ARRAY2_4=false
+ARRAY2_5=null
+ARRAY2_6_BOOLEANFALSE=false
+ARRAY2_6_BOOLEANTRUE=true
+ARRAY2_6_FLOATNEGATIVE=-0.123
+ARRAY2_6_FLOATPOSITIVE=0.987
+ARRAY2_6_NULLVALUE=null
+ARRAY2_6_NUMERICNEGATIVE=-456
+ARRAY2_6_NUMERICPOSITIVE=123
+ARRAY2_6_SCIENTIFICFLOATNEGATIVE=-1.5e-2
+ARRAY2_6_SCIENTIFICINTPOSITIVE=6e4
+ARRAY2_6_SCIENTIFICSMALLPOSITIVE=5e-5
+ARRAY2_6_STRING=Nested Object in Array2
+ARRAY2_7_BOOLEANFALSE=false
+ARRAY2_7_BOOLEANTRUE=true
+ARRAY2_7_FLOATNEGATIVE=-2.71828
+ARRAY2_7_FLOATPOSITIVE=3.14159
+ARRAY2_7_NULLVALUE=null
+ARRAY2_7_NUMERICNEGATIVE=-123
+ARRAY2_7_NUMERICPOSITIVE=42
+ARRAY2_7_SCIENTIFICFLOATNEGATIVE=-2.5e-3
+ARRAY2_7_SCIENTIFICINTPOSITIVE=1e5
+ARRAY2_7_SCIENTIFICSMALLPOSITIVE=1e-4
+ARRAY2_7_STRING=Array Element with Object in Array2
+BOOLEANFALSE=false
+BOOLEANTRUE=true
+FLOATNEGATIVE=-2.71828
+FLOATPOSITIVE=3.14159
+NULLVALUE=null
+NUMERICNEGATIVE=-123
+NUMERICPOSITIVE=42
+OBJECT_BOOLEANFALSE=false
+OBJECT_BOOLEANTRUE=true
+OBJECT_FLOATNEGATIVE=-0.123
+OBJECT_FLOATPOSITIVE=0.987
+OBJECT_NULLVALUE=null
+OBJECT_NUMERICNEGATIVE=-456
+OBJECT_NUMERICPOSITIVE=123
+OBJECT_SCIENTIFICFLOATNEGATIVE=-1.5e-2
+OBJECT_SCIENTIFICINTPOSITIVE=6e4
+OBJECT_SCIENTIFICSMALLPOSITIVE=5e-5
+OBJECT_STRING=Nested Object
+SCIENTIFICFLOATNEGATIVE=-2.5e-3
+SCIENTIFICINTPOSITIVE=1e5
+SCIENTIFICSMALLPOSITIVE=1e-4
+STRING=Hello, World!
+
+ARRAY2_0=1
+ARRAY2_1=-2.345
+ARRAY2_2=Array Element
+ARRAY2_3=true
+ARRAY2_4=false
+ARRAY2_5=null
+ARRAY2_6_BOOLEANFALSE=false
+ARRAY2_6_BOOLEANTRUE=true
+ARRAY2_6_FLOATNEGATIVE=-0.123
+ARRAY2_6_FLOATPOSITIVE=0.987
+ARRAY2_6_NULLVALUE=null
+ARRAY2_6_NUMERICNEGATIVE=-456
+ARRAY2_6_NUMERICPOSITIVE=123
+ARRAY2_6_SCIENTIFICFLOATNEGATIVE=-1.5e-2
+ARRAY2_6_SCIENTIFICINTPOSITIVE=6e4
+ARRAY2_6_SCIENTIFICSMALLPOSITIVE=5e-5
+ARRAY2_6_STRING=Nested Object in Array2
+ARRAY2_7_BOOLEANFALSE=false
+ARRAY2_7_BOOLEANTRUE=true
+ARRAY2_7_FLOATNEGATIVE=-2.71828
+ARRAY2_7_FLOATPOSITIVE=3.14159
+ARRAY2_7_NULLVALUE=null
+ARRAY2_7_NUMERICNEGATIVE=-123
+ARRAY2_7_NUMERICPOSITIVE=42
+ARRAY2_7_SCIENTIFICFLOATNEGATIVE=-2.5e-3
+ARRAY2_7_SCIENTIFICINTPOSITIVE=1e5
+ARRAY2_7_SCIENTIFICSMALLPOSITIVE=1e-4
+ARRAY2_7_STRING=Array Element with Object in Array2
+BOOLEANFALSE=false
+BOOLEANTRUE=true
+FLOATNEGATIVE=-2.71828
+FLOATPOSITIVE=3.14159
+NULLVALUE=null
+NUMERICNEGATIVE=-123
+NUMERICPOSITIVE=42
+OBJECT_BOOLEANFALSE=false
+OBJECT_BOOLEANTRUE=true
+OBJECT_FLOATNEGATIVE=-0.123
+OBJECT_FLOATPOSITIVE=0.987
+OBJECT_NULLVALUE=null
+OBJECT_NUMERICNEGATIVE=-456
+OBJECT_NUMERICPOSITIVE=123
+OBJECT_SCIENTIFICFLOATNEGATIVE=-1.5e-2
+OBJECT_SCIENTIFICINTPOSITIVE=6e4
+OBJECT_SCIENTIFICSMALLPOSITIVE=5e-5
+OBJECT_STRING=Nested Object
+SCIENTIFICFLOATNEGATIVE=-2.5e-3
+SCIENTIFICINTPOSITIVE=1e5
+SCIENTIFICSMALLPOSITIVE=1e-4
+STRING=Hello, World!
+
+ARRAY2_0=1
+ARRAY2_1=-2.345
+ARRAY2_2=Array Element
+ARRAY2_3=true
+ARRAY2_4=false
+ARRAY2_5=null
+ARRAY2_6_BOOLEANFALSE=false
+ARRAY2_6_BOOLEANTRUE=true
+ARRAY2_6_FLOATNEGATIVE=-0.123
+ARRAY2_6_FLOATPOSITIVE=0.987
+ARRAY2_6_NULLVALUE=null
+ARRAY2_6_NUMERICNEGATIVE=-456
+ARRAY2_6_NUMERICPOSITIVE=123
+ARRAY2_6_SCIENTIFICFLOATNEGATIVE=-1.5e-2
+ARRAY2_6_SCIENTIFICINTPOSITIVE=6e4
+ARRAY2_6_SCIENTIFICSMALLPOSITIVE=5e-5
+ARRAY2_6_STRING=Nested Object in Array2
+ARRAY2_7_BOOLEANFALSE=false
+ARRAY2_7_BOOLEANTRUE=true
+ARRAY2_7_FLOATNEGATIVE=-2.71828
+ARRAY2_7_FLOATPOSITIVE=3.14159
+ARRAY2_7_NULLVALUE=null
+ARRAY2_7_NUMERICNEGATIVE=-123
+ARRAY2_7_NUMERICPOSITIVE=42
+ARRAY2_7_SCIENTIFICFLOATNEGATIVE=-2.5e-3
+ARRAY2_7_SCIENTIFICINTPOSITIVE=1e5
+ARRAY2_7_SCIENTIFICSMALLPOSITIVE=1e-4
+ARRAY2_7_STRING=Array Element with Object in Array2
+BOOLEANFALSE=false
+BOOLEANTRUE=true
+FLOATNEGATIVE=-2.71828
+FLOATPOSITIVE=3.14159
+NULLVALUE=null
+NUMERICNEGATIVE=-123
+NUMERICPOSITIVE=42
+OBJECT_BOOLEANFALSE=false
+OBJECT_BOOLEANTRUE=true
+OBJECT_FLOATNEGATIVE=-0.123
+OBJECT_FLOATPOSITIVE=0.987
+OBJECT_NULLVALUE=null
+OBJECT_NUMERICNEGATIVE=-456
+OBJECT_NUMERICPOSITIVE=123
+OBJECT_SCIENTIFICFLOATNEGATIVE=-1.5e-2
+OBJECT_SCIENTIFICINTPOSITIVE=6e4
+OBJECT_SCIENTIFICSMALLPOSITIVE=5e-5
+OBJECT_STRING=Nested Object
+SCIENTIFICFLOATNEGATIVE=-2.5e-3
+SCIENTIFICINTPOSITIVE=1e5
+SCIENTIFICSMALLPOSITIVE=1e-4
+STRING=Hello, World!
+
diff --git a/collectors/log2journal/tests.d/json-include.output b/collectors/log2journal/tests.d/json-include.output
new file mode 100644
index 00000000..326c58da
--- /dev/null
+++ b/collectors/log2journal/tests.d/json-include.output
@@ -0,0 +1,54 @@
+OBJECT_ARRAY_0=1
+OBJECT_ARRAY_1=-2
+OBJECT_ARRAY_2=3
+OBJECT_ARRAY_3=Nested Array
+OBJECT_ARRAY_4=true
+OBJECT_ARRAY_5=null
+OBJECT_BOOLEANFALSE=false
+OBJECT_BOOLEANTRUE=true
+OBJECT_FLOATNEGATIVE=-0.123
+OBJECT_FLOATPOSITIVE=0.987
+OBJECT_NULLVALUE=null
+OBJECT_NUMERICNEGATIVE=-456
+OBJECT_NUMERICPOSITIVE=123
+OBJECT_SCIENTIFICFLOATNEGATIVE=-1.5e-2
+OBJECT_SCIENTIFICINTPOSITIVE=6e4
+OBJECT_SCIENTIFICSMALLPOSITIVE=5e-5
+OBJECT_STRING=Nested Object
+
+OBJECT_ARRAY_0=1
+OBJECT_ARRAY_1=-2
+OBJECT_ARRAY_2=3
+OBJECT_ARRAY_3=Nested Array
+OBJECT_ARRAY_4=true
+OBJECT_ARRAY_5=null
+OBJECT_BOOLEANFALSE=false
+OBJECT_BOOLEANTRUE=true
+OBJECT_FLOATNEGATIVE=-0.123
+OBJECT_FLOATPOSITIVE=0.987
+OBJECT_NULLVALUE=null
+OBJECT_NUMERICNEGATIVE=-456
+OBJECT_NUMERICPOSITIVE=123
+OBJECT_SCIENTIFICFLOATNEGATIVE=-1.5e-2
+OBJECT_SCIENTIFICINTPOSITIVE=6e4
+OBJECT_SCIENTIFICSMALLPOSITIVE=5e-5
+OBJECT_STRING=Nested Object
+
+OBJECT_ARRAY_0=1
+OBJECT_ARRAY_1=-2
+OBJECT_ARRAY_2=3
+OBJECT_ARRAY_3=Nested Array
+OBJECT_ARRAY_4=true
+OBJECT_ARRAY_5=null
+OBJECT_BOOLEANFALSE=false
+OBJECT_BOOLEANTRUE=true
+OBJECT_FLOATNEGATIVE=-0.123
+OBJECT_FLOATPOSITIVE=0.987
+OBJECT_NULLVALUE=null
+OBJECT_NUMERICNEGATIVE=-456
+OBJECT_NUMERICPOSITIVE=123
+OBJECT_SCIENTIFICFLOATNEGATIVE=-1.5e-2
+OBJECT_SCIENTIFICINTPOSITIVE=6e4
+OBJECT_SCIENTIFICSMALLPOSITIVE=5e-5
+OBJECT_STRING=Nested Object
+
diff --git a/collectors/log2journal/tests.d/json.log b/collectors/log2journal/tests.d/json.log
new file mode 100644
index 00000000..3f133496
--- /dev/null
+++ b/collectors/log2journal/tests.d/json.log
@@ -0,0 +1,3 @@
+{ "numericPositive": 42, "numericNegative": -123, "floatPositive": 3.14159, "floatNegative": -2.71828, "scientificIntPositive": 1e5, "scientificFloatNegative": -2.5e-3, "scientificSmallPositive": 1e-4, "booleanTrue": true, "booleanFalse": false, "string": "Hello, World!", "nullValue": null, "object": { "numericPositive": 123, "numericNegative": -456, "floatPositive": 0.987, "floatNegative": -0.123, "scientificIntPositive": 6e4, "scientificFloatNegative": -1.5e-2, "scientificSmallPositive": 5e-5, "booleanTrue": true, "booleanFalse": false, "string": "Nested Object", "nullValue": null, "array": [1, -2, 3, "Nested Array", true, null] }, "array": [ 1, -2.345, "Array Element", true, false, null, { "numericPositive": 987, "numericNegative": -654, "string": "Nested Object in Array", "array": [null, false, true] }, { "numericPositive": 42, "numericNegative": -123, "floatPositive": 3.14159, "floatNegative": -2.71828, "scientificIntPositive": 1e5, "scientificFloatNegative": -2.5e-3, "scientificSmallPositive": 1e-4, "booleanTrue": true, "booleanFalse": false, "string": "Array Element with Object", "nullValue": null, "array": [1, -2, 3, "Nested Array in Object", true, null] } ], "array2": [ 1, -2.345, "Array Element", true, false, null, { "numericPositive": 123, "numericNegative": -456, "floatPositive": 0.987, "floatNegative": -0.123, "scientificIntPositive": 6e4, "scientificFloatNegative": -1.5e-2, "scientificSmallPositive": 5e-5, "booleanTrue": true, "booleanFalse": false, "string": "Nested Object in Array2", "nullValue": null, "array": [1, -2, 3, "Nested Array in Object2", true, null] }, { "numericPositive": 42, "numericNegative": -123, "floatPositive": 3.14159, "floatNegative": -2.71828, "scientificIntPositive": 1e5, "scientificFloatNegative": -2.5e-3, "scientificSmallPositive": 1e-4, "booleanTrue": true, "booleanFalse": false, "string": "Array Element with Object in Array2", "nullValue": null, "array": [1, -2, 3, "Nested Array in Object2", true, null]}]}
+{ "numericPositive": 42, "numericNegative": -123, "floatPositive": 3.14159, "floatNegative": -2.71828, "scientificIntPositive": 1e5, "scientificFloatNegative": -2.5e-3, "scientificSmallPositive": 1e-4, "booleanTrue": true, "booleanFalse": false, "string": "Hello, World!", "nullValue": null, "object": { "numericPositive": 123, "numericNegative": -456, "floatPositive": 0.987, "floatNegative": -0.123, "scientificIntPositive": 6e4, "scientificFloatNegative": -1.5e-2, "scientificSmallPositive": 5e-5, "booleanTrue": true, "booleanFalse": false, "string": "Nested Object", "nullValue": null, "array": [1, -2, 3, "Nested Array", true, null] }, "array": [ 1, -2.345, "Array Element", true, false, null, { "numericPositive": 987, "numericNegative": -654, "string": "Nested Object in Array", "array": [null, false, true] }, { "numericPositive": 42, "numericNegative": -123, "floatPositive": 3.14159, "floatNegative": -2.71828, "scientificIntPositive": 1e5, "scientificFloatNegative": -2.5e-3, "scientificSmallPositive": 1e-4, "booleanTrue": true, "booleanFalse": false, "string": "Array Element with Object", "nullValue": null, "array": [1, -2, 3, "Nested Array in Object", true, null] } ], "array2": [ 1, -2.345, "Array Element", true, false, null, { "numericPositive": 123, "numericNegative": -456, "floatPositive": 0.987, "floatNegative": -0.123, "scientificIntPositive": 6e4, "scientificFloatNegative": -1.5e-2, "scientificSmallPositive": 5e-5, "booleanTrue": true, "booleanFalse": false, "string": "Nested Object in Array2", "nullValue": null, "array": [1, -2, 3, "Nested Array in Object2", true, null] }, { "numericPositive": 42, "numericNegative": -123, "floatPositive": 3.14159, "floatNegative": -2.71828, "scientificIntPositive": 1e5, "scientificFloatNegative": -2.5e-3, "scientificSmallPositive": 1e-4, "booleanTrue": true, "booleanFalse": false, "string": "Array Element with Object in Array2", "nullValue": null, "array": [1, -2, 3, "Nested Array in Object2", true, null]}]}
+{ "numericPositive": 42, "numericNegative": -123, "floatPositive": 3.14159, "floatNegative": -2.71828, "scientificIntPositive": 1e5, "scientificFloatNegative": -2.5e-3, "scientificSmallPositive": 1e-4, "booleanTrue": true, "booleanFalse": false, "string": "Hello, World!", "nullValue": null, "object": { "numericPositive": 123, "numericNegative": -456, "floatPositive": 0.987, "floatNegative": -0.123, "scientificIntPositive": 6e4, "scientificFloatNegative": -1.5e-2, "scientificSmallPositive": 5e-5, "booleanTrue": true, "booleanFalse": false, "string": "Nested Object", "nullValue": null, "array": [1, -2, 3, "Nested Array", true, null] }, "array": [ 1, -2.345, "Array Element", true, false, null, { "numericPositive": 987, "numericNegative": -654, "string": "Nested Object in Array", "array": [null, false, true] }, { "numericPositive": 42, "numericNegative": -123, "floatPositive": 3.14159, "floatNegative": -2.71828, "scientificIntPositive": 1e5, "scientificFloatNegative": -2.5e-3, "scientificSmallPositive": 1e-4, "booleanTrue": true, "booleanFalse": false, "string": "Array Element with Object", "nullValue": null, "array": [1, -2, 3, "Nested Array in Object", true, null] } ], "array2": [ 1, -2.345, "Array Element", true, false, null, { "numericPositive": 123, "numericNegative": -456, "floatPositive": 0.987, "floatNegative": -0.123, "scientificIntPositive": 6e4, "scientificFloatNegative": -1.5e-2, "scientificSmallPositive": 5e-5, "booleanTrue": true, "booleanFalse": false, "string": "Nested Object in Array2", "nullValue": null, "array": [1, -2, 3, "Nested Array in Object2", true, null] }, { "numericPositive": 42, "numericNegative": -123, "floatPositive": 3.14159, "floatNegative": -2.71828, "scientificIntPositive": 1e5, "scientificFloatNegative": -2.5e-3, "scientificSmallPositive": 1e-4, "booleanTrue": true, "booleanFalse": false, "string": "Array Element with Object in Array2", "nullValue": null, "array": [1, -2, 3, "Nested Array in Object2", true, null]}]}
diff --git a/collectors/log2journal/tests.d/json.output b/collectors/log2journal/tests.d/json.output
new file mode 100644
index 00000000..83499cc5
--- /dev/null
+++ b/collectors/log2journal/tests.d/json.output
@@ -0,0 +1,294 @@
+ARRAY2_0=1
+ARRAY2_1=-2.345
+ARRAY2_2=Array Element
+ARRAY2_3=true
+ARRAY2_4=false
+ARRAY2_5=null
+ARRAY2_6_ARRAY_0=1
+ARRAY2_6_ARRAY_1=-2
+ARRAY2_6_ARRAY_2=3
+ARRAY2_6_ARRAY_3=Nested Array in Object2
+ARRAY2_6_ARRAY_4=true
+ARRAY2_6_ARRAY_5=null
+ARRAY2_6_BOOLEANFALSE=false
+ARRAY2_6_BOOLEANTRUE=true
+ARRAY2_6_FLOATNEGATIVE=-0.123
+ARRAY2_6_FLOATPOSITIVE=0.987
+ARRAY2_6_NULLVALUE=null
+ARRAY2_6_NUMERICNEGATIVE=-456
+ARRAY2_6_NUMERICPOSITIVE=123
+ARRAY2_6_SCIENTIFICFLOATNEGATIVE=-1.5e-2
+ARRAY2_6_SCIENTIFICINTPOSITIVE=6e4
+ARRAY2_6_SCIENTIFICSMALLPOSITIVE=5e-5
+ARRAY2_6_STRING=Nested Object in Array2
+ARRAY2_7_ARRAY_0=1
+ARRAY2_7_ARRAY_1=-2
+ARRAY2_7_ARRAY_2=3
+ARRAY2_7_ARRAY_3=Nested Array in Object2
+ARRAY2_7_ARRAY_4=true
+ARRAY2_7_ARRAY_5=null
+ARRAY2_7_BOOLEANFALSE=false
+ARRAY2_7_BOOLEANTRUE=true
+ARRAY2_7_FLOATNEGATIVE=-2.71828
+ARRAY2_7_FLOATPOSITIVE=3.14159
+ARRAY2_7_NULLVALUE=null
+ARRAY2_7_NUMERICNEGATIVE=-123
+ARRAY2_7_NUMERICPOSITIVE=42
+ARRAY2_7_SCIENTIFICFLOATNEGATIVE=-2.5e-3
+ARRAY2_7_SCIENTIFICINTPOSITIVE=1e5
+ARRAY2_7_SCIENTIFICSMALLPOSITIVE=1e-4
+ARRAY2_7_STRING=Array Element with Object in Array2
+ARRAY_0=1
+ARRAY_1=-2.345
+ARRAY_2=Array Element
+ARRAY_3=true
+ARRAY_4=false
+ARRAY_5=null
+ARRAY_6_ARRAY_0=null
+ARRAY_6_ARRAY_1=false
+ARRAY_6_ARRAY_2=true
+ARRAY_6_NUMERICNEGATIVE=-654
+ARRAY_6_NUMERICPOSITIVE=987
+ARRAY_6_STRING=Nested Object in Array
+ARRAY_7_ARRAY_0=1
+ARRAY_7_ARRAY_1=-2
+ARRAY_7_ARRAY_2=3
+ARRAY_7_ARRAY_3=Nested Array in Object
+ARRAY_7_ARRAY_4=true
+ARRAY_7_ARRAY_5=null
+ARRAY_7_BOOLEANFALSE=false
+ARRAY_7_BOOLEANTRUE=true
+ARRAY_7_FLOATNEGATIVE=-2.71828
+ARRAY_7_FLOATPOSITIVE=3.14159
+ARRAY_7_NULLVALUE=null
+ARRAY_7_NUMERICNEGATIVE=-123
+ARRAY_7_NUMERICPOSITIVE=42
+ARRAY_7_SCIENTIFICFLOATNEGATIVE=-2.5e-3
+ARRAY_7_SCIENTIFICINTPOSITIVE=1e5
+ARRAY_7_SCIENTIFICSMALLPOSITIVE=1e-4
+ARRAY_7_STRING=Array Element with Object
+BOOLEANFALSE=false
+BOOLEANTRUE=true
+FLOATNEGATIVE=-2.71828
+FLOATPOSITIVE=3.14159
+NULLVALUE=null
+NUMERICNEGATIVE=-123
+NUMERICPOSITIVE=42
+OBJECT_ARRAY_0=1
+OBJECT_ARRAY_1=-2
+OBJECT_ARRAY_2=3
+OBJECT_ARRAY_3=Nested Array
+OBJECT_ARRAY_4=true
+OBJECT_ARRAY_5=null
+OBJECT_BOOLEANFALSE=false
+OBJECT_BOOLEANTRUE=true
+OBJECT_FLOATNEGATIVE=-0.123
+OBJECT_FLOATPOSITIVE=0.987
+OBJECT_NULLVALUE=null
+OBJECT_NUMERICNEGATIVE=-456
+OBJECT_NUMERICPOSITIVE=123
+OBJECT_SCIENTIFICFLOATNEGATIVE=-1.5e-2
+OBJECT_SCIENTIFICINTPOSITIVE=6e4
+OBJECT_SCIENTIFICSMALLPOSITIVE=5e-5
+OBJECT_STRING=Nested Object
+SCIENTIFICFLOATNEGATIVE=-2.5e-3
+SCIENTIFICINTPOSITIVE=1e5
+SCIENTIFICSMALLPOSITIVE=1e-4
+STRING=Hello, World!
+
+ARRAY2_0=1
+ARRAY2_1=-2.345
+ARRAY2_2=Array Element
+ARRAY2_3=true
+ARRAY2_4=false
+ARRAY2_5=null
+ARRAY2_6_ARRAY_0=1
+ARRAY2_6_ARRAY_1=-2
+ARRAY2_6_ARRAY_2=3
+ARRAY2_6_ARRAY_3=Nested Array in Object2
+ARRAY2_6_ARRAY_4=true
+ARRAY2_6_ARRAY_5=null
+ARRAY2_6_BOOLEANFALSE=false
+ARRAY2_6_BOOLEANTRUE=true
+ARRAY2_6_FLOATNEGATIVE=-0.123
+ARRAY2_6_FLOATPOSITIVE=0.987
+ARRAY2_6_NULLVALUE=null
+ARRAY2_6_NUMERICNEGATIVE=-456
+ARRAY2_6_NUMERICPOSITIVE=123
+ARRAY2_6_SCIENTIFICFLOATNEGATIVE=-1.5e-2
+ARRAY2_6_SCIENTIFICINTPOSITIVE=6e4
+ARRAY2_6_SCIENTIFICSMALLPOSITIVE=5e-5
+ARRAY2_6_STRING=Nested Object in Array2
+ARRAY2_7_ARRAY_0=1
+ARRAY2_7_ARRAY_1=-2
+ARRAY2_7_ARRAY_2=3
+ARRAY2_7_ARRAY_3=Nested Array in Object2
+ARRAY2_7_ARRAY_4=true
+ARRAY2_7_ARRAY_5=null
+ARRAY2_7_BOOLEANFALSE=false
+ARRAY2_7_BOOLEANTRUE=true
+ARRAY2_7_FLOATNEGATIVE=-2.71828
+ARRAY2_7_FLOATPOSITIVE=3.14159
+ARRAY2_7_NULLVALUE=null
+ARRAY2_7_NUMERICNEGATIVE=-123
+ARRAY2_7_NUMERICPOSITIVE=42
+ARRAY2_7_SCIENTIFICFLOATNEGATIVE=-2.5e-3
+ARRAY2_7_SCIENTIFICINTPOSITIVE=1e5
+ARRAY2_7_SCIENTIFICSMALLPOSITIVE=1e-4
+ARRAY2_7_STRING=Array Element with Object in Array2
+ARRAY_0=1
+ARRAY_1=-2.345
+ARRAY_2=Array Element
+ARRAY_3=true
+ARRAY_4=false
+ARRAY_5=null
+ARRAY_6_ARRAY_0=null
+ARRAY_6_ARRAY_1=false
+ARRAY_6_ARRAY_2=true
+ARRAY_6_NUMERICNEGATIVE=-654
+ARRAY_6_NUMERICPOSITIVE=987
+ARRAY_6_STRING=Nested Object in Array
+ARRAY_7_ARRAY_0=1
+ARRAY_7_ARRAY_1=-2
+ARRAY_7_ARRAY_2=3
+ARRAY_7_ARRAY_3=Nested Array in Object
+ARRAY_7_ARRAY_4=true
+ARRAY_7_ARRAY_5=null
+ARRAY_7_BOOLEANFALSE=false
+ARRAY_7_BOOLEANTRUE=true
+ARRAY_7_FLOATNEGATIVE=-2.71828
+ARRAY_7_FLOATPOSITIVE=3.14159
+ARRAY_7_NULLVALUE=null
+ARRAY_7_NUMERICNEGATIVE=-123
+ARRAY_7_NUMERICPOSITIVE=42
+ARRAY_7_SCIENTIFICFLOATNEGATIVE=-2.5e-3
+ARRAY_7_SCIENTIFICINTPOSITIVE=1e5
+ARRAY_7_SCIENTIFICSMALLPOSITIVE=1e-4
+ARRAY_7_STRING=Array Element with Object
+BOOLEANFALSE=false
+BOOLEANTRUE=true
+FLOATNEGATIVE=-2.71828
+FLOATPOSITIVE=3.14159
+NULLVALUE=null
+NUMERICNEGATIVE=-123
+NUMERICPOSITIVE=42
+OBJECT_ARRAY_0=1
+OBJECT_ARRAY_1=-2
+OBJECT_ARRAY_2=3
+OBJECT_ARRAY_3=Nested Array
+OBJECT_ARRAY_4=true
+OBJECT_ARRAY_5=null
+OBJECT_BOOLEANFALSE=false
+OBJECT_BOOLEANTRUE=true
+OBJECT_FLOATNEGATIVE=-0.123
+OBJECT_FLOATPOSITIVE=0.987
+OBJECT_NULLVALUE=null
+OBJECT_NUMERICNEGATIVE=-456
+OBJECT_NUMERICPOSITIVE=123
+OBJECT_SCIENTIFICFLOATNEGATIVE=-1.5e-2
+OBJECT_SCIENTIFICINTPOSITIVE=6e4
+OBJECT_SCIENTIFICSMALLPOSITIVE=5e-5
+OBJECT_STRING=Nested Object
+SCIENTIFICFLOATNEGATIVE=-2.5e-3
+SCIENTIFICINTPOSITIVE=1e5
+SCIENTIFICSMALLPOSITIVE=1e-4
+STRING=Hello, World!
+
+ARRAY2_0=1
+ARRAY2_1=-2.345
+ARRAY2_2=Array Element
+ARRAY2_3=true
+ARRAY2_4=false
+ARRAY2_5=null
+ARRAY2_6_ARRAY_0=1
+ARRAY2_6_ARRAY_1=-2
+ARRAY2_6_ARRAY_2=3
+ARRAY2_6_ARRAY_3=Nested Array in Object2
+ARRAY2_6_ARRAY_4=true
+ARRAY2_6_ARRAY_5=null
+ARRAY2_6_BOOLEANFALSE=false
+ARRAY2_6_BOOLEANTRUE=true
+ARRAY2_6_FLOATNEGATIVE=-0.123
+ARRAY2_6_FLOATPOSITIVE=0.987
+ARRAY2_6_NULLVALUE=null
+ARRAY2_6_NUMERICNEGATIVE=-456
+ARRAY2_6_NUMERICPOSITIVE=123
+ARRAY2_6_SCIENTIFICFLOATNEGATIVE=-1.5e-2
+ARRAY2_6_SCIENTIFICINTPOSITIVE=6e4
+ARRAY2_6_SCIENTIFICSMALLPOSITIVE=5e-5
+ARRAY2_6_STRING=Nested Object in Array2
+ARRAY2_7_ARRAY_0=1
+ARRAY2_7_ARRAY_1=-2
+ARRAY2_7_ARRAY_2=3
+ARRAY2_7_ARRAY_3=Nested Array in Object2
+ARRAY2_7_ARRAY_4=true
+ARRAY2_7_ARRAY_5=null
+ARRAY2_7_BOOLEANFALSE=false
+ARRAY2_7_BOOLEANTRUE=true
+ARRAY2_7_FLOATNEGATIVE=-2.71828
+ARRAY2_7_FLOATPOSITIVE=3.14159
+ARRAY2_7_NULLVALUE=null
+ARRAY2_7_NUMERICNEGATIVE=-123
+ARRAY2_7_NUMERICPOSITIVE=42
+ARRAY2_7_SCIENTIFICFLOATNEGATIVE=-2.5e-3
+ARRAY2_7_SCIENTIFICINTPOSITIVE=1e5
+ARRAY2_7_SCIENTIFICSMALLPOSITIVE=1e-4
+ARRAY2_7_STRING=Array Element with Object in Array2
+ARRAY_0=1
+ARRAY_1=-2.345
+ARRAY_2=Array Element
+ARRAY_3=true
+ARRAY_4=false
+ARRAY_5=null
+ARRAY_6_ARRAY_0=null
+ARRAY_6_ARRAY_1=false
+ARRAY_6_ARRAY_2=true
+ARRAY_6_NUMERICNEGATIVE=-654
+ARRAY_6_NUMERICPOSITIVE=987
+ARRAY_6_STRING=Nested Object in Array
+ARRAY_7_ARRAY_0=1
+ARRAY_7_ARRAY_1=-2
+ARRAY_7_ARRAY_2=3
+ARRAY_7_ARRAY_3=Nested Array in Object
+ARRAY_7_ARRAY_4=true
+ARRAY_7_ARRAY_5=null
+ARRAY_7_BOOLEANFALSE=false
+ARRAY_7_BOOLEANTRUE=true
+ARRAY_7_FLOATNEGATIVE=-2.71828
+ARRAY_7_FLOATPOSITIVE=3.14159
+ARRAY_7_NULLVALUE=null
+ARRAY_7_NUMERICNEGATIVE=-123
+ARRAY_7_NUMERICPOSITIVE=42
+ARRAY_7_SCIENTIFICFLOATNEGATIVE=-2.5e-3
+ARRAY_7_SCIENTIFICINTPOSITIVE=1e5
+ARRAY_7_SCIENTIFICSMALLPOSITIVE=1e-4
+ARRAY_7_STRING=Array Element with Object
+BOOLEANFALSE=false
+BOOLEANTRUE=true
+FLOATNEGATIVE=-2.71828
+FLOATPOSITIVE=3.14159
+NULLVALUE=null
+NUMERICNEGATIVE=-123
+NUMERICPOSITIVE=42
+OBJECT_ARRAY_0=1
+OBJECT_ARRAY_1=-2
+OBJECT_ARRAY_2=3
+OBJECT_ARRAY_3=Nested Array
+OBJECT_ARRAY_4=true
+OBJECT_ARRAY_5=null
+OBJECT_BOOLEANFALSE=false
+OBJECT_BOOLEANTRUE=true
+OBJECT_FLOATNEGATIVE=-0.123
+OBJECT_FLOATPOSITIVE=0.987
+OBJECT_NULLVALUE=null
+OBJECT_NUMERICNEGATIVE=-456
+OBJECT_NUMERICPOSITIVE=123
+OBJECT_SCIENTIFICFLOATNEGATIVE=-1.5e-2
+OBJECT_SCIENTIFICINTPOSITIVE=6e4
+OBJECT_SCIENTIFICSMALLPOSITIVE=5e-5
+OBJECT_STRING=Nested Object
+SCIENTIFICFLOATNEGATIVE=-2.5e-3
+SCIENTIFICINTPOSITIVE=1e5
+SCIENTIFICSMALLPOSITIVE=1e-4
+STRING=Hello, World!
+
diff --git a/collectors/log2journal/tests.d/logfmt.log b/collectors/log2journal/tests.d/logfmt.log
new file mode 100644
index 00000000..e55a83bb
--- /dev/null
+++ b/collectors/log2journal/tests.d/logfmt.log
@@ -0,0 +1,5 @@
+key1=value01 key2=value02 key3=value03 key4=value04
+key1=value11 key2=value12 key3=value13 key4=
+key1=value21 key2=value22 key3=value23 key4=value24
+key1=value31 key2=value32 key3=value33 key4=
+key1=value41 key2=value42 key3=value43 key4=value44
diff --git a/collectors/log2journal/tests.d/logfmt.output b/collectors/log2journal/tests.d/logfmt.output
new file mode 100644
index 00000000..4291c966
--- /dev/null
+++ b/collectors/log2journal/tests.d/logfmt.output
@@ -0,0 +1,37 @@
+INJECTED=Key INJECTED had value 'value01 - value02' and now has this, but only on the first row of the log.
+KEY1=value01
+KEY2=value02
+KEY3=value03
+KEY4=value04
+SIMPLE_INJECTION=An unset variable looks like '', while the value of KEY2 is 'value02'
+YET_ANOTHER_INJECTION=value01 - value02 - Key INJECTED had value 'value01 - value02' and now has this, but only on the first row of the log. - this should work because inject is yes
+
+INJECTED=value11 - value12
+KEY1=value11
+KEY2=value12
+KEY3=value13
+SIMPLE_INJECTION=An unset variable looks like '', while the value of KEY2 is 'value12'
+YET_ANOTHER_INJECTION=value11 - value12 - value11 - value12 - this should work because inject is yes
+
+INJECTED=KEY4 has the value 'value24'; it is not empty, so INJECTED has been rewritten.
+KEY1=value21
+KEY2=value22
+KEY3=value23
+KEY4=value24
+SIMPLE_INJECTION=An unset variable looks like '', while the value of KEY2 is 'value22'
+YET_ANOTHER_INJECTION=value21 - value22 - KEY4 has the value 'value24'; it is not empty, so INJECTED has been rewritten. - this should work because inject is yes
+
+INJECTED=value31 - value32
+KEY1=value31
+KEY2=value32
+KEY3=value33
+YET_ANOTHER_INJECTION=value31 - value32 - value31 - value32 - this should work because inject is yes
+
+INJECTED=KEY4 has the value 'value44'; it is not empty, so INJECTED has been rewritten.
+KEY1=value41
+KEY2=value42
+KEY3=value43
+KEY4=value44
+SIMPLE_INJECTION=An unset variable looks like '', while the value of KEY2 is 'value42'
+YET_ANOTHER_INJECTION=value41 - value42 - KEY4 has the value 'value44'; it is not empty, so INJECTED has been rewritten. - this should work because inject is yes
+
diff --git a/collectors/log2journal/tests.d/logfmt.yaml b/collectors/log2journal/tests.d/logfmt.yaml
new file mode 100644
index 00000000..91e93a71
--- /dev/null
+++ b/collectors/log2journal/tests.d/logfmt.yaml
@@ -0,0 +1,34 @@
+pattern: logfmt
+
+inject:
+ - key: SIMPLE_INJECTION
+ value: "An unset variable looks like '${this}', while the value of KEY2 is '${KEY2}'"
+
+rewrite:
+ - key: INJECTED
+ value: "${KEY1} - ${KEY2}"
+ inject: yes
+ stop: no
+
+ - key: INJECTED
+ match: '^value01'
+ value: "Key INJECTED had value '${INJECTED}' and now has this, but only on the first row of the log."
+
+ - key: INJECTED
+ not_empty: "${KEY4}"
+ value: "KEY4 has the value '${KEY4}'; it is not empty, so INJECTED has been rewritten."
+
+ - key: INJECTED
+ match: '^KEY4 has the value'
+ value: "This value should not appear in the logs, because the previous one matched and stopped the pipeline."
+
+ - key: ANOTHER_INJECTION
+ value: "${KEY1} - ${KEY2} - ${INJECTED} - should not work because inject is not true amd ANOTHER_INJECTION is not in the log file."
+
+ - key: YET_ANOTHER_INJECTION
+ value: "${KEY1} - ${KEY2} - ${INJECTED} - this should work because inject is yes"
+ inject: yes
+
+ - key: SIMPLE_INJECTION
+ match: "KEY2 is 'value32'"
+ value: "" # empty, so SIMPLE_INJECTION should not be available on row 3
diff --git a/collectors/log2journal/tests.d/nginx-combined.log b/collectors/log2journal/tests.d/nginx-combined.log
new file mode 100644
index 00000000..b0faa81e
--- /dev/null
+++ b/collectors/log2journal/tests.d/nginx-combined.log
@@ -0,0 +1,14 @@
+2a02:169:1210::2000 - - [30/Nov/2023:19:35:27 +0000] "GET /api/v1/data?chart=system.net&format=json&points=267&group=average&gtime=0&options=ms%7Cflip%7Cjsonwrap%7Cnonzero&after=-300&_=1701372775349 HTTP/1.1" 200 4844 "http://192.168.69.5:19999/" "Mozilla/5.0 (X11; CrOS armv7l 13597.84.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.98 Safari/537.36"
+2a02:169:1210::2000 - - [30/Nov/2023:19:35:27 +0000] "OPTIONS /api/v1/data?chart=netdata.clients&format=array&points=300&group=average&gtime=0&options=absolute%7Cjsonwrap%7Cnonzero&after=-300&_=1701372775358 HTTP/1.1" 200 29 "http://192.168.69.5:19999/" "Mozilla/5.0 (X11; CrOS armv7l 13597.84.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.98 Safari/537.36"
+2a02:169:1210::2000 - - [30/Nov/2023:19:35:27 +0000] "OPTIONS /api/v1/data?chart=netdata.net&format=array&points=300&group=average&gtime=0&options=absolute%7Cjsonwrap%7Cnonzero&after=-300&dimensions=out&_=1701372775359 HTTP/1.1" 200 29 "http://192.168.69.5:19999/" "Mozilla/5.0 (X11; CrOS armv7l 13597.84.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.98 Safari/537.36"
+2a02:169:1210::2000 - - [30/Nov/2023:19:35:27 +0000] "OPTIONS /api/v1/data?chart=netdata.requests&format=array&points=300&group=average&gtime=0&options=absolute%7Cjsonwrap%7Cnonzero&after=-300&_=1701372775357 HTTP/1.1" 200 29 "http://192.168.69.5:19999/" "Mozilla/5.0 (X11; CrOS armv7l 13597.84.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.98 Safari/537.36"
+127.0.0.1 - - [30/Nov/2023:19:35:28 +0000] "GET /stub_status HTTP/1.1" 200 120 "-" "Go-http-client/1.1"
+2a02:169:1210::2000 - - [30/Nov/2023:19:35:28 +0000] "GET /api/v1/data?chart=netdata.net&format=array&points=300&group=average&gtime=0&options=absolute%7Cjsonwrap%7Cnonzero&after=-300&dimensions=out&_=1701372775359 HTTP/1.1" 200 1918 "http://192.168.69.5:19999/" "Mozilla/5.0 (X11; CrOS armv7l 13597.84.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.98 Safari/537.36"
+2a02:169:1210::2000 - - [30/Nov/2023:19:35:28 +0000] "GET /api/v1/data?chart=netdata.requests&format=array&points=300&group=average&gtime=0&options=absolute%7Cjsonwrap%7Cnonzero&after=-300&_=1701372775357 HTTP/1.1" 200 1632 "http://192.168.69.5:19999/" "Mozilla/5.0 (X11; CrOS armv7l 13597.84.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.98 Safari/537.36"
+2a02:169:1210::2000 - - [30/Nov/2023:19:35:28 +0000] "GET /api/v1/data?chart=netdata.clients&format=array&points=300&group=average&gtime=0&options=absolute%7Cjsonwrap%7Cnonzero&after=-300&_=1701372775358 HTTP/1.1" 200 588 "http://192.168.69.5:19999/" "Mozilla/5.0 (X11; CrOS armv7l 13597.84.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.98 Safari/537.36"
+2a02:169:1210::2000 - - [30/Nov/2023:19:35:28 +0000] "OPTIONS /api/v1/data?chart=system.cpu&format=json&points=267&group=average&gtime=0&options=ms%7Cflip%7Cjsonwrap%7Cnonzero&after=-300&_=1701372775360 HTTP/1.1" 200 29 "http://192.168.69.5:19999/" "Mozilla/5.0 (X11; CrOS armv7l 13597.84.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.98 Safari/537.36"
+2a02:169:1210::2000 - - [30/Nov/2023:19:35:28 +0000] "OPTIONS /api/v1/data?chart=netdata.net&format=array&points=300&group=average&gtime=0&options=absolute%7Cjsonwrap%7Cnonzero&after=-300&dimensions=in&_=1701372775361 HTTP/1.1" 200 29 "http://192.168.69.5:19999/" "Mozilla/5.0 (X11; CrOS armv7l 13597.84.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.98 Safari/537.36"
+2a02:169:1210::2000 - - [30/Nov/2023:19:35:28 +0000] "GET /api/v1/data?chart=system.cpu&format=json&points=267&group=average&gtime=0&options=ms%7Cflip%7Cjsonwrap%7Cnonzero&after=-300&_=1701372775360 HTTP/1.1" 200 6085 "http://192.168.69.5:19999/" "Mozilla/5.0 (X11; CrOS armv7l 13597.84.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.98 Safari/537.36"
+2a02:169:1210::2000 - - [30/Nov/2023:19:35:28 +0000] "GET /api/v1/data?chart=netdata.net&format=array&points=300&group=average&gtime=0&options=absolute%7Cjsonwrap%7Cnonzero&after=-300&dimensions=in&_=1701372775361 HTTP/1.1" 200 1918 "http://192.168.69.5:19999/" "Mozilla/5.0 (X11; CrOS armv7l 13597.84.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.98 Safari/537.36"
+2a02:169:1210::2000 - - [30/Nov/2023:19:35:28 +0000] "OPTIONS /api/v1/data?chart=system.io&format=json&points=267&group=average&gtime=0&options=ms%7Cflip%7Cjsonwrap%7Cnonzero&after=-300&_=1701372775362 HTTP/1.1" 200 29 "http://192.168.69.5:19999/" "Mozilla/5.0 (X11; CrOS armv7l 13597.84.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.98 Safari/537.36"
+2a02:169:1210::2000 - - [30/Nov/2023:19:35:28 +0000] "GET /api/v1/data?chart=system.io&format=json&points=267&group=average&gtime=0&options=ms%7Cflip%7Cjsonwrap%7Cnonzero&after=-300&_=1701372775362 HTTP/1.1" 200 3503 "http://192.168.69.5:19999/" "Mozilla/5.0 (X11; CrOS armv7l 13597.84.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.98 Safari/537.36"
diff --git a/collectors/log2journal/tests.d/nginx-combined.output b/collectors/log2journal/tests.d/nginx-combined.output
new file mode 100644
index 00000000..07fd1101
--- /dev/null
+++ b/collectors/log2journal/tests.d/nginx-combined.output
@@ -0,0 +1,210 @@
+MESSAGE=GET /api/v1/data?chart=system.net&format=json&points=267&group=average&gtime=0&options=ms%7Cflip%7Cjsonwrap%7Cnonzero&after=-300&_=1701372775349 HTTP/1.1
+NGINX_BODY_BYTES_SENT=4844
+NGINX_HTTP_REFERER=http://192.168.69.5:19999/
+NGINX_HTTP_USER_AGENT=Mozilla/5.0 (X11; CrOS armv7l 13597.84.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.98 Safari/537.36
+NGINX_REMOTE_ADDR=2a02:169:1210::2000
+NGINX_REMOTE_USER=-
+NGINX_REQUEST_METHOD=GET
+NGINX_REQUEST_URI=/api/v1/data?chart=system.net&format=json&points=267&group=average&gtime=0&options=ms%7Cflip%7Cjsonwrap%7Cnonzero&after=-300&_=1701372775349
+NGINX_SERVER_PROTOCOL=HTTP/1.1
+NGINX_STATUS=200
+NGINX_STATUS_FAMILY=2xx
+NGINX_TIME_LOCAL=30/Nov/2023:19:35:27 +0000
+PRIORITY=6
+SYSLOG_IDENTIFIER=nginx-log
+
+MESSAGE=OPTIONS /api/v1/data?chart=netdata.clients&format=array&points=300&group=average&gtime=0&options=absolute%7Cjsonwrap%7Cnonzero&after=-300&_=1701372775358 HTTP/1.1
+NGINX_BODY_BYTES_SENT=29
+NGINX_HTTP_REFERER=http://192.168.69.5:19999/
+NGINX_HTTP_USER_AGENT=Mozilla/5.0 (X11; CrOS armv7l 13597.84.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.98 Safari/537.36
+NGINX_REMOTE_ADDR=2a02:169:1210::2000
+NGINX_REMOTE_USER=-
+NGINX_REQUEST_METHOD=OPTIONS
+NGINX_REQUEST_URI=/api/v1/data?chart=netdata.clients&format=array&points=300&group=average&gtime=0&options=absolute%7Cjsonwrap%7Cnonzero&after=-300&_=1701372775358
+NGINX_SERVER_PROTOCOL=HTTP/1.1
+NGINX_STATUS=200
+NGINX_STATUS_FAMILY=2xx
+NGINX_TIME_LOCAL=30/Nov/2023:19:35:27 +0000
+PRIORITY=6
+SYSLOG_IDENTIFIER=nginx-log
+
+MESSAGE=OPTIONS /api/v1/data?chart=netdata.net&format=array&points=300&group=average&gtime=0&options=absolute%7Cjsonwrap%7Cnonzero&after=-300&dimensions=out&_=1701372775359 HTTP/1.1
+NGINX_BODY_BYTES_SENT=29
+NGINX_HTTP_REFERER=http://192.168.69.5:19999/
+NGINX_HTTP_USER_AGENT=Mozilla/5.0 (X11; CrOS armv7l 13597.84.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.98 Safari/537.36
+NGINX_REMOTE_ADDR=2a02:169:1210::2000
+NGINX_REMOTE_USER=-
+NGINX_REQUEST_METHOD=OPTIONS
+NGINX_REQUEST_URI=/api/v1/data?chart=netdata.net&format=array&points=300&group=average&gtime=0&options=absolute%7Cjsonwrap%7Cnonzero&after=-300&dimensions=out&_=1701372775359
+NGINX_SERVER_PROTOCOL=HTTP/1.1
+NGINX_STATUS=200
+NGINX_STATUS_FAMILY=2xx
+NGINX_TIME_LOCAL=30/Nov/2023:19:35:27 +0000
+PRIORITY=6
+SYSLOG_IDENTIFIER=nginx-log
+
+MESSAGE=OPTIONS /api/v1/data?chart=netdata.requests&format=array&points=300&group=average&gtime=0&options=absolute%7Cjsonwrap%7Cnonzero&after=-300&_=1701372775357 HTTP/1.1
+NGINX_BODY_BYTES_SENT=29
+NGINX_HTTP_REFERER=http://192.168.69.5:19999/
+NGINX_HTTP_USER_AGENT=Mozilla/5.0 (X11; CrOS armv7l 13597.84.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.98 Safari/537.36
+NGINX_REMOTE_ADDR=2a02:169:1210::2000
+NGINX_REMOTE_USER=-
+NGINX_REQUEST_METHOD=OPTIONS
+NGINX_REQUEST_URI=/api/v1/data?chart=netdata.requests&format=array&points=300&group=average&gtime=0&options=absolute%7Cjsonwrap%7Cnonzero&after=-300&_=1701372775357
+NGINX_SERVER_PROTOCOL=HTTP/1.1
+NGINX_STATUS=200
+NGINX_STATUS_FAMILY=2xx
+NGINX_TIME_LOCAL=30/Nov/2023:19:35:27 +0000
+PRIORITY=6
+SYSLOG_IDENTIFIER=nginx-log
+
+MESSAGE=GET /stub_status HTTP/1.1
+NGINX_BODY_BYTES_SENT=120
+NGINX_HTTP_REFERER=-
+NGINX_HTTP_USER_AGENT=Go-http-client/1.1
+NGINX_REMOTE_ADDR=127.0.0.1
+NGINX_REMOTE_USER=-
+NGINX_REQUEST_METHOD=GET
+NGINX_REQUEST_URI=/stub_status
+NGINX_SERVER_PROTOCOL=HTTP/1.1
+NGINX_STATUS=200
+NGINX_STATUS_FAMILY=2xx
+NGINX_TIME_LOCAL=30/Nov/2023:19:35:28 +0000
+PRIORITY=6
+SYSLOG_IDENTIFIER=nginx-log
+
+MESSAGE=GET /api/v1/data?chart=netdata.net&format=array&points=300&group=average&gtime=0&options=absolute%7Cjsonwrap%7Cnonzero&after=-300&dimensions=out&_=1701372775359 HTTP/1.1
+NGINX_BODY_BYTES_SENT=1918
+NGINX_HTTP_REFERER=http://192.168.69.5:19999/
+NGINX_HTTP_USER_AGENT=Mozilla/5.0 (X11; CrOS armv7l 13597.84.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.98 Safari/537.36
+NGINX_REMOTE_ADDR=2a02:169:1210::2000
+NGINX_REMOTE_USER=-
+NGINX_REQUEST_METHOD=GET
+NGINX_REQUEST_URI=/api/v1/data?chart=netdata.net&format=array&points=300&group=average&gtime=0&options=absolute%7Cjsonwrap%7Cnonzero&after=-300&dimensions=out&_=1701372775359
+NGINX_SERVER_PROTOCOL=HTTP/1.1
+NGINX_STATUS=200
+NGINX_STATUS_FAMILY=2xx
+NGINX_TIME_LOCAL=30/Nov/2023:19:35:28 +0000
+PRIORITY=6
+SYSLOG_IDENTIFIER=nginx-log
+
+MESSAGE=GET /api/v1/data?chart=netdata.requests&format=array&points=300&group=average&gtime=0&options=absolute%7Cjsonwrap%7Cnonzero&after=-300&_=1701372775357 HTTP/1.1
+NGINX_BODY_BYTES_SENT=1632
+NGINX_HTTP_REFERER=http://192.168.69.5:19999/
+NGINX_HTTP_USER_AGENT=Mozilla/5.0 (X11; CrOS armv7l 13597.84.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.98 Safari/537.36
+NGINX_REMOTE_ADDR=2a02:169:1210::2000
+NGINX_REMOTE_USER=-
+NGINX_REQUEST_METHOD=GET
+NGINX_REQUEST_URI=/api/v1/data?chart=netdata.requests&format=array&points=300&group=average&gtime=0&options=absolute%7Cjsonwrap%7Cnonzero&after=-300&_=1701372775357
+NGINX_SERVER_PROTOCOL=HTTP/1.1
+NGINX_STATUS=200
+NGINX_STATUS_FAMILY=2xx
+NGINX_TIME_LOCAL=30/Nov/2023:19:35:28 +0000
+PRIORITY=6
+SYSLOG_IDENTIFIER=nginx-log
+
+MESSAGE=GET /api/v1/data?chart=netdata.clients&format=array&points=300&group=average&gtime=0&options=absolute%7Cjsonwrap%7Cnonzero&after=-300&_=1701372775358 HTTP/1.1
+NGINX_BODY_BYTES_SENT=588
+NGINX_HTTP_REFERER=http://192.168.69.5:19999/
+NGINX_HTTP_USER_AGENT=Mozilla/5.0 (X11; CrOS armv7l 13597.84.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.98 Safari/537.36
+NGINX_REMOTE_ADDR=2a02:169:1210::2000
+NGINX_REMOTE_USER=-
+NGINX_REQUEST_METHOD=GET
+NGINX_REQUEST_URI=/api/v1/data?chart=netdata.clients&format=array&points=300&group=average&gtime=0&options=absolute%7Cjsonwrap%7Cnonzero&after=-300&_=1701372775358
+NGINX_SERVER_PROTOCOL=HTTP/1.1
+NGINX_STATUS=200
+NGINX_STATUS_FAMILY=2xx
+NGINX_TIME_LOCAL=30/Nov/2023:19:35:28 +0000
+PRIORITY=6
+SYSLOG_IDENTIFIER=nginx-log
+
+MESSAGE=OPTIONS /api/v1/data?chart=system.cpu&format=json&points=267&group=average&gtime=0&options=ms%7Cflip%7Cjsonwrap%7Cnonzero&after=-300&_=1701372775360 HTTP/1.1
+NGINX_BODY_BYTES_SENT=29
+NGINX_HTTP_REFERER=http://192.168.69.5:19999/
+NGINX_HTTP_USER_AGENT=Mozilla/5.0 (X11; CrOS armv7l 13597.84.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.98 Safari/537.36
+NGINX_REMOTE_ADDR=2a02:169:1210::2000
+NGINX_REMOTE_USER=-
+NGINX_REQUEST_METHOD=OPTIONS
+NGINX_REQUEST_URI=/api/v1/data?chart=system.cpu&format=json&points=267&group=average&gtime=0&options=ms%7Cflip%7Cjsonwrap%7Cnonzero&after=-300&_=1701372775360
+NGINX_SERVER_PROTOCOL=HTTP/1.1
+NGINX_STATUS=200
+NGINX_STATUS_FAMILY=2xx
+NGINX_TIME_LOCAL=30/Nov/2023:19:35:28 +0000
+PRIORITY=6
+SYSLOG_IDENTIFIER=nginx-log
+
+MESSAGE=OPTIONS /api/v1/data?chart=netdata.net&format=array&points=300&group=average&gtime=0&options=absolute%7Cjsonwrap%7Cnonzero&after=-300&dimensions=in&_=1701372775361 HTTP/1.1
+NGINX_BODY_BYTES_SENT=29
+NGINX_HTTP_REFERER=http://192.168.69.5:19999/
+NGINX_HTTP_USER_AGENT=Mozilla/5.0 (X11; CrOS armv7l 13597.84.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.98 Safari/537.36
+NGINX_REMOTE_ADDR=2a02:169:1210::2000
+NGINX_REMOTE_USER=-
+NGINX_REQUEST_METHOD=OPTIONS
+NGINX_REQUEST_URI=/api/v1/data?chart=netdata.net&format=array&points=300&group=average&gtime=0&options=absolute%7Cjsonwrap%7Cnonzero&after=-300&dimensions=in&_=1701372775361
+NGINX_SERVER_PROTOCOL=HTTP/1.1
+NGINX_STATUS=200
+NGINX_STATUS_FAMILY=2xx
+NGINX_TIME_LOCAL=30/Nov/2023:19:35:28 +0000
+PRIORITY=6
+SYSLOG_IDENTIFIER=nginx-log
+
+MESSAGE=GET /api/v1/data?chart=system.cpu&format=json&points=267&group=average&gtime=0&options=ms%7Cflip%7Cjsonwrap%7Cnonzero&after=-300&_=1701372775360 HTTP/1.1
+NGINX_BODY_BYTES_SENT=6085
+NGINX_HTTP_REFERER=http://192.168.69.5:19999/
+NGINX_HTTP_USER_AGENT=Mozilla/5.0 (X11; CrOS armv7l 13597.84.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.98 Safari/537.36
+NGINX_REMOTE_ADDR=2a02:169:1210::2000
+NGINX_REMOTE_USER=-
+NGINX_REQUEST_METHOD=GET
+NGINX_REQUEST_URI=/api/v1/data?chart=system.cpu&format=json&points=267&group=average&gtime=0&options=ms%7Cflip%7Cjsonwrap%7Cnonzero&after=-300&_=1701372775360
+NGINX_SERVER_PROTOCOL=HTTP/1.1
+NGINX_STATUS=200
+NGINX_STATUS_FAMILY=2xx
+NGINX_TIME_LOCAL=30/Nov/2023:19:35:28 +0000
+PRIORITY=6
+SYSLOG_IDENTIFIER=nginx-log
+
+MESSAGE=GET /api/v1/data?chart=netdata.net&format=array&points=300&group=average&gtime=0&options=absolute%7Cjsonwrap%7Cnonzero&after=-300&dimensions=in&_=1701372775361 HTTP/1.1
+NGINX_BODY_BYTES_SENT=1918
+NGINX_HTTP_REFERER=http://192.168.69.5:19999/
+NGINX_HTTP_USER_AGENT=Mozilla/5.0 (X11; CrOS armv7l 13597.84.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.98 Safari/537.36
+NGINX_REMOTE_ADDR=2a02:169:1210::2000
+NGINX_REMOTE_USER=-
+NGINX_REQUEST_METHOD=GET
+NGINX_REQUEST_URI=/api/v1/data?chart=netdata.net&format=array&points=300&group=average&gtime=0&options=absolute%7Cjsonwrap%7Cnonzero&after=-300&dimensions=in&_=1701372775361
+NGINX_SERVER_PROTOCOL=HTTP/1.1
+NGINX_STATUS=200
+NGINX_STATUS_FAMILY=2xx
+NGINX_TIME_LOCAL=30/Nov/2023:19:35:28 +0000
+PRIORITY=6
+SYSLOG_IDENTIFIER=nginx-log
+
+MESSAGE=OPTIONS /api/v1/data?chart=system.io&format=json&points=267&group=average&gtime=0&options=ms%7Cflip%7Cjsonwrap%7Cnonzero&after=-300&_=1701372775362 HTTP/1.1
+NGINX_BODY_BYTES_SENT=29
+NGINX_HTTP_REFERER=http://192.168.69.5:19999/
+NGINX_HTTP_USER_AGENT=Mozilla/5.0 (X11; CrOS armv7l 13597.84.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.98 Safari/537.36
+NGINX_REMOTE_ADDR=2a02:169:1210::2000
+NGINX_REMOTE_USER=-
+NGINX_REQUEST_METHOD=OPTIONS
+NGINX_REQUEST_URI=/api/v1/data?chart=system.io&format=json&points=267&group=average&gtime=0&options=ms%7Cflip%7Cjsonwrap%7Cnonzero&after=-300&_=1701372775362
+NGINX_SERVER_PROTOCOL=HTTP/1.1
+NGINX_STATUS=200
+NGINX_STATUS_FAMILY=2xx
+NGINX_TIME_LOCAL=30/Nov/2023:19:35:28 +0000
+PRIORITY=6
+SYSLOG_IDENTIFIER=nginx-log
+
+MESSAGE=GET /api/v1/data?chart=system.io&format=json&points=267&group=average&gtime=0&options=ms%7Cflip%7Cjsonwrap%7Cnonzero&after=-300&_=1701372775362 HTTP/1.1
+NGINX_BODY_BYTES_SENT=3503
+NGINX_HTTP_REFERER=http://192.168.69.5:19999/
+NGINX_HTTP_USER_AGENT=Mozilla/5.0 (X11; CrOS armv7l 13597.84.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.98 Safari/537.36
+NGINX_REMOTE_ADDR=2a02:169:1210::2000
+NGINX_REMOTE_USER=-
+NGINX_REQUEST_METHOD=GET
+NGINX_REQUEST_URI=/api/v1/data?chart=system.io&format=json&points=267&group=average&gtime=0&options=ms%7Cflip%7Cjsonwrap%7Cnonzero&after=-300&_=1701372775362
+NGINX_SERVER_PROTOCOL=HTTP/1.1
+NGINX_STATUS=200
+NGINX_STATUS_FAMILY=2xx
+NGINX_TIME_LOCAL=30/Nov/2023:19:35:28 +0000
+PRIORITY=6
+SYSLOG_IDENTIFIER=nginx-log
+
diff --git a/collectors/log2journal/tests.d/nginx-json.log b/collectors/log2journal/tests.d/nginx-json.log
new file mode 100644
index 00000000..7e2b5d5f
--- /dev/null
+++ b/collectors/log2journal/tests.d/nginx-json.log
@@ -0,0 +1,9 @@
+{"msec":"1644997905.123","connection":12345,"connection_requests":5,"pid":9876,"request_id":"8f3ebc1e38fbb92f","request_length":345,"remote_addr":"192.168.1.100","remote_user":"john_doe","remote_port":54321,"time_local":"19/Feb/2023:14:15:05 +0000","request":"GET /index.html HTTP/1.1","request_uri":"/index.html?param=value","args":"param=value","status":200,"body_bytes_sent":5432,"bytes_sent":6543,"http_referer":"https://example.com","http_user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64)","http_x_forwarded_for":"192.168.1.50, 10.0.0.1","host":"example.com","request_time":0.123,"upstream":"10.0.0.2:8080","upstream_connect_time":0.045,"upstream_header_time":0.020,"upstream_response_time":0.058,"upstream_response_length":7890,"upstream_cache_status":"MISS","ssl_protocol":"TLSv1.2","ssl_cipher":"AES256-SHA256","scheme":"https","request_method":"GET","server_protocol":"HTTP/1.1","pipe":".","gzip_ratio":"2.1","http_cf_ray":"abc123def456","geoip_country_code":"US"}
+{"msec":"1644997910.789","connection":54321,"connection_requests":10,"pid":5432,"request_id":"4a7bca5e19d3f8e7","request_length":432,"remote_addr":"10.0.0.3","remote_user":"","remote_port":12345,"time_local":"19/Feb/2023:14:15:10 +0000","request":"POST /api/update HTTP/1.1","request_uri":"/api/update","args":"","status":204,"body_bytes_sent":0,"bytes_sent":123,"http_referer":"","http_user_agent":"curl/7.68.0","http_x_forwarded_for":"","host":"api.example.com","request_time":0.032,"upstream":"backend-server-1:8080","upstream_connect_time":0.012,"upstream_header_time":0.020,"upstream_response_time":0.010,"upstream_response_length":0,"upstream_cache_status":"","ssl_protocol":"","ssl_cipher":"","scheme":"http","request_method":"POST","server_protocol":"HTTP/1.1","pipe":"p","gzip_ratio":"","http_cf_ray":"","geoip_country_code":""}
+{"msec":"1644997920.456","connection":98765,"connection_requests":15,"pid":1234,"request_id":"63f8ad2c3e1b4090","request_length":567,"remote_addr":"2001:0db8:85a3:0000:0000:8a2e:0370:7334","remote_user":"alice","remote_port":6789,"time_local":"19/Feb/2023:14:15:20 +0000","request":"GET /page?param1=value1&param2=value2 HTTP/2.0","request_uri":"/page?param1=value1&param2=value2","args":"param1=value1&param2=value2","status":404,"body_bytes_sent":0,"bytes_sent":0,"http_referer":"","http_user_agent":"Mozilla/5.0 (Linux; Android 10; Pixel 3)","http_x_forwarded_for":"","host":"example.org","request_time":0.045,"upstream":"","upstream_connect_time":0.0,"upstream_header_time":0.0,"upstream_response_time":0.0,"upstream_response_length":0,"upstream_cache_status":"","ssl_protocol":"","ssl_cipher":"","scheme":"https","request_method":"GET","server_protocol":"HTTP/2.0","pipe":".","gzip_ratio":"","http_cf_ray":"","geoip_country_code":"GB"}
+{"msec":"1644997930.987","connection":123,"connection_requests":3,"pid":5678,"request_id":"9e632a5b24c18f76","request_length":234,"remote_addr":"192.168.0.1","remote_user":"jane_doe","remote_port":9876,"time_local":"19/Feb/2023:14:15:30 +0000","request":"PUT /api/update HTTP/1.1","request_uri":"/api/update","args":"","status":500,"body_bytes_sent":543,"bytes_sent":876,"http_referer":"https://example.com/page","http_user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64)","http_x_forwarded_for":"","host":"api.example.com","request_time":0.123,"upstream":"backend-server-2:8080","upstream_connect_time":0.045,"upstream_header_time":0.020,"upstream_response_time":0.058,"upstream_response_length":7890,"upstream_cache_status":"HIT","ssl_protocol":"TLSv1.2","ssl_cipher":"AES256-SHA256","scheme":"https","request_method":"PUT","server_protocol":"HTTP/1.1","pipe":"p","gzip_ratio":"1.8","http_cf_ray":"xyz789abc123","geoip_country_code":"CA"}
+{"msec":"1644997940.234","connection":9876,"connection_requests":8,"pid":4321,"request_id":"1b6c59c8aef7d24a","request_length":456,"remote_addr":"203.0.113.1","remote_user":"","remote_port":5432,"time_local":"19/Feb/2023:14:15:40 +0000","request":"DELETE /api/resource HTTP/2.0","request_uri":"/api/resource","args":"","status":204,"body_bytes_sent":0,"bytes_sent":123,"http_referer":"","http_user_agent":"curl/7.68.0","http_x_forwarded_for":"","host":"api.example.com","request_time":0.032,"upstream":"backend-server-1:8080","upstream_connect_time":0.012,"upstream_header_time":0.020,"upstream_response_time":0.010,"upstream_response_length":0,"upstream_cache_status":"","ssl_protocol":"","ssl_cipher":"","scheme":"http","request_method":"DELETE","server_protocol":"HTTP/2.0","pipe":".","gzip_ratio":"","http_cf_ray":"","geoip_country_code":""}
+{"msec":"1644997950.789","connection":5432,"connection_requests":12,"pid":6543,"request_id":"72692d781d0b8a4f","request_length":789,"remote_addr":"198.51.100.2","remote_user":"bob","remote_port":8765,"time_local":"19/Feb/2023:14:15:50 +0000","request":"GET /profile?user=bob HTTP/1.1","request_uri":"/profile?user=bob","args":"user=bob","status":200,"body_bytes_sent":1234,"bytes_sent":2345,"http_referer":"","http_user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64)","http_x_forwarded_for":"","host":"example.com","request_time":0.065,"upstream":"10.0.0.2:8080","upstream_connect_time":0.045,"upstream_header_time":0.020,"upstream_response_time":0.058,"upstream_response_length":7890,"upstream_cache_status":"MISS","ssl_protocol":"TLSv1.3","ssl_cipher":"AES128-GCM-SHA256","scheme":"https","request_method":"GET","server_protocol":"HTTP/1.1","pipe":"p","gzip_ratio":"","http_cf_ray":"","geoip_country_code":"US"}
+{"msec":"1644997960.321","connection":65432,"connection_requests":7,"pid":7890,"request_id":"c3e158d41e75a9d7","request_length":321,"remote_addr":"203.0.113.2","remote_user":"","remote_port":9876,"time_local":"19/Feb/2023:14:15:60 +0000","request":"GET /dashboard HTTP/2.0","request_uri":"/dashboard","args":"","status":301,"body_bytes_sent":0,"bytes_sent":123,"http_referer":"","http_user_agent":"Mozilla/5.0 (Linux; Android 10; Pixel 3)","http_x_forwarded_for":"","host":"dashboard.example.org","request_time":0.032,"upstream":"","upstream_connect_time":0.0,"upstream_header_time":0.0,"upstream_response_time":0.0,"upstream_response_length":0,"upstream_cache_status":"","ssl_protocol":"","ssl_cipher":"","scheme":"https","request_method":"GET","server_protocol":"HTTP/2.0","pipe":".","gzip_ratio":"","http_cf_ray":"","geoip_country_code":""}
+{"msec":"1644997970.555","connection":8765,"connection_requests":9,"pid":8765,"request_id":"f9f6e8235de54af4","request_length":654,"remote_addr":"10.0.0.4","remote_user":"","remote_port":12345,"time_local":"19/Feb/2023:14:15:70 +0000","request":"POST /submit-form HTTP/1.1","request_uri":"/submit-form","args":"","status":201,"body_bytes_sent":876,"bytes_sent":987,"http_referer":"","http_user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64)","http_x_forwarded_for":"","host":"example.com","request_time":0.045,"upstream":"backend-server-3:8080","upstream_connect_time":0.012,"upstream_header_time":0.020,"upstream_response_time":0.010,"upstream_response_length":0,"upstream_cache_status":"","ssl_protocol":"","ssl_cipher":"","scheme":"http","request_method":"POST","server_protocol":"HTTP/1.1","pipe":"p","gzip_ratio":"","http_cf_ray":"","geoip_country_code":""}
+{"msec":"1644997980.987","connection":23456,"connection_requests":6,"pid":3456,"request_id":"2ec3e8859e7a406c","request_length":432,"remote_addr":"198.51.100.3","remote_user":"mary","remote_port":5678,"time_local":"19/Feb/2023:14:15:80 +0000","request":"GET /contact HTTP/1.1","request_uri":"/contact","args":"","status":404,"body_bytes_sent":0,"bytes_sent":0,"http_referer":"","http_user_agent":"Mozilla/5.0 (Linux; Android 10; Pixel 3)","http_x_forwarded_for":"","host":"example.org","request_time":0.032,"upstream":"","upstream_connect_time":0.0,"upstream_header_time":0.0,"upstream_response_time":0.0,"upstream_response_length":0,"upstream_cache_status":"","ssl_protocol":"","ssl_cipher":"","scheme":"https","request_method":"GET","server_protocol":"HTTP/1.1","pipe":".","gzip_ratio":"","http_cf_ray":"","geoip_country_code":"FR"}
diff --git a/collectors/log2journal/tests.d/nginx-json.output b/collectors/log2journal/tests.d/nginx-json.output
new file mode 100644
index 00000000..e7db9dcb
--- /dev/null
+++ b/collectors/log2journal/tests.d/nginx-json.output
@@ -0,0 +1,296 @@
+MESSAGE=GET /index.html HTTP/1.1
+NGINX_BODY_BYTES_SENT=5432
+NGINX_BYTES_SENT=6543
+NGINX_CONNECTION=12345
+NGINX_CONNECTION_REQUESTS=5
+NGINX_GEOIP_COUNTRY_CODE=US
+NGINX_GZIP_RATIO=2.1
+NGINX_HOST=example.com
+NGINX_HTTP_CF_RAY=abc123def456
+NGINX_HTTP_REFERER=https://example.com
+NGINX_HTTP_USER_AGENT=Mozilla/5.0 (Windows NT 10.0; Win64; x64)
+NGINX_HTTP_X_FORWARDED_FOR=192.168.1.50, 10.0.0.1
+NGINX_PID=9876
+NGINX_PIPELINED=no
+NGINX_QUERY_STRING=param=value
+NGINX_REMOTE_ADDR=192.168.1.100
+NGINX_REMOTE_PORT=54321
+NGINX_REMOTE_USER=john_doe
+NGINX_REQUEST_ID=8f3ebc1e38fbb92f
+NGINX_REQUEST_LENGTH=345
+NGINX_REQUEST_METHOD=GET
+NGINX_REQUEST_TIME=0.123
+NGINX_REQUEST_URI=/index.html?param=value
+NGINX_SCHEME=https
+NGINX_SERVER_PROTOCOL=HTTP/1.1
+NGINX_SSL_CIPHER=AES256-SHA256
+NGINX_SSL_PROTOCOL=TLSv1.2
+NGINX_STATUS=200
+NGINX_STATUS_FAMILY=2xx
+NGINX_TIMESTAMP_SEC=1644997905.123
+NGINX_TIME_LOCAL=19/Feb/2023:14:15:05 +0000
+NGINX_UPSTREAM=10.0.0.2:8080
+NGINX_UPSTREAM_CACHE_STATUS=MISS
+NGINX_UPSTREAM_CONNECT_TIME=0.045
+NGINX_UPSTREAM_HEADER_TIME=0.020
+NGINX_UPSTREAM_RESPONSE_LENGTH=7890
+NGINX_UPSTREAM_RESPONSE_TIME=0.058
+PRIORITY=6
+SYSLOG_IDENTIFIER=nginx-log
+
+MESSAGE=POST /api/update HTTP/1.1
+NGINX_BODY_BYTES_SENT=0
+NGINX_BYTES_SENT=123
+NGINX_CONNECTION=54321
+NGINX_CONNECTION_REQUESTS=10
+NGINX_HOST=api.example.com
+NGINX_HTTP_USER_AGENT=curl/7.68.0
+NGINX_PID=5432
+NGINX_PIPELINED=yes
+NGINX_REMOTE_ADDR=10.0.0.3
+NGINX_REMOTE_PORT=12345
+NGINX_REQUEST_ID=4a7bca5e19d3f8e7
+NGINX_REQUEST_LENGTH=432
+NGINX_REQUEST_METHOD=POST
+NGINX_REQUEST_TIME=0.032
+NGINX_REQUEST_URI=/api/update
+NGINX_SCHEME=http
+NGINX_SERVER_PROTOCOL=HTTP/1.1
+NGINX_STATUS=204
+NGINX_STATUS_FAMILY=2xx
+NGINX_TIMESTAMP_SEC=1644997910.789
+NGINX_TIME_LOCAL=19/Feb/2023:14:15:10 +0000
+NGINX_UPSTREAM=backend-server-1:8080
+NGINX_UPSTREAM_CONNECT_TIME=0.012
+NGINX_UPSTREAM_HEADER_TIME=0.020
+NGINX_UPSTREAM_RESPONSE_LENGTH=0
+NGINX_UPSTREAM_RESPONSE_TIME=0.010
+PRIORITY=6
+SYSLOG_IDENTIFIER=nginx-log
+
+MESSAGE=GET /page?param1=value1&param2=value2 HTTP/2.0
+NGINX_BODY_BYTES_SENT=0
+NGINX_BYTES_SENT=0
+NGINX_CONNECTION=98765
+NGINX_CONNECTION_REQUESTS=15
+NGINX_GEOIP_COUNTRY_CODE=GB
+NGINX_HOST=example.org
+NGINX_HTTP_USER_AGENT=Mozilla/5.0 (Linux; Android 10; Pixel 3)
+NGINX_PID=1234
+NGINX_PIPELINED=no
+NGINX_QUERY_STRING=param1=value1&param2=value2
+NGINX_REMOTE_ADDR=2001:0db8:85a3:0000:0000:8a2e:0370:7334
+NGINX_REMOTE_PORT=6789
+NGINX_REMOTE_USER=alice
+NGINX_REQUEST_ID=63f8ad2c3e1b4090
+NGINX_REQUEST_LENGTH=567
+NGINX_REQUEST_METHOD=GET
+NGINX_REQUEST_TIME=0.045
+NGINX_REQUEST_URI=/page?param1=value1&param2=value2
+NGINX_SCHEME=https
+NGINX_SERVER_PROTOCOL=HTTP/2.0
+NGINX_STATUS=404
+NGINX_STATUS_FAMILY=4xx
+NGINX_TIMESTAMP_SEC=1644997920.456
+NGINX_TIME_LOCAL=19/Feb/2023:14:15:20 +0000
+NGINX_UPSTREAM_CONNECT_TIME=0.0
+NGINX_UPSTREAM_HEADER_TIME=0.0
+NGINX_UPSTREAM_RESPONSE_LENGTH=0
+NGINX_UPSTREAM_RESPONSE_TIME=0.0
+PRIORITY=5
+SYSLOG_IDENTIFIER=nginx-log
+
+MESSAGE=PUT /api/update HTTP/1.1
+NGINX_BODY_BYTES_SENT=543
+NGINX_BYTES_SENT=876
+NGINX_CONNECTION=123
+NGINX_CONNECTION_REQUESTS=3
+NGINX_GEOIP_COUNTRY_CODE=CA
+NGINX_GZIP_RATIO=1.8
+NGINX_HOST=api.example.com
+NGINX_HTTP_CF_RAY=xyz789abc123
+NGINX_HTTP_REFERER=https://example.com/page
+NGINX_HTTP_USER_AGENT=Mozilla/5.0 (Windows NT 10.0; Win64; x64)
+NGINX_PID=5678
+NGINX_PIPELINED=yes
+NGINX_REMOTE_ADDR=192.168.0.1
+NGINX_REMOTE_PORT=9876
+NGINX_REMOTE_USER=jane_doe
+NGINX_REQUEST_ID=9e632a5b24c18f76
+NGINX_REQUEST_LENGTH=234
+NGINX_REQUEST_METHOD=PUT
+NGINX_REQUEST_TIME=0.123
+NGINX_REQUEST_URI=/api/update
+NGINX_SCHEME=https
+NGINX_SERVER_PROTOCOL=HTTP/1.1
+NGINX_SSL_CIPHER=AES256-SHA256
+NGINX_SSL_PROTOCOL=TLSv1.2
+NGINX_STATUS=500
+NGINX_STATUS_FAMILY=5xx
+NGINX_TIMESTAMP_SEC=1644997930.987
+NGINX_TIME_LOCAL=19/Feb/2023:14:15:30 +0000
+NGINX_UPSTREAM=backend-server-2:8080
+NGINX_UPSTREAM_CACHE_STATUS=HIT
+NGINX_UPSTREAM_CONNECT_TIME=0.045
+NGINX_UPSTREAM_HEADER_TIME=0.020
+NGINX_UPSTREAM_RESPONSE_LENGTH=7890
+NGINX_UPSTREAM_RESPONSE_TIME=0.058
+PRIORITY=3
+SYSLOG_IDENTIFIER=nginx-log
+
+MESSAGE=DELETE /api/resource HTTP/2.0
+NGINX_BODY_BYTES_SENT=0
+NGINX_BYTES_SENT=123
+NGINX_CONNECTION=9876
+NGINX_CONNECTION_REQUESTS=8
+NGINX_HOST=api.example.com
+NGINX_HTTP_USER_AGENT=curl/7.68.0
+NGINX_PID=4321
+NGINX_PIPELINED=no
+NGINX_REMOTE_ADDR=203.0.113.1
+NGINX_REMOTE_PORT=5432
+NGINX_REQUEST_ID=1b6c59c8aef7d24a
+NGINX_REQUEST_LENGTH=456
+NGINX_REQUEST_METHOD=DELETE
+NGINX_REQUEST_TIME=0.032
+NGINX_REQUEST_URI=/api/resource
+NGINX_SCHEME=http
+NGINX_SERVER_PROTOCOL=HTTP/2.0
+NGINX_STATUS=204
+NGINX_STATUS_FAMILY=2xx
+NGINX_TIMESTAMP_SEC=1644997940.234
+NGINX_TIME_LOCAL=19/Feb/2023:14:15:40 +0000
+NGINX_UPSTREAM=backend-server-1:8080
+NGINX_UPSTREAM_CONNECT_TIME=0.012
+NGINX_UPSTREAM_HEADER_TIME=0.020
+NGINX_UPSTREAM_RESPONSE_LENGTH=0
+NGINX_UPSTREAM_RESPONSE_TIME=0.010
+PRIORITY=6
+SYSLOG_IDENTIFIER=nginx-log
+
+MESSAGE=GET /profile?user=bob HTTP/1.1
+NGINX_BODY_BYTES_SENT=1234
+NGINX_BYTES_SENT=2345
+NGINX_CONNECTION=5432
+NGINX_CONNECTION_REQUESTS=12
+NGINX_GEOIP_COUNTRY_CODE=US
+NGINX_HOST=example.com
+NGINX_HTTP_USER_AGENT=Mozilla/5.0 (Windows NT 10.0; Win64; x64)
+NGINX_PID=6543
+NGINX_PIPELINED=yes
+NGINX_QUERY_STRING=user=bob
+NGINX_REMOTE_ADDR=198.51.100.2
+NGINX_REMOTE_PORT=8765
+NGINX_REMOTE_USER=bob
+NGINX_REQUEST_ID=72692d781d0b8a4f
+NGINX_REQUEST_LENGTH=789
+NGINX_REQUEST_METHOD=GET
+NGINX_REQUEST_TIME=0.065
+NGINX_REQUEST_URI=/profile?user=bob
+NGINX_SCHEME=https
+NGINX_SERVER_PROTOCOL=HTTP/1.1
+NGINX_SSL_CIPHER=AES128-GCM-SHA256
+NGINX_SSL_PROTOCOL=TLSv1.3
+NGINX_STATUS=200
+NGINX_STATUS_FAMILY=2xx
+NGINX_TIMESTAMP_SEC=1644997950.789
+NGINX_TIME_LOCAL=19/Feb/2023:14:15:50 +0000
+NGINX_UPSTREAM=10.0.0.2:8080
+NGINX_UPSTREAM_CACHE_STATUS=MISS
+NGINX_UPSTREAM_CONNECT_TIME=0.045
+NGINX_UPSTREAM_HEADER_TIME=0.020
+NGINX_UPSTREAM_RESPONSE_LENGTH=7890
+NGINX_UPSTREAM_RESPONSE_TIME=0.058
+PRIORITY=6
+SYSLOG_IDENTIFIER=nginx-log
+
+MESSAGE=GET /dashboard HTTP/2.0
+NGINX_BODY_BYTES_SENT=0
+NGINX_BYTES_SENT=123
+NGINX_CONNECTION=65432
+NGINX_CONNECTION_REQUESTS=7
+NGINX_HOST=dashboard.example.org
+NGINX_HTTP_USER_AGENT=Mozilla/5.0 (Linux; Android 10; Pixel 3)
+NGINX_PID=7890
+NGINX_PIPELINED=no
+NGINX_REMOTE_ADDR=203.0.113.2
+NGINX_REMOTE_PORT=9876
+NGINX_REQUEST_ID=c3e158d41e75a9d7
+NGINX_REQUEST_LENGTH=321
+NGINX_REQUEST_METHOD=GET
+NGINX_REQUEST_TIME=0.032
+NGINX_REQUEST_URI=/dashboard
+NGINX_SCHEME=https
+NGINX_SERVER_PROTOCOL=HTTP/2.0
+NGINX_STATUS=301
+NGINX_STATUS_FAMILY=3xx
+NGINX_TIMESTAMP_SEC=1644997960.321
+NGINX_TIME_LOCAL=19/Feb/2023:14:15:60 +0000
+NGINX_UPSTREAM_CONNECT_TIME=0.0
+NGINX_UPSTREAM_HEADER_TIME=0.0
+NGINX_UPSTREAM_RESPONSE_LENGTH=0
+NGINX_UPSTREAM_RESPONSE_TIME=0.0
+PRIORITY=6
+SYSLOG_IDENTIFIER=nginx-log
+
+MESSAGE=POST /submit-form HTTP/1.1
+NGINX_BODY_BYTES_SENT=876
+NGINX_BYTES_SENT=987
+NGINX_CONNECTION=8765
+NGINX_CONNECTION_REQUESTS=9
+NGINX_HOST=example.com
+NGINX_HTTP_USER_AGENT=Mozilla/5.0 (Windows NT 10.0; Win64; x64)
+NGINX_PID=8765
+NGINX_PIPELINED=yes
+NGINX_REMOTE_ADDR=10.0.0.4
+NGINX_REMOTE_PORT=12345
+NGINX_REQUEST_ID=f9f6e8235de54af4
+NGINX_REQUEST_LENGTH=654
+NGINX_REQUEST_METHOD=POST
+NGINX_REQUEST_TIME=0.045
+NGINX_REQUEST_URI=/submit-form
+NGINX_SCHEME=http
+NGINX_SERVER_PROTOCOL=HTTP/1.1
+NGINX_STATUS=201
+NGINX_STATUS_FAMILY=2xx
+NGINX_TIMESTAMP_SEC=1644997970.555
+NGINX_TIME_LOCAL=19/Feb/2023:14:15:70 +0000
+NGINX_UPSTREAM=backend-server-3:8080
+NGINX_UPSTREAM_CONNECT_TIME=0.012
+NGINX_UPSTREAM_HEADER_TIME=0.020
+NGINX_UPSTREAM_RESPONSE_LENGTH=0
+NGINX_UPSTREAM_RESPONSE_TIME=0.010
+PRIORITY=6
+SYSLOG_IDENTIFIER=nginx-log
+
+MESSAGE=GET /contact HTTP/1.1
+NGINX_BODY_BYTES_SENT=0
+NGINX_BYTES_SENT=0
+NGINX_CONNECTION=23456
+NGINX_CONNECTION_REQUESTS=6
+NGINX_GEOIP_COUNTRY_CODE=FR
+NGINX_HOST=example.org
+NGINX_HTTP_USER_AGENT=Mozilla/5.0 (Linux; Android 10; Pixel 3)
+NGINX_PID=3456
+NGINX_PIPELINED=no
+NGINX_REMOTE_ADDR=198.51.100.3
+NGINX_REMOTE_PORT=5678
+NGINX_REMOTE_USER=mary
+NGINX_REQUEST_ID=2ec3e8859e7a406c
+NGINX_REQUEST_LENGTH=432
+NGINX_REQUEST_METHOD=GET
+NGINX_REQUEST_TIME=0.032
+NGINX_REQUEST_URI=/contact
+NGINX_SCHEME=https
+NGINX_SERVER_PROTOCOL=HTTP/1.1
+NGINX_STATUS=404
+NGINX_STATUS_FAMILY=4xx
+NGINX_TIMESTAMP_SEC=1644997980.987
+NGINX_TIME_LOCAL=19/Feb/2023:14:15:80 +0000
+NGINX_UPSTREAM_CONNECT_TIME=0.0
+NGINX_UPSTREAM_HEADER_TIME=0.0
+NGINX_UPSTREAM_RESPONSE_LENGTH=0
+NGINX_UPSTREAM_RESPONSE_TIME=0.0
+PRIORITY=5
+SYSLOG_IDENTIFIER=nginx-log
+