diff --git a/README.md b/README.md new file mode 100644 index 0000000..c7852df --- /dev/null +++ b/README.md @@ -0,0 +1,87 @@ +# Structured Log Formatter +**Terminal utility to pretty-print JSON-strucutred log lines.** + +## Usage + +`slfmt` is intended to be used to filter logging output from a process. It +reads from `stdin` and writes to `stdout`. It expects to see a JSON object on +each line of input, and will pretty-print the object to `stdout`. Escape codes +in the log lines (`\n` for newlines, etc.) are supported and will be expanded +in the output. + +Any lines that are not valid JSON objects will be printed as-is to `stdout`. + +Example: + +```bash +./run-server | slfmt +``` + +Sample Output: + +``` +--------------------------------------------------------------------------------------- +scope: "server/rest_api" +level: "ERROR" +ts: + 2025-01-03T08:46:35-06:00 (local) 2025-01-03T14:46:35Z (UTC) +msg: unhandled exception (DbError) +err: + ERROR: relation "users" does not exist + LINE 1: SELECT id FROM users WHERE id = '43422d65-6874-44ce-b9b3-f8c... + ^ + +stack: + /home/username/.local/share/mise/installs/nim/2.2.0/nimble/pkgs2/mummy-0.4.5-cb7f70cd4d6fd3a563e00e664cfbd8cbd3c39b79/mummy.nim(519) workerProc + /home/username/.local/share/mise/installs/nim/2.2.0/nimble/pkgs2/mummy-0.4.5-cb7f70cd4d6fd3a563e00e664cfbd8cbd3c39b79/mummy.nim(450) runTask + /home/username/.local/share/mise/installs/nim/2.2.0/nimble/pkgs2/mummy-0.4.5-cb7f70cd4d6fd3a563e00e664cfbd8cbd3c39b79/mummy/routers.nim(271) :anonymous + /home/username/projects/server/api/src/main/nim/server_api/api.nim(65) :anonymous + /home/username/projects/server/api/src/main/nim/server_api/auth.nim(74) extractSession + /home/username/projects/fiber-orm-nim/src/fiber_orm.nim(599) createOrUpdateUser + /home/username/projects/fiber-orm-nim/src/fiber_orm.nim(384) createOrUpdateRecord + /home/username/.local/share/mise/installs/nim/2.2.0/nimble/pkgs2/db_connector-0.1.0-d68319e3785fa937f0465ea915e942b61b6b5442/db_connector/db_postgres.nim(497) getAllRows + /home/username/.local/share/mise/installs/nim/2.2.0/nimble/pkgs2/db_connector-0.1.0-d68319e3785fa937f0465ea915e942b61b6b5442/db_connector/db_postgres.nim(174) setupQuery + /home/username/.local/share/mise/installs/nim/2.2.0/nimble/pkgs2/db_connector-0.1.0-d68319e3785fa937f0465ea915e942b61b6b5442/db_connector/db_postgres.nim(116) dbError + [[reraised from: + /home/username/.local/share/mise/installs/nim/2.2.0/nimble/pkgs2/mummy-0.4.5-cb7f70cd4d6fd3a563e00e664cfbd8cbd3c39b79/mummy.nim(519) workerProc + /home/username/.local/share/mise/installs/nim/2.2.0/nimble/pkgs2/mummy-0.4.5-cb7f70cd4d6fd3a563e00e664cfbd8cbd3c39b79/mummy.nim(450) runTask + /home/username/.local/share/mise/installs/nim/2.2.0/nimble/pkgs2/mummy-0.4.5-cb7f70cd4d6fd3a563e00e664cfbd8cbd3c39b79/mummy/routers.nim(271) :anonymous + /home/username/projects/server/api/src/main/nim/server_api/api.nim(65) :anonymous + /home/username/projects/server/api/src/main/nim/server_api/auth.nim(74) extractSession + /home/username/projects/fiber-orm-nim/src/fiber_orm.nim(727) createOrUpdateUser + ]] + + + +--------------------------------------------------------------------------------------- +scope: "server/rest_api" +level: "ERROR" +ts: + 2025-01-03T08:46:35-06:00 (local) 2025-01-03T14:46:35Z (UTC) +msg: unhandled exception (DbError) +err: + ERROR: relation "users" does not exist + LINE 1: SELECT id FROM users WHERE id = '43422d65-6874-44ce-b9b3-f8c... + ^ + +stack: + /home/username/.local/share/mise/installs/nim/2.2.0/nimble/pkgs2/mummy-0.4.5-cb7f70cd4d6fd3a563e00e664cfbd8cbd3c39b79/mummy.nim(519) workerProc + /home/username/.local/share/mise/installs/nim/2.2.0/nimble/pkgs2/mummy-0.4.5-cb7f70cd4d6fd3a563e00e664cfbd8cbd3c39b79/mummy.nim(450) runTask + /home/username/.local/share/mise/installs/nim/2.2.0/nimble/pkgs2/mummy-0.4.5-cb7f70cd4d6fd3a563e00e664cfbd8cbd3c39b79/mummy/routers.nim(271) :anonymous + /home/username/projects/server/api/src/main/nim/server_api/api.nim(65) :anonymous + /home/username/projects/server/api/src/main/nim/server_api/auth.nim(74) extractSession + /home/username/projects/fiber-orm-nim/src/fiber_orm.nim(599) createOrUpdateUser + /home/username/projects/fiber-orm-nim/src/fiber_orm.nim(384) createOrUpdateRecord + /home/username/.local/share/mise/installs/nim/2.2.0/nimble/pkgs2/db_connector-0.1.0-d68319e3785fa937f0465ea915e942b61b6b5442/db_connector/db_postgres.nim(497) getAllRows + /home/username/.local/share/mise/installs/nim/2.2.0/nimble/pkgs2/db_connector-0.1.0-d68319e3785fa937f0465ea915e942b61b6b5442/db_connector/db_postgres.nim(174) setupQuery + /home/username/.local/share/mise/installs/nim/2.2.0/nimble/pkgs2/db_connector-0.1.0-d68319e3785fa937f0465ea915e942b61b6b5442/db_connector/db_postgres.nim(116) dbError + [[reraised from: + /home/username/.local/share/mise/installs/nim/2.2.0/nimble/pkgs2/mummy-0.4.5-cb7f70cd4d6fd3a563e00e664cfbd8cbd3c39b79/mummy.nim(519) workerProc + /home/username/.local/share/mise/installs/nim/2.2.0/nimble/pkgs2/mummy-0.4.5-cb7f70cd4d6fd3a563e00e664cfbd8cbd3c39b79/mummy.nim(450) runTask + /home/username/.local/share/mise/installs/nim/2.2.0/nimble/pkgs2/mummy-0.4.5-cb7f70cd4d6fd3a563e00e664cfbd8cbd3c39b79/mummy/routers.nim(271) :anonymous + /home/username/projects/server/api/src/main/nim/server_api/api.nim(65) :anonymous + /home/username/projects/server/api/src/main/nim/server_api/auth.nim(74) extractSession + /home/username/projects/fiber-orm-nim/src/fiber_orm.nim(727) createOrUpdateUser + ]] + +``` diff --git a/slfmt.nimble b/slfmt.nimble index e1a05d5..eca3386 100644 --- a/slfmt.nimble +++ b/slfmt.nimble @@ -1,6 +1,6 @@ # Package -version = "0.1.0" +version = "0.1.1" author = "Jonathan Bernard" description = "Small utility to pretty-print strucutured logs." license = "MIT" diff --git a/src/slfmt.nim b/src/slfmt.nim index 3f1d80a..3c111f9 100644 --- a/src/slfmt.nim +++ b/src/slfmt.nim @@ -53,7 +53,7 @@ proc prettyPrintFormat(logLine: string): string = try: var logJson = parseJson(logLine) - result = '-'.repeat(terminalWidth()) + result = '-'.repeat(terminalWidth()) & "\n" # Print the known fields in order first for f in fieldDisplayOrder: