# Linux v6.12 Documentation/ABI/testing/dev-kmsg and kernel/printk/printk.c info_print_ext_header: "%u,%llu,%llu,%c%s;" (PRI as facility<<3|level, sequence, microseconds since boot, '-' or 'c', ",caller=T%u" or C%u), then the text with "\x%02x" for control bytes, '\' and bytes past 126; a line that starts with a space adds KEY=value context
# Lines from that dev-kmsg document and util-linux v2.42.4 tests/ts/dmesg/cid-kmsg-input
7,160,424069,-;pci_root PNP0A03:00: host bridge window [io  0x0000-0x0cf7] (ignored) ⇒ {"rule": "kmsg", "level": "debug", "leveled": true, "name": "kernel", "message": "pci_root PNP0A03:00: host bridge window [io  0x0000-0x0cf7] (ignored)", "device_ns": 424069000, "prefixed": true}
6,339,5140900,-;NET: Registered protocol family 10 ⇒ {"rule": "kmsg", "level": "info", "leveled": true, "name": "kernel", "message": "NET: Registered protocol family 10", "device_ns": 5140900000}
30,340,5690716,-;udevd[80]: starting version 181 ⇒ {"rule": "kmsg", "level": "info", "leveled": true, "name": "", "message": "udevd[80]: starting version 181", "device_ns": 5690716000}
0,0,0,-,caller=T1;Linux version 6.6.4-arch1-1 (linux@archlinux) (gcc (GCC) 13.2.1 20230801, GNU ld (GNU Binutils) 2.41.0) #1 SMP PREEMPT_DYNAMIC Mon, 04 Dec 2023 00:29:19 +0000 ⇒ {"rule": "kmsg", "level": "critical", "name": "kernel", "device_ns": 0, "message": "Linux version 6.6.4-arch1-1 (linux@archlinux) (gcc (GCC) 13.2.1 20230801, GNU ld (GNU Binutils) 2.41.0) #1 SMP PREEMPT_DYNAMIC Mon, 04 Dec 2023 00:29:19 +0000"}
# the context lines are read as no format of their own, so the joiner adds them to the record before
 SUBSYSTEM=acpi ⇒ {"rule": "plain", "level": "info", "prefixed": false, "leveled": false, "message": " SUBSYSTEM=acpi"}
 DEVICE=+acpi:PNP0A03:00 ⇒ {"rule": "plain", "level": "info", "message": " DEVICE=+acpi:PNP0A03:00", "prefixed": false}
# constructed 3,500,1234567,-,caller=T1;usb 1-1: device descriptor read/64, error -71 ⇒ {"rule": "kmsg", "level": "error", "name": "kernel", "message": "usb 1-1: device descriptor read/64, error -71", "device_ns": 1234567000}
# constructed 4,501,1234600,-,caller=C2;thermal thermal_zone0: critical temperature reached ⇒ {"rule": "kmsg", "level": "warn", "name": "kernel", "device_ns": 1234600000, "message": "thermal thermal_zone0: critical temperature reached"}
# constructed 1,1,1,-,caller=T2;Command line: initrd=\x5cucode.img initrd=\x5cinitramfs-linux.img rw ⇒ {"rule": "kmsg", "level": "critical", "name": "kernel", "message": "Command line: initrd=\\ucode.img initrd=\\initramfs-linux.img rw"}
# constructed 6,8,8,-,caller=T9;usb 1-1: Product: Pump\xe2\x84\xa2 Bench ⇒ {"rule": "kmsg", "level": "info", "name": "kernel", "message": "usb 1-1: Product: Pump™ Bench"}
# constructed 6,9,9,-;first part\x0asecond part ⇒ {"rule": "kmsg", "level": "info", "name": "kernel", "message": "first part\nsecond part"}
# constructed 6,10,10,c;a fragment of a line ⇒ {"rule": "kmsg", "level": "info", "name": "kernel", "message": "a fragment of a line"}
# constructed 5,11,11,-;audit: type=2000 audit(1702926179.015:1): state=initialized audit_enabled=0 res=1 ⇒ {"rule": "kmsg+kv", "level": "info", "leveled": true, "name": "kernel", "message": "audit: type=2000 audit(1702926179.015:1): state=initialized audit_enabled=0 res=1"}
# constructed 2,12,12,-;Kernel panic - not syncing: VFS: Unable to mount root fs ⇒ {"rule": "kmsg", "level": "critical", "name": "kernel", "message": "Kernel panic - not syncing: VFS: Unable to mount root fs"}
# constructed 12,13,13,-;user space wrote a warning ⇒ {"rule": "kmsg", "level": "warn", "name": "", "message": "user space wrote a warning"}
# constructed 191,14,14,-;local7 debug ⇒ {"rule": "kmsg", "level": "debug", "name": "", "message": "local7 debug"}
# constructed 6,15,15,-,caller=T1,future=1;fields to come are skipped ⇒ {"rule": "kmsg", "level": "info", "name": "kernel", "message": "fields to come are skipped"}
# constructed 6,16,16,-; ⇒ {"rule": "kmsg", "level": "info", "name": "kernel", "message": ""}
# a record needs every header field and the semicolon
# constructed 6,339,5140900;missing flags ⇒ {"rule": "plain", "level": "info", "leveled": false, "message": "6,339,5140900;missing flags"}
# constructed 6,339,-;missing the stamp ⇒ {"rule": "plain", "level": "info", "leveled": false, "message": "6,339,-;missing the stamp"}
# constructed 6,abc,5140900,-;sequence is not a number ⇒ {"rule": "plain", "level": "info", "leveled": false, "message": "6,abc,5140900,-;sequence is not a number"}
# constructed 6,339,5140900,-: a colon is not the separator ⇒ {"rule": "plain", "level": "info", "leveled": false, "message": "6,339,5140900,-: a colon is not the separator"}
# constructed 6 ,339,5140900,-;space after the priority ⇒ {"rule": "plain", "level": "info", "leveled": false, "message": "6 ,339,5140900,-;space after the priority"}
# constructed ,339,5140900,-;no priority ⇒ {"rule": "plain", "level": "info", "leveled": false, "message": ",339,5140900,-;no priority"}
# constructed <6>,339,5140900,-;a syslog priority is another format ⇒ {"rule": "syslog", "level": "info", "message": ",339,5140900,-;a syslog priority is another format"}
# constructed 6,339,5140900,x;flags are - or c ⇒ {"rule": "plain", "level": "info", "leveled": false, "message": "6,339,5140900,x;flags are - or c"}
# constructed [    5.140900] NET: Registered protocol family 10 ⇒ {"rule": "linux", "level": "info", "name": "kernel", "device_ns": 5140900000, "message": "NET: Registered protocol family 10"}
# constructed kern  :info  : [    5.140900] NET: Registered protocol family 10 ⇒ {"rule": "dmesg", "level": "info", "name": "kernel", "message": "NET: Registered protocol family 10"}
