{"id":16415432,"url":"https://github.com/deno-library/logger","last_synced_at":"2025-03-21T03:32:07.172Z","repository":{"id":46303173,"uuid":"271970835","full_name":"deno-library/logger","owner":"deno-library","description":"logger for deno","archived":false,"fork":false,"pushed_at":"2024-02-07T07:23:20.000Z","size":428,"stargazers_count":21,"open_issues_count":2,"forks_count":2,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-05-01T12:45:10.561Z","etag":null,"topics":["consolelogger","deno","filelogger","logger"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/deno-library.png","metadata":{"files":{"readme":"README.md","changelog":"changelog.md","contributing":null,"funding":".github/FUNDING.yml","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},"funding":{"github":"urielch"}},"created_at":"2020-06-13T08:33:57.000Z","updated_at":"2024-05-17T12:46:46.588Z","dependencies_parsed_at":"2024-01-29T09:34:16.859Z","dependency_job_id":"7dad42ec-bcdd-4d30-9139-f12f77fcd558","html_url":"https://github.com/deno-library/logger","commit_stats":{"total_commits":35,"total_committers":3,"mean_commits":"11.666666666666666","dds":"0.17142857142857137","last_synced_commit":"5e89a3d5a3e73251dbbbd7492970f2ae89eea8e3"},"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deno-library%2Flogger","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deno-library%2Flogger/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deno-library%2Flogger/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deno-library%2Flogger/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/deno-library","download_url":"https://codeload.github.com/deno-library/logger/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244506056,"owners_count":20463465,"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":["consolelogger","deno","filelogger","logger"],"created_at":"2024-10-11T07:05:43.709Z","updated_at":"2025-03-21T03:32:07.165Z","avatar_url":"https://github.com/deno-library.png","language":"TypeScript","funding_links":["https://github.com/sponsors/urielch"],"categories":["TypeScript"],"sub_categories":[],"readme":"# deno-logger\n\n[![NPM Version](https://img.shields.io/npm/v/@denodnt/logger.svg?style=flat)](https://www.npmjs.org/package/@denodnt/logger)\n[![JSR Version](https://jsr.io/badges/@deno-library/logger)](https://jsr.io/@deno-library/logger)\n\nDeno / NodeJS colorful logger colorful logger\n\nFor Deno usage refer to [deno-logger doc](https://deno.land/x/logger)\n\n## Useage\n\n### console logger\n\n```js\nimport { Logger } from \"jsr:@deno-library/logger\";\n// or\n// import Logger from \"https://deno.land/x/logger@v1.1.7/logger.ts\";\n\nconst logger = new Logger();\n\nlogger.debug(\"i am from consoleLogger\", \"debug\");\nlogger.info(\"i am from consoleLogger\", { name: \"zfx\" });\nlogger.log(\"i am from consoleLogger\", \"hello\");\nlogger.warn(\"i am from consoleLogger\", 1, \"any\");\nlogger.error(\"i am from consoleLogger\", new Error(\"test\"));\n```\n\n### file and console logger\n\n```js\nimport { Logger } from \"jsr:@deno-library/logger\";\n// or\n// import Logger from \"https://deno.land/x/logger@v1.1.7/logger.ts\";\n\nconst logger = new Logger();\n\n// console only\nlogger.debug(\"i am from consoleLogger\", \"debug\");\nlogger.info(\"i am from consoleLogger\", { name: \"zfx\" });\nlogger.log(\"i am from consoleLogger\", \"hello\");\nlogger.warn(\"i am from consoleLogger\", 1, \"any\");\nlogger.error(\"i am from consoleLogger\", new Error(\"test\"));\n\nawait logger.initFileLogger(\"../log\");\n\n// file and console\nlogger.debug(\"i am from consoleLogger\", \"debug\");\nlogger.info(\"i am from fileLogger\", { name: \"zfx\" });\nlogger.log(\"i am from consoleLogger\", \"hello\");\nlogger.warn(\"i am from fileLogger\", 1, \"any\");\nlogger.error(\"i am from fileLogger\", new Error(\"test\"));\n```\n\n### file logger only\n\n```js\nimport { Logger } from \"jsr:@deno-library/logger\";\n// or\n// import Logger from \"https://deno.land/x/logger@v1.1.7/logger.ts\";\n\nconst logger = new Logger();\nawait logger.initFileLogger(\"../log\");\nlogger.disableConsole();\n\n// file only\nlogger.info([\"i am from fileLogger\", 1], { name: \"zfx\" });\n```\n\n### file logger optional parameter\n\ninterface\n\n```ts\ninterface fileLoggerOptions {\n  rotate?: boolean; // cut by day\n  maxBytes?: number;\n  // Only available if maxBytes is provided, Otherwise you will get an error\n  maxBackupCount?: number;\n}\n```\n\nexample\n\n```js\nimport { Logger } from \"jsr:@deno-library/logger\";\n// or\n// import Logger from \"https://deno.land/x/logger@v1.1.7/logger.ts\";\n\nconst logger = new Logger();\n\n// cut by day\n// filename is [date]_[type].log\n// example 2020-05-25_warn.log, 2020-05-25_info.log, 2020-05-25_error.log\nawait logger.initFileLogger(\"../log\", {\n  rotate: true,\n});\n\n// maxBytes\n// filename is [type].log.[timestamp]\n// example: info.log.1590374415956\nawait logger.initFileLogger(\"../log\", {\n  maxBytes: 10 * 1024,\n});\n\n// rotate and maxBytes\n// filename is [date]_[type].log.[timestamp]\n// example: 2020-05-25_info.log.1590374415956\nawait logger.initFileLogger(\"../log\", {\n  rotate: true,\n  maxBytes: 10 * 1024,\n});\n\n// maxBytes and maxBackupCount\n// filename is [type].log.[n]\n// example info.log.1, info.log.2 ...\n// when reach maxBackupCount, the [type].log.[maxBackupCount-1] will be overwrite\n//  detail:\n// `maxBytes` specifies the maximum size\n// in bytes that the log file can grow to before rolling over to a new one. If the\n// size of the new log message plus the current log file size exceeds `maxBytes`\n// then a roll over is triggered. When a roll over occurs, before the log message\n// is written, the log file is renamed and appended with `.1`. If a `.1` version\n// already existed, it would have been renamed `.2` first and so on. The maximum\n// number of log files to keep is specified by `maxBackupCount`. After the renames\n// are complete the log message is written to the original, now blank, file.\n//\n// Example: Given `log.txt`, `log.txt.1`, `log.txt.2` and `log.txt.3`, a\n// `maxBackupCount` of 3 and a new log message which would cause `log.txt` to\n// exceed `maxBytes`, then `log.txt.2` would be renamed to `log.txt.3` (thereby\n// discarding the original contents of `log.txt.3` since 3 is the maximum number of\n// backups to keep), `log.txt.1` would be renamed to `log.txt.2`, `log.txt` would\n// be renamed to `log.txt.1` and finally `log.txt` would be created from scratch\n// where the new log message would be written.\nawait logger.initFileLogger(\"../log\", {\n  maxBytes: 10 * 1024,\n  maxBackupCount: 10,\n});\n\n// rotate and maxBytes and maxBackupCount\n// filename is [date]_[type].log.[n]\n// example 2020-05-25_info.log.1, 2020-05-25_info.log.2\n// when reach maxBackupCount, the [type].log.[maxBackupCount-1] will be overwrite\nawait logger.initFileLogger(\"../log\", {\n  rotate: true,\n  maxBytes: 10 * 1024,\n  maxBackupCount: 10,\n});\n\n// rotate and maxBackupCount\n// maxBackupCount will be ignored\nawait logger.initFileLogger(\"../log\", {\n  rotate: true,\n  maxBackupCount: 10,\n});\n```\n\nThe following conditions will throw an error\n\n```ts\n// maxBackupCount\n// get error =\u003e maxBackupCount must work with maxBytes\nawait logger.initFileLogger(\"../log\", {\n  maxBackupCount: 10,\n});\n// rotate and maxBackupCount\n// get error =\u003e maxBackupCount must work with maxBytes\nawait logger.initFileLogger(\"../log\", {\n  rotate: true,\n  maxBackupCount: 10,\n});\n```\n\n## disableConsole and enableConsole\n\n```js\nimport { Logger } from \"jsr:@deno-library/logger\";\n// or\n// import Logger from \"https://deno.land/x/logger@v1.1.7/logger.ts\";\n\nconst logger = new Logger();\n\n// console\nlogger.info(\"console enabled, you can see me\");\nlogger.disableConsole();\n// no message is logged\nlogger.info(\"console disabled\");\nlogger.enableConsole();\n// console\nlogger.info(\"console enabled, you can see me\");\n```\n\n## disableFile and enableFile\n\n```js\nimport { Logger } from \"jsr:@deno-library/logger\";\n// or\n// import Logger from \"https://deno.land/x/logger@v1.1.7/logger.ts\";\n\nconst logger = new Logger();\nawait logger.initFileLogger(\"../log\");\n\nlogger.disableFile();\n// not log to file\nlogger.info(\"file disbaled\");\nlogger.enableFile();\n// log to file\nlogger.info(\"file enabled, you can see me\");\n```\n\n## disable and enable\n\n- disable disable write to file and terminal, don't care if it is currently\n  writing to a file or terminal, but hope to restore the currently configuration\n  later\n- enable restore previous log configuration: file, terminal or both\n\nexample:\n\n1. fileLogger =\u003e disable =\u003e enable =\u003e fileLogger\n2. consoleLogger =\u003e disable =\u003e enable =\u003e consoleLogger\n3. fileLogger, consoleLogger =\u003e disable =\u003e enable =\u003e fileLogger, consoleLogger\n\n```js\nimport { Logger } from \"jsr:@deno-library/logger\";\n// or\n// import Logger from \"https://deno.land/x/logger@v1.1.7/logger.ts\";\n\nconst logger = new Logger();\nawait logger.initFileLogger(\"../log\");\n\nlogger.disable();\nlogger.enable();\n```\n\n## test\n\n```bash\ndeno test --allow-read --allow-write\n```\n\n## Dual-Stack / Triple-Stack integration\n\nA dual-stack project is generaly a npm project that can be import as commonJS\nmodule or as ESM module; So if a project can also be import as a Deno module,\nit's a triple-stack one.\n\nTo convert your Deno project to a dual-stack npm project, you should use\n[deno/dnt](https://deno.land/x/dnt), then create a `_build_npm.ts` or\n`scripts/build_npm.ts` that looks like:\n\n```ts\nimport { build, emptyDir } from \"@deno/dnt\";\n\n// grap the next version number as you want\nconst version: Deno.args[0];\nawait emptyDir(\"./npm\");\nawait build({\n  entryPoints: [\"./mod.ts\"],\n  outDir: \"./npm\",\n  shims: {\n    deno: true,\n  },\n  compilerOptions: {\n    lib: [\"dom\", \"esnext\"],\n  },\n  package: {\n    name: \"pkg-name\",\n    version: version,\n    // ... package stuff\n  },\n  // map your favorite deno logger to its npm port.\n  mappings: {\n    \"https://deno.land/x/logger@v1.1.7/logger.ts\": {\n      name: \"@denodnt/logger\",\n      version: \"1.1.7\",\n      peerDependency: false,\n    },\n  },\n});\n```\n\n## Screenshots\n\nconsoleLogger\\\n![consoleLogger](https://github.com/deno-library/logger/blob/master/screenshots/consoleLogger.png?raw=true)\n\nfileLogger\\\n![fileLogger](https://github.com/deno-library/logger/blob/master/screenshots/fileLogger.png?raw=true)\n\ncut logs by day\\\n![CutByDay](https://github.com/deno-library/logger/blob/master/screenshots/fileLogger.rotate.png?raw=true)\n\nMore screenshots in the `screenshots` folder.\n\n## Logger interface\n\n```ts\ninterface fileLoggerOptions {\n  rotate?: boolean; // cut by day\n  maxBytes?: number; // the maximum size in bytes that the log file can grow to before rolling over to a new one\n  maxBackupCount?: number; // maxBackupCount must work with maxBytes\n}\n\ninterface LoggerInerface {\n  constructor();\n\n  debug(...args: unknown[]): void;\n  info(...args: unknown[]): void;\n  log(...args: unknown[]): void;\n  warn(...args: unknown[]): void;\n  error(...args: unknown[]): void;\n\n  initFileLogger(dir: string, options: fileLoggerOptions = {}): Promise\u003cvoid\u003e;\n\n  disableConsole(): void;\n  enableConsole(): void;\n\n  disableFile(): void;\n  enableFile(): void;\n\n  disable(): void;\n  enable(): void;\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeno-library%2Flogger","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdeno-library%2Flogger","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeno-library%2Flogger/lists"}