[syslog-ng] syslog-ng, json and handle escaping properly

Arthur Lambert lambertarthur22 at gmail.com
Fri Apr 24 16:00:41 UTC 2020


> log {
>   source { example-msg-generator(num(1)
template("{\"category\":\"BOOT\",\"level\":\"INFO\",\"message\":\"Check
pstore partition..\"}")); };
>   parser { json-parser(); };
>   destination { file(/dev/stdout template("$(format-json --key
category,level,message timestamp=${ISODATE})\n")); };
>};

Ok so first I update the syslog-ng config file with your modification

diff --git a/board/xxx/xxx/rootfs/etc/syslog-ng.conf
b/board/xxx/xxx/rootfs/etc/syslog-ng.conf
index c28ea5e59d..6b93ce24b8 100644
--- a/board/xxx/xxx/rootfs/etc/syslog-ng.conf
+++ b/board/xxxx/xxx/rootfs/etc/syslog-ng.conf
@@ -4,10 +4,6 @@ filter f_middleware {
     facility("local1");
 };
-template t_json_filetemplate {
-    template("{\"timestamp\":\"${ISODATE}\",${MESSAGE}\n");
-};
 source s_kernel {
        file("/proc/kmsg" program_override("kernel"));
 };
@@ -21,7 +17,8 @@ destination d_kernel {
 };
 destination d_middleware {
-       file("/data/logs/middleware.log", template(t_json_filetemplate));
+       file(/data/logs/middleware.log template("$(format-json --key
category,level,message timestamp=${ISODATE})\n"));;
+
 };
 log {
@@ -31,6 +28,7 @@ log {

 log {
        source(s_middleware);
+       parser { json-parser(); };
        filter(f_middleware);
        destination(d_middleware);
 };

I also add the '{' in my macro log

diff --git a/log/log_private.h b/log/log_private.h
index b1e2dd31..09e875e1 100644
--- a/log/log_private.h
+++ b/log/log_private.h
@@ -18,7 +18,7 @@
 #define _PRINT_DEBUG(M, ...)
    \
        do {
     \
-               syslog(LOG_DEBUG,
"\"category\":\"%s\",\"level\":\"DEBUG\",\"message\":\"" M "%s\"}\n",
__DIR__, __VA_ARGS__); \
+               syslog(LOG_DEBUG,
"{\"category\":\"%s\",\"level\":\"DEBUG\",\"message\":\"" M "%s\"}\n",
__DIR__, __VA_ARGS__); \
        } while (0)
 #else
@@ -28,32 +28,32 @@
 #define _PRINT_INF_GOTO(M, ...)
                     \
        do {
                     \
-               syslog(LOG_DEBUG,
"\"category\":\"%s\",\"level\":\"INFO\",\"message\":\"" M "%s\"}\n",
__DIR__, __VA_ARGS__); \
+               syslog(LOG_DEBUG,
"{\"category\":\"%s\",\"level\":\"INFO\",\"message\":\"" M "%s\"}\n",
__DIR__, __VA_ARGS__); \
                errno = 0;
                     \
                goto error;
                    \
(...)
 #endif /* !LOG_PRIVATE_H_ */

So basically I suppose that your modification allows to syslog-ng  to
understand by itself that there is an extra pair key/value
in my format and that I am using JSON format.  So let's do some test now...

int main (void)
{
  PRINT_DEBUG ("Test simple.");
  PRINT_DEBUG ("\nTest with return line\n.");
  PRINT_DEBUG ("Test with json inside message : {\"key\" : \"%d\", \"key2\"
: \"%d\"} ", 42, 21);
  PRINT_DEBUG ("Test simple2.");
  PRINT_DEBUG ("Begin. Program name : %s", argv[0]);
 (...)
}

Result :

# cat /data/logs/middleware.log
{"timestamp":"2020-04-24T15:36:28+02:00","message":"Test
simple.","level":"DEBUG","category":"MPU_CORE"}
{"timestamp":"2020-04-24T15:36:28+02:00","message":"Test
simple2.","level":"DEBUG","category":"MPU_CORE"}
{"timestamp":"2020-04-24T15:36:28+02:00","message":"Begin. Program name :
nano_core","level":"DEBUG","category":"MPU_CORE"}
{"timestamp":"2020-04-24T15:36:28+02:00","message":"Board config :
nano_proto1","level":"DEBUG","category":"MPU_CORE"}
{"timestamp":"2020-04-24T15:36:28+02:00","message":"Initialize
GPIO..","level":"INFO","category":"GPIO_MANAGER"}
{"timestamp":"2020-04-24T15:36:28+02:00","message":"Synchronize dictionnary
with current rootfs content","level":"INFO","category":"AUDIO_MANAGER"}

As you can see, the line with \n and the JSON debug output is not in the
final log. It was not in a good format for the JSON syslog-ng parser.
How can I fix that? Now that syslog-ng is able to understand that there is
a category, a level, a message in my JSON. I cannot just ask for
syslog-ng to use the escape template only on the column with message key
before sending the message to the parser?

I am able to fix the \n issue by using unix-dgram instead of unix-stream
but without really understand why. New result after using unix-dgram :

{"timestamp":"2020-04-24T15:58:09+02:00","message":"Test
simple.","level":"DEBUG","category":"MPU_CORE"}
{"timestamp":"2020-04-24T15:58:09+02:00","message":"\nTest with return
line\n.","level":"DEBUG","category":"MPU_CORE"}
{"timestamp":"2020-04-24T15:58:09+02:00","message":"Test
simple2.","level":"DEBUG","category":"MPU_CORE"}
{"timestamp":"2020-04-24T15:58:09+02:00","message":"Begin. Program name :
nano_core","level":"DEBUG","category":"MPU_CORE"}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.balabit.hu/pipermail/syslog-ng/attachments/20200424/ccc88d27/attachment-0001.html>


More information about the syslog-ng mailing list