{"id":28961409,"url":"https://github.com/taoensso/trove","last_synced_at":"2025-06-25T03:09:27.765Z","repository":{"id":299818011,"uuid":"1004240873","full_name":"taoensso/trove","owner":"taoensso","description":"Modern logging facade for Clojure/Script","archived":false,"fork":false,"pushed_at":"2025-06-18T13:20:21.000Z","size":12,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-06-18T13:33:29.923Z","etag":null,"topics":["clojure","clojurescript","epl","logging","monitoring","observability","taoensso"],"latest_commit_sha":null,"homepage":"https://www.taoensso.com/trove","language":"Clojure","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"epl-1.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/taoensso.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":"FUNDING.yml","license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":"ptaoussanis","custom":"https://www.taoensso.com/clojure"}},"created_at":"2025-06-18T10:27:22.000Z","updated_at":"2025-06-18T13:20:25.000Z","dependencies_parsed_at":"2025-06-18T13:34:16.321Z","dependency_job_id":"f78ba72f-be8d-43a0-9ce5-4cd281f51bb2","html_url":"https://github.com/taoensso/trove","commit_stats":null,"previous_names":["taoensso/trove"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/taoensso/trove","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taoensso%2Ftrove","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taoensso%2Ftrove/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taoensso%2Ftrove/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taoensso%2Ftrove/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/taoensso","download_url":"https://codeload.github.com/taoensso/trove/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taoensso%2Ftrove/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261589907,"owners_count":23181434,"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","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":["clojure","clojurescript","epl","logging","monitoring","observability","taoensso"],"created_at":"2025-06-24T02:03:05.264Z","updated_at":"2025-06-24T02:03:05.838Z","avatar_url":"https://github.com/taoensso.png","language":"Clojure","funding_links":["https://github.com/sponsors/ptaoussanis","https://www.taoensso.com/clojure"],"categories":[],"sub_categories":[],"readme":"\u003ca href=\"https://www.taoensso.com/clojure\" title=\"More stuff by @ptaoussanis at www.taoensso.com\"\u003e\u003cimg src=\"https://www.taoensso.com/open-source.png\" alt=\"Taoensso open source\" width=\"340\"/\u003e\u003c/a\u003e  \n[**API**][cljdoc] | [Slack channel][] | Latest release: [v1.0.0-beta2](../../releases/tag/v1.0.0-beta2) 🚧 (2025-06-20)\n\n[![Clj tests][Clj tests SVG]][Clj tests URL]\n[![Cljs tests][Cljs tests SVG]][Cljs tests URL]\n[![Graal tests][Graal tests SVG]][Graal tests URL]\n\n# Trove\n\n### Modern logging facade for Clojure/Script\n\nTrove is a minimal, modern alternative to [tools.logging](https://github.com/clojure/tools.logging) that supports:\n\n- Both traditional **and structured** logging\n- Both Clojure **and ClojureScript**\n- **Richer filtering** capabilities (by namespace, id, level, data, etc.)\n\nIt's TINY (1 macro, 0 deps, ~100 loc), fast, and highly flexible.\n\nIt supports any backend including: [Telemere](https://www.taoensso.com/telemere), [Timbre](https://www.taoensso.com/timbre), [μ/log](https://github.com/BrunoBonacci/mulog), [tools.logging](https://github.com/clojure/tools.logging), [SLF4J](https://www.slf4j.org/), etc.\n\nIt works great for **library authors** that want to emit rich logging _without_ forcing their users to adopt any particular backend.\n\n## To log\n\n1. Include the (tiny) [dependency](../../releases/) in your project or library.\n2. Use `trove/log!` to make your logging calls (see its [docstring](https://cljdoc.org/d/com.taoensso/trove/CURRENT/api/taoensso.trove#log!) for options):\n\n```clojure\n(ns my-ns (:require [taoensso.trove :as trove]))\n\n(trove/log! {:level :info, :id :auth/login, :data {:user-id 1234}, :msg \"User logged in!\"})\n```\n\nThe above logging call expands to:\n\n```clojure\n(when-let [log-fn trove/*log-fn*] ; Chosen backend fn\n  (log-fn ... \"my-ns\" :info :auth/login [line-num column-num]\n    {:msg \"User logged in!\", :data {:user-id 1234}} ...))\n```\n\nAnd the chosen backend then takes care of filtering and output.\n\n## To choose a backend\n\nJust set `trove/*log-fn*` to an appropriate fn (see its [docstring](https://cljdoc.org/d/com.taoensso/trove/CURRENT/api/taoensso.trove#*log-fn*) for fn args).\n\nThe default fn prints logs to `*out*` or the JS console.  \nAlt fns are also available for some common backends, e.g.:\n\n```clojure\n(ns my-ns\n  (:require\n   [taoensso.trove.x] ; x ∈ #{console telemere timbre mulog tools-logging slf4j} (default console)\n   [taoensso.trove :as trove]))\n\n(trove/set-log-fn! (taoensso.trove.x/get-log-fn))\n(trove/set-log-fn! nil) ; To noop all `trove/log!` calls\n```\n\nIt's easy to write your own log-fn if you want to use a different backend or customise anything.\n\n## What about expensive data?\n\nStructured logging sometimes involves expensive data collection or transformation, e.g.:\n\n```clojure\n(trove/log! {:id ::my-event, :data (expensive) ...})\n```\n\nThat's why Trove automatically delays any values that need runtime evaluation, allowing the backend to apply filtering *before* paying realization costs.\n\nThis explains the `:lazy_` `{:keys [msg data error kvs]}` arg given to [`truss/*log-fn*`](https://cljdoc.org/d/com.taoensso/trove/CURRENT/api/taoensso.trove#*log-fn*).\n\n## Funding\n\nYou can [help support][sponsor] continued work on this project and [others][my work], thank you!! 🙏\n\n## License\n\nCopyright \u0026copy; 2025 [Peter Taoussanis][].  \nLicensed under [EPL 1.0](LICENSE.txt) (same as Clojure).\n\n\u003c!-- Common --\u003e\n\n[GitHub releases]: ../../releases\n[GitHub issues]:   ../../issues\n[GitHub wiki]:     ../../wiki\n[Slack channel]:   https://www.taoensso.com/trove/slack\n\n[Peter Taoussanis]: https://www.taoensso.com\n[sponsor]:          https://www.taoensso.com/sponsor\n[my work]:          https://www.taoensso.com/clojure-libraries\n\n\u003c!-- Project --\u003e\n\n[cljdoc]: https://cljdoc.org/d/com.taoensso/trove/CURRENT/api/taoensso.trove\n\n[Clojars SVG]: https://img.shields.io/clojars/v/com.taoensso/trove.svg\n[Clojars URL]: https://clojars.org/com.taoensso/trove\n\n[Clj tests SVG]:  https://github.com/taoensso/trove/actions/workflows/clj-tests.yml/badge.svg\n[Clj tests URL]:  https://github.com/taoensso/trove/actions/workflows/clj-tests.yml\n[Cljs tests SVG]:  https://github.com/taoensso/trove/actions/workflows/cljs-tests.yml/badge.svg\n[Cljs tests URL]:  https://github.com/taoensso/trove/actions/workflows/cljs-tests.yml\n[Graal tests SVG]: https://github.com/taoensso/trove/actions/workflows/graal-tests.yml/badge.svg\n[Graal tests URL]: https://github.com/taoensso/trove/actions/workflows/graal-tests.yml","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftaoensso%2Ftrove","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftaoensso%2Ftrove","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftaoensso%2Ftrove/lists"}