{"id":31129081,"url":"https://github.com/ceejbot/tale","last_synced_at":"2025-09-18T01:52:06.036Z","repository":{"id":307726565,"uuid":"1029379301","full_name":"ceejbot/tale","owner":"ceejbot","description":"an ndjson log tailing pretty-printer","archived":false,"fork":false,"pushed_at":"2025-09-03T06:17:35.000Z","size":386,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"latest","last_synced_at":"2025-09-11T04:50:39.327Z","etag":null,"topics":["logs","ndjson","tail"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ceejbot.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-07-31T00:53:43.000Z","updated_at":"2025-09-03T06:17:38.000Z","dependencies_parsed_at":"2025-08-01T21:42:06.704Z","dependency_job_id":"0a25fdc9-8efd-4ab0-ac56-53220ac4feec","html_url":"https://github.com/ceejbot/tale","commit_stats":null,"previous_names":["ceejbot/tale"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/ceejbot/tale","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ceejbot%2Ftale","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ceejbot%2Ftale/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ceejbot%2Ftale/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ceejbot%2Ftale/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ceejbot","download_url":"https://codeload.github.com/ceejbot/tale/tar.gz/refs/heads/latest","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ceejbot%2Ftale/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":275696212,"owners_count":25511351,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-17T02:00:09.119Z","response_time":84,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["logs","ndjson","tail"],"created_at":"2025-09-18T01:52:04.759Z","updated_at":"2025-09-18T01:52:06.017Z","avatar_url":"https://github.com/ceejbot.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# tale\n\nA tail-compatible tool for pretty-printing `ndjson` files, especially logs.\n\nAll I wanted was a newline-delimited json log pretty-printer, and they wouldn't give it to me. Then this happened. It's missing some polish and a few last small features, but is otherwise complete. If you want to cat or tail a log file with `ndjson` content, `tale` does a nice job with constant modest memory use.\n\n## Usage\n\n```\n\u003e tale --help\nA tail-compatible tool for pretty-printing ndjson files, especially logs.\n\nTale displays the colorfully-formatted contents of FILE, by default stdin, to stdout. It highlights\nthe fields likely to appear in log lines for servers, such as level or severity, the log message,\ntimestamps, and so on. It also displays every field that shows up in the log line, using the color\ntheme you have set in your terminal.\n\nLines that are invalid json are printed intact, without formatting.\n\nTale can also follow and display more than one file at a time, with header decoration options like\ntail's.\n\nUsage: tale [OPTIONS] [ARGS]...\n\nArguments:\n  [ARGS]...\n          (offset) [file ...] where offset can be +N, -N, or N\n\nOptions:\n  -f, --follow\n          Follow the file, continuing to watch for more data to arrive\n\n  -F, --sticky\n          Follow the file, also checking to see if has been renamed or has an new inode number. If\n          the file does not exist yet, wait and display it from the beginning if and when it is\n          created\n\n  -b, --blocks \u003cBLOCKS\u003e\n          Start tailing the input offset by ±N blocks\n\n  -c, --bytes \u003cBYTES\u003e\n          Start tailing the input offset by ±N bytes; e.g., to skip garbage\n\n  -n, --offset \u003cOFFSET\u003e\n          Start tailing the input offset by ±N lines\n\n  -v, --verbose\n          When following more than one file, show a header with the file name along with every line\n          from that file\n\n  -q, --quiet\n          Do not ever show file name headers when following more than one file\n\n  -t, --timestamps\n          Show timestamps, which are hidden by default\n\n      --window \u003cWINDOW\u003e\n          Batch window size for multi-file tailing (in milliseconds)\n          [default: 250]\n\n      --chunked\n          Force use of chunked file processing for better memory efficiency on large files\n\n      --no-chunked\n          Disable chunked file processing and always use streaming (might use more memory)\n\n  -a, --adaptive\n          Disable adaptive chunking\n\n  -m, --max-memory \u003cMAX_MEMORY\u003e\n          Set a limit on how much memory can be used in file buffers\n\n  -h, --help\n          Print help (see a summary with '-h')\n\n  -V, --version\n          Print version\n```\n\nI have no plans to do any of the other `tail` options. Uh. Other than multi-file tailing. And some more offset types. And the quiet/verbose… I give in.\n\n## Notes\n\nOn my Macbook `tale` will pretty-print a million-line file at an approx rate of 387K lines/sec using just under 4MB of memory, steady. Claude Code wrote benchmark tools including a test data generator; find them in the [benches](./benches) directory. I should try to source real-world data to test with, however, because I think they will provide better results. Real-world data is way more consistent than the test data is. Tale is CPU-bound on json deserialization, and it is fastest when deserializing into well-understood logging patterns.\n\nTo that point: If there is a specific json logging pattern you use that `tale` does not support directly, please give me some samples-- anonymized if you prefer-- and I'll implement deserialization and pretty-printing specifically for that pattern. Though honestly it's fast enough.\n\nThere is fairly stupid single-pass layout approach to print in columns the key/value pairs I don't have an opinion. It isn't very pretty because it is single-pass. There is hand-tweaked formatting for the keys I do have an opinion about.\n\n## LICENSE\n\nThis code is licensed via [the Parity Public License.](https://paritylicense.com) This license requires people who build on top of this source code to share their work with the community, too. This means if you hack on it for work, you have to make your work repo public somehow. Fair's fair. See the license text for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fceejbot%2Ftale","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fceejbot%2Ftale","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fceejbot%2Ftale/lists"}