{"id":20279305,"url":"https://github.com/ahiipsa/zerg","last_synced_at":"2025-04-11T06:18:40.432Z","repository":{"id":9642590,"uuid":"62865493","full_name":"ahiipsa/zerg","owner":"ahiipsa","description":"lightweight logging library","archived":false,"fork":false,"pushed_at":"2022-02-13T12:05:45.000Z","size":316,"stargazers_count":12,"open_issues_count":4,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-09T07:03:46.379Z","etag":null,"topics":["debugger","debugging-tool","developer-tools","javascript","logger","nodejs","zerg"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ahiipsa.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-07-08T06:47:34.000Z","updated_at":"2023-01-17T13:52:22.000Z","dependencies_parsed_at":"2022-08-07T05:01:12.065Z","dependency_job_id":null,"html_url":"https://github.com/ahiipsa/zerg","commit_stats":null,"previous_names":[],"tags_count":19,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ahiipsa%2Fzerg","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ahiipsa%2Fzerg/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ahiipsa%2Fzerg/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ahiipsa%2Fzerg/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ahiipsa","download_url":"https://codeload.github.com/ahiipsa/zerg/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248351552,"owners_count":21089301,"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":["debugger","debugging-tool","developer-tools","javascript","logger","nodejs","zerg"],"created_at":"2024-11-14T13:29:26.907Z","updated_at":"2025-04-11T06:18:40.411Z","avatar_url":"https://github.com/ahiipsa.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Build Status](https://travis-ci.org/ahiipsa/zerg.svg?branch=master)](https://travis-ci.org/ahiipsa/zerg)\n[![Coverage Status](https://coveralls.io/repos/github/ahiipsa/zerg/badge.svg?branch=master)](https://coveralls.io/github/ahiipsa/zerg?branch=master)\n[![npm version](https://badge.fury.io/js/zerg.svg)](https://badge.fury.io/js/zerg)\n[![npm downloads](https://img.shields.io/npm/dm/zerg.svg)](https://www.npmjs.com/package/zerg)\n\n# Zerg\n\nLightweight logging library for apps and libs\n\n## Futures\n\n- Zero dependencies\n- TypeScript support\n- Easy to use\n- Custom listeners/transports\n- Support Node.js and Browsers\n\n## Getting started\n\n### Installation\n\n`npm i --save zerg`\n\nor\n\n`yarn add zerg`\n\n### Usage\n\nMake module `logger.js`:\n\n```js\nimport zerg from 'zerg';\nimport {\n  consoleNodeColorful,\n  consoleBrowserColorful,\n} from 'zerg/dist/transports';\n\nconst logger = zerg.createLogger();\n\n// Add console logger\nconst listener = zerg.createListener({\n  handler: consoleBrowserColorful, // for browser\n  // handler: consoleNodeColorful, // for node\n});\n\nlogger.addListener(listener);\n\nexport default logger;\n```\n\nMake your module and import `logger.js`:\n\n```js\nimport logger from './logger';\n\nconst log = logger('moduleName');\n\nlog.verbose('verbose message');\nlog.debug('debug message');\nlog.info('info message');\nlog.warn('warn message');\nlog.error('error message', {foo: 'bar'});\n```\n\nResult:\n\n![ScreenShot](https://raw.github.com/ahiipsa/zerg/master/example/example.png)\n\n## API\n\n### Types\n\n```\ntype TExtendedData = Record\u003cstring, any\u003e;\n```\n\n```\ntype TLogMessage = {\n  timestamp: number;\n  loggerName: string;\n  moduleName: string;\n  level: TLogLevel;\n  message: string;\n  extendedData?: TExtendedData\n};\n```\n\n```\ntype LogLevel = 'verbose' | 'debug' | 'info' | 'warn' | 'error';\n```\n\n```\ntype Listener = (log: TLogMessage) =\u003e void;\n```\n\n### zerg.createLogger(): Logger - Create logger instance\n\n### zerg.createListener(params): LogListener - Create listener for logger\n\n- params.handler: (logMessage: TLogMessage) =\u003e void;\n- params.filter?: (logMessage: TLogMessage) =\u003e boolean; (optional)\n- params.levels?: LogLevel; (optional)\n\n### logger.addListener(listener: LogListener)\n\n```js\nimport zerg from 'zerg';\n\nconst logger = zerg.createLogger();\n\nconst listener = zerg.createListener({\n  handler: (logMessage) =\u003e console.log(logMessage),\n  levels: ['info'], // listen only `info` level\n});\n\nlogger.addListener(listener);\n\nlogger.module('myModule').info('Info message', {foo: 'bar'});\nlogger.module('myModule').warn('Warn message', {bar: 'baz'});\nlogger.module('myModule').error('Error message');\n\n/* console\n{\n  timestamp: 1467967421933,\n  level: 'info',\n  moduleName: 'myModule',\n  message: 'Info message',\n  extendedData: {foo: 'bar'},\n}\n*/\n```\n\nUse filter - Listen messages only from \"Sarah\" module\n\n```js\nimport zerg from 'zerg';\n\nconst logger = zerg.createLogger();\n\nconst listener = zerg.createListener({\n  handler: (logMessage) =\u003e console.log(logMessage),\n  filter: (logMessage) =\u003e logMessage.moduleName === 'Sarah', // listen messages only from \"Sarah\" module\n  // levels: [], // at this case levels are ignoring\n});\n\nlogger.addListener(listener);\n\nlogger.module('Alice').info('Info message', {foo: 'bar'});\nlogger.module('Bob').warn('Warn message', {bar: 'baz'});\nlogger.module('Sarah').error('Error message');\n\n/* console\n{\n  timestamp: 1467967421933,\n  level: 'info',\n  moduleName: 'myModule',\n  message: 'Info message',\n  extendedData: {foo: 'bar'},\n}\n*/\n```\n\n### removeListener(LogListener): void;\n\n### removeAllListeners(): void;\n\n### module(moduleName: string): LoggerModule;\n\n### getModule(moduleName: string): LoggerModule | null;\n\n### getModules(): Record\u003cstring, LoggerModule\u003e;\n\n## Other Examples\n\n### [Sentry](http://sentry.io) transport\n\n```js\nimport zerg from 'zerg';\nconst logger = zerg.createLogger();\n\nconst SENTRY_LEVEL_MAP = {\n  info: 'info',\n  warn: 'warning',\n  error: 'error',\n  fatal: 'error',\n};\n\nfunction sentryTransport(logMessage) {\n  const level = SENTRY_LEVEL_MAP[logMessage.level];\n\n  Sentry.withScope((scope) =\u003e {\n    scope.setLevel(level);\n\n    Object.keys(logMessage.extendedData).forEach((key) =\u003e {\n      scope.setExtra(key, logMessage.extendedData[key]);\n    });\n\n    scope.setTag('module', logMessage.moduleName);\n\n    Sentry.captureMessage(logMessage.message);\n  });\n}\n\nconst listener = zerg.createListener({handler: sentryTransport});\n\nlogger.addListener(listener);\n```\n\n### Remote debug transport\n\nIt is be useful for debug when browser (or device) doesn't provide tool: Android with default browser, WinPhone, SmartTV.\n\nAt browser:\n\n```js\nimport zerg from 'zerg';\nconst logger = zerg.createLogger();\n\nfunction remoteTransport(logMessage) {\n  const req = new XMLHttpRequest();\n  req.open('POST', 'http://myhost.com:3000/log', false);\n  req.setRequestHeader('Content-type', 'application/json');\n  req.send(JSON.stringify(logMessage));\n}\n\nconst listener = zerg.createListener({handler: remoteTransport});\n\nlogger.addListener(listener);\n```\n\n_Don't forget, host (http://myhost.com:3000/log) must be reachable from device._\n\nAt server you may use [express](https://www.npmjs.com/package/express):\n\n```js\nconst express = require('express');\nconst bodyParser = require('body-parser');\n\nconst app = express();\napp.use(bodyParser.json()); // for parsing application/json\n\napp.post('/log', (req, res) =\u003e {\n  console.log(req.body);\n});\n\napp.listen(3000);\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fahiipsa%2Fzerg","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fahiipsa%2Fzerg","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fahiipsa%2Fzerg/lists"}