{"id":19745410,"url":"https://github.com/btd/huzzah","last_synced_at":"2025-07-23T12:35:09.461Z","repository":{"id":57269716,"uuid":"49815846","full_name":"btd/huzzah","owner":"btd","description":"very fast and dead simple hierarchical text logger.","archived":false,"fork":false,"pushed_at":"2017-12-09T18:49:32.000Z","size":193,"stargazers_count":11,"open_issues_count":0,"forks_count":1,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-07-08T14:47:28.634Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/btd.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}},"created_at":"2016-01-17T12:13:33.000Z","updated_at":"2022-11-17T12:42:36.000Z","dependencies_parsed_at":"2022-09-02T09:51:19.994Z","dependency_job_id":null,"html_url":"https://github.com/btd/huzzah","commit_stats":null,"previous_names":[],"tags_count":23,"template":false,"template_full_name":null,"purl":"pkg:github/btd/huzzah","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/btd%2Fhuzzah","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/btd%2Fhuzzah/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/btd%2Fhuzzah/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/btd%2Fhuzzah/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/btd","download_url":"https://codeload.github.com/btd/huzzah/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/btd%2Fhuzzah/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266680332,"owners_count":23967791,"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-07-23T02:00:09.312Z","response_time":66,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"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":[],"created_at":"2024-11-12T02:08:14.073Z","updated_at":"2025-07-23T12:35:09.441Z","avatar_url":"https://github.com/btd.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Huzzah\n\n[![Join the chat at https://gitter.im/btd/huzzah](https://badges.gitter.im/btd/huzzah.svg)](https://gitter.im/btd/huzzah?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=badge)\n\n[![Build Status](https://travis-ci.org/btd/huzzah.svg?branch=master)](https://travis-ci.org/btd/huzzah)\n[![Coverage Status](https://coveralls.io/repos/github/btd/huzzah/badge.svg?branch=master)](https://coveralls.io/github/btd/huzzah?branch=master)\n\nYou can finally say - Huzzah!!!\n\nIt is one of the fastest and dead simple hierarchical text logger.\n\nLet step by step explain what does it mean.\n\n## One of fastests\n\n```\n$ node benchmark/json.js\nhuzzah-fast-time.info json format x 988,555 ops/sec ±0.92% (89 runs sampled)\nhuzzah.info json format x 482,806 ops/sec ±2.96% (82 runs sampled)\nhuzzah.info empty x 1,468,626 ops/sec ±1.66% (85 runs sampled)\nhuzzah.info no format x 1,612,675 ops/sec ±1.43% (85 runs sampled)\nbunyan.info x 281,758 ops/sec ±2.04% (85 runs sampled)\npino.info x 735,848 ops/sec ±0.72% (93 runs sampled)\npino-fast-time.info x 1,217,475 ops/sec ±1.10% (88 runs sampled)\n\n$ node benchmark/logging.js\nhuzzah.info text format x 953,088 ops/sec ±0.96% (89 runs sampled)\nhuzzah.info json format x 548,774 ops/sec ±0.97% (90 runs sampled)\nhuzzah.info raw logger x 1,840,130 ops/sec ±0.76% (90 runs sampled)\nwinston.info x 68,487 ops/sec ±16.17% (56 runs sampled)\nintel.info x 141,388 ops/sec ±4.93% (76 runs sampled)\nbunyan.info x 209,748 ops/sec ±3.09% (66 runs sampled)\nlog4js.info x 636,488 ops/sec ±1.52% (81 runs sampled)\npino.info x 424,048 ops/sec ±2.76% (83 runs sampled)\n(node:672) (pino) `slowtime` is deprecated: use `timestamp: pino.stdTimeFunctions.slowTime`\n```\n\n## Dead simple\n\nIn usage:\n\n```js\nvar logger = require(\"huzzah\").get(\"some_logger\");\n\nlogger.trace(\"Some error can happen %s\", \"argument\");\n```\n\nBut we still need some configuration what and where to output:\n\n```js\nvar ConsoleHandler = require(\"huzzah/handlers\").ConsoleHandler;\n\n// require(\"huzzah\") returns default logger factory instance\n// which contains loggers and their settings\nrequire(\"huzzah\")\n  // get settings of logger with name 'root'\n  .settings(\"root\") // see hierarchical section about what root mean (it is parent of all loggers)\n  // output every log message to console, from all loggers (.addHandler call can be chained)\n  .addHandler(new ConsoleHandler());\n```\n\n## Hierarchical loggers\n\nAll loggers have string names. We can create chain of loggers by separating its name with dots. For example if we have\nlogger with name `a.b.c` than its parents will be `a.b`, `a` and `root`.\n\nThat means you can configure some parent loggers and all nested loggers will reuse thier settings. In simple case you\ncan configure only **root** logger as single configuration point.\n\n## How to use\n\n1. Install\n\n   ```\n   npm install --save huzzah\n   ```\n\n2. Configure\n\n   ```js\n   var huzzah = require(\"huzzah\");\n\n   // get settings of some loggers\n   var settingsOfRootLogger = huzzah.settings(\"root\");\n\n   settingsOfRootLogger\n     // let add console handler\n     .addHandler(new ConsoleHandler())\n     // let add output to file\n     .addHandler(new StreamHandler().setStream(fs.createWriteStream(\"debug.log\")));\n   ```\n\n   See [API.md](https://github.com/btd/huzzah/edit/master/API.md) for more info.\n\n3. Use\n\n   ```js\n   var logger = require(\"huzzah\").get(\"some_logger\");\n\n   logger.error(\"Some error happen\", err);\n   ```\n\n## FAQ\n\n1. I need logger to reject all records with log level \u003c INFO.\n\n   ```js\n   // settings it is LoggerSettings (what is returned by LoggerFactory#settings)\n   settings.setLevel(\"INFO\");\n   ```\n\n2. I want my own format of records\n\n   ```js\n   handler.setFormat(\"%date %msg%n\");\n   ```\n\n3. I want to produce JSON\n\n   ```js\n   var jsonFormat = require(\"huzzah/json-format\");\n   handler.setFormat(jsonFormat());\n\n   //jsonFormat can accept bunyan style serializers\n   ```\n\n4. I want to add more fields to record (for JSON output)\n\n   ```js\n   logger.with({ req, res }).info(\"Some message\");\n   ```\n\n   With such way you can use it with express like:\n\n   ```\n   app.use((req, res, next) =\u003e {\n     req.logger = logger.with({ req, res, req_id: uuid() });\n   });\n   ```\n\n   And use req.logger to output additional context information.\n\n# license\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbtd%2Fhuzzah","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbtd%2Fhuzzah","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbtd%2Fhuzzah/lists"}