{"id":36456632,"url":"https://github.com/tlog-dev/tlog","last_synced_at":"2026-01-11T23:04:25.732Z","repository":{"id":57498528,"uuid":"185874781","full_name":"tlog-dev/tlog","owner":"tlog-dev","description":"Observability events system.","archived":false,"fork":false,"pushed_at":"2025-12-20T13:50:28.000Z","size":1594,"stargazers_count":18,"open_issues_count":0,"forks_count":6,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-12-22T17:15:49.821Z","etag":null,"topics":["distributed-tracing","go","golang","instrumentation","json","log","logfmt","logger","logging","metrics","monitoring","opentracing","performance-analysis","tlog","trace","tracer","tracing"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tlog-dev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2019-05-09T21:34:30.000Z","updated_at":"2025-12-20T13:50:32.000Z","dependencies_parsed_at":"2023-10-12T17:43:53.270Z","dependency_job_id":"ddc8a79c-807c-4b8a-a098-e2ab573c22c0","html_url":"https://github.com/tlog-dev/tlog","commit_stats":{"total_commits":548,"total_committers":1,"mean_commits":548.0,"dds":0.0,"last_synced_commit":"5c77318609cf8eb93cca3698f5070359333c39ee"},"previous_names":[],"tags_count":35,"template":false,"template_full_name":null,"purl":"pkg:github/tlog-dev/tlog","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tlog-dev%2Ftlog","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tlog-dev%2Ftlog/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tlog-dev%2Ftlog/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tlog-dev%2Ftlog/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tlog-dev","download_url":"https://codeload.github.com/tlog-dev/tlog/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tlog-dev%2Ftlog/sbom","scorecard":{"id":283432,"data":{"date":"2025-08-04","repo":{"name":"github.com/tlog-dev/tlog","commit":"47a5852eb372790f9b3589ef306882157f903f18"},"scorecard":{"version":"v5.2.1-28-gc1d103a9","commit":"c1d103a9bb9f635ec7260bf9aa0699466fa4be0e"},"score":3.4,"checks":[{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/go.yml:1","Warn: no topLevel permission defined: .github/workflows/golangci-lint.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#token-permissions"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#binary-artifacts"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#sast"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/tlog-dev/tlog/go.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/tlog-dev/tlog/go.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/go.yml:56: update your workflow using https://app.stepsecurity.io/secureworkflow/tlog-dev/tlog/go.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/golangci-lint.yml:10: update your workflow using https://app.stepsecurity.io/secureworkflow/tlog-dev/tlog/golangci-lint.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/golangci-lint.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/tlog-dev/tlog/golangci-lint.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/golangci-lint.yml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/tlog-dev/tlog/golangci-lint.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/golangci-lint.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/tlog-dev/tlog/golangci-lint.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/golangci-lint.yml:39: update your workflow using https://app.stepsecurity.io/secureworkflow/tlog-dev/tlog/golangci-lint.yml/master?enable=pin","Info:   0 out of   3 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   5 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-17T16:33:56.172Z","repository_id":57498528,"created_at":"2025-08-17T16:33:56.173Z","updated_at":"2025-08-17T16:33:56.173Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28326185,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-11T22:11:01.104Z","status":"ssl_error","status_checked_at":"2026-01-11T22:10:58.990Z","response_time":60,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["distributed-tracing","go","golang","instrumentation","json","log","logfmt","logger","logging","metrics","monitoring","opentracing","performance-analysis","tlog","trace","tracer","tracing"],"created_at":"2026-01-11T23:04:25.658Z","updated_at":"2026-01-11T23:04:25.718Z","avatar_url":"https://github.com/tlog-dev.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Documentation](https://pkg.go.dev/badge/tlog.app/go/tlog)](https://pkg.go.dev/tlog.app/go/tlog?tab=doc)\n[![Go workflow](https://github.com/tlog-dev/tlog/actions/workflows/go.yml/badge.svg)](https://github.com/tlog-dev/tlog/actions/workflows/go.yml)\n[![CircleCI](https://circleci.com/gh/tlog-dev/tlog.svg?style=svg)](https://circleci.com/gh/tlog-dev/tlog)\n[![codecov](https://codecov.io/gh/tlog-dev/tlog/tags/latest/graph/badge.svg)](https://codecov.io/gh/tlog-dev/tlog)\n[![Go Report Card](https://goreportcard.com/badge/tlog.app/go/tlog)](https://goreportcard.com/report/tlog.app/go/tlog)\n![GitHub tag (latest SemVer)](https://img.shields.io/github/v/tag/tlog-dev/tlog?sort=semver)\n\n# tlog\n\nAt least it is a logger, but it is much more than that.\nIt is an observability events system.\nEvent is a log or tracing message, tracing span start or finish, metric value, or anything you need.\nTons of work has been done to make it effective yet comfortable to use.\nThe events are encoded in a machine-readable format to be processed in any way, instant or later.\nEvents could be printed as logs, combined to build distributed traces, filtered and sent to an alerting service, processed and analyzed, and more.\n\ntlog is a new way of instrumentation. Log once use smart.\n\nExplore [examples](examples) and [extensions](ext).\n\n# Status\n\nThe logging API is pretty solid. Now I'm working mostly on backend parts, web interface, integrations.\n\n# Quick Start\n\n## Logger\n\n```go\ntlog.Printf(\"just like log.Printf\")\n\ntlog.Printw(\"but structured is\", \"much\", \"better\")\n\ntype Req struct {\n\tStart time.Time\n\tPath  string\n}\n\ntlog.Printw(\"any value type is\", \"supported\", \u0026Req{Start: time.Now(), Path: \"/resource/path\"})\n\nl := tlog.New(ioWriter)\nl.Printw(\"yet another logger, seriously?\")\n```\n\n## Debug Topics Instead of Log Levels\n\nNo need to choose between tons of unrelated Debug logs and scant Info logs.\nEach event can be filtered precisely and filter can be changed at runtime.\n\n```go\ntlog.SetVerbosity(\"rawdb,dump_request\")\n\ntlog.V(\"rawdb\").Printw(\"make db query\", \"query\", query) // V is inspired by glog.V\n\nif tlog.If(\"dump_request\") {\n\t// some heavy calculations could also be here\n\ttlog.Printw(\"full request data\", \"request\", request)\n}\n\nif tlog.If(\"full_token\") {\n\ttlog.Printw(\"db token\", \"token\", token)\n} else {\n\ttlog.Printw(\"db token\", \"token\", token.ID)\n}\n```\n\nFiltering is very flexible.\nYou can select topics, functions, types, files, packages, topics in locations.\nYou can select all in the file and then unselect some functions, etc.\n\n## Traces\n\nTraces are vital if you have simultaneous requests or distributed request propagation.\nSo they integrated into the logger to have the best experience.\n\n```go\nfunc ServeRequest(req *Request) {\n\tspan := tlog.Start(\"request_root\", \"client\", req.RemoteAddr, \"path\", req.URL.Path)\n\tdefer span.Finish()\n\n\tctx := tlog.ContextWithSpan(req.Context(), span)\n\n\tdoc, err := loadFromDB(ctx, req.URL.Path)\n\t// if err ...\n\n\t_ = doc\n}\n\nfunc loadFromDB(ctx context.Context, doc string) (err error) {\n\tparent := tlog.SpanFromContext(ctx)\n\tspan := parent.V(\"dbops\").Spawn(\"load_from_db\", \"doc\", doc)\n\tdefer func() {\n\t\tspan.Finish(\"err\", err) // record result error\n\t}()\n\n\tspan.Printw(\"prepare query\")\n\t// ...\n\n\tif dirtyPages \u003e tooMuch {\n\t\t// record event to the local span or to the parent if the local was not selected\n\t\tspan.Or(parent).Printw(\"too much of dirty pages\", \"durty_pages\", dirtyPages,\n\t\t\ttlog.KeyLogLevel, tlog.Warn)\n\t}\n}\n```\n\nTrace events are the same to log events, except they have IDs.\nYou do not need to add the same data to trace attributes and write them to logs. It's the same!\n\n## Data Format\n\nEvents are just key-value associative arrays. All keys are optional, any can be added.\nSome keys have special meaning, like event timestamp or log level.\nBut it's only a convention; representational parts primarily use it: console pretty text formatter moves time to the first column, for example.\n\nThe default format is a machine readable CBOR-like binary format. And the logger backend is just io.Writer.\nText, JSON, Logfmt converters are provided. Any other can be implemented.\n\nThere is also a special compression format: as fast and efficient as snappy\nyet safe in a sense that each event (or batch write) emits single Write to the file (io.Writer actually).\n\n# Performance\n\nPerformance was in mind from the very beginning. The idea is to emit as many events as you want and not to pay for that by performance.\nIn a typical efficient application CPU profile, the logger takes only 1-3% of CPU usage with no events economy.\nAlmost all allocations were eliminated. That means less work is done, no garbage collector pressure, and lower memory usage.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftlog-dev%2Ftlog","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftlog-dev%2Ftlog","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftlog-dev%2Ftlog/lists"}