{"id":15893777,"url":"https://github.com/chinanf-boy/two-log-explain","last_synced_at":"2026-02-23T21:06:50.217Z","repository":{"id":90548572,"uuid":"145224003","full_name":"chinanf-boy/two-log-explain","owner":"chinanf-boy","description":"explain: \u003ctwo-log\u003e 日志我只需要两种  ❤️ explain 🀄️","archived":false,"fork":false,"pushed_at":"2018-09-14T04:59:09.000Z","size":6,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-08T08:47:12.822Z","etag":null,"topics":["explain","log","ora","winston"],"latest_commit_sha":null,"homepage":null,"language":null,"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/chinanf-boy.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2018-08-18T13:54:08.000Z","updated_at":"2018-09-14T04:59:10.000Z","dependencies_parsed_at":null,"dependency_job_id":"e0e39508-bc8d-4477-9c61-a2432f7e4074","html_url":"https://github.com/chinanf-boy/two-log-explain","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chinanf-boy%2Ftwo-log-explain","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chinanf-boy%2Ftwo-log-explain/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chinanf-boy%2Ftwo-log-explain/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chinanf-boy%2Ftwo-log-explain/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chinanf-boy","download_url":"https://codeload.github.com/chinanf-boy/two-log-explain/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246866100,"owners_count":20846496,"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":["explain","log","ora","winston"],"created_at":"2024-10-06T08:13:41.072Z","updated_at":"2025-10-31T09:42:33.195Z","avatar_url":"https://github.com/chinanf-boy.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# two-log [![explain]][source] [![translate-svg]][translate-list]\n\n[explain]: http://llever.com/explain.svg\n[source]: https://github.com/chinanf-boy/Source-Explain\n[translate-svg]: http://llever.com/translate.svg\n[translate-list]: https://github.com/chinanf-boy/chinese-translate-list\n    \n「 我只需要两种信息输出方式 1. `ora` 2. `winston` 」\n\n[可以先用一下](https://github.com/chinanf-boy/two-log#usage)\n\n---\n\n## explain 🀄️\n\n\u003c!-- doc-templite START generated --\u003e\n\u003c!-- time = '2018 8.15' --\u003e\n\u003c!-- name = 'chinanf-boy' --\u003e\n\u003c!-- repo = 'two-log' --\u003e\n\u003c!-- commit = 'v0.0.11' --\u003e\n版本 | 与日期 | 最新更新 | 更多\n---|---|---|---\n[commit] | ⏰ 2018 8.15 | ![version] | [源码解释][source]\n\n[commit]: https://github.com/chinanf-boy/two-log/tree/v0.0.11\n[version]: https://img.shields.io/npm/v/two-log.svg\n\n\u003c!-- doc-templite END generated --\u003e\n\n### 贡献\n\n欢迎 👏 勘误/校对/更新贡献 😊 [具体贡献请看](https://github.com/chinanf-boy/chinese-translate-list#贡献)\n\n## 生活\n\n[help me live , live need money 💰](https://github.com/chinanf-boy/live-need-money)\n\n---\n\n### 目录\n\n\u003c!-- START doctoc generated TOC please keep comment here to allow auto update --\u003e\n\u003c!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --\u003e\n\n\n- [日志](#%E6%97%A5%E5%BF%97)\n  - [可以让人明白内部运行的情况](#%E5%8F%AF%E4%BB%A5%E8%AE%A9%E4%BA%BA%E6%98%8E%E7%99%BD%E5%86%85%E9%83%A8%E8%BF%90%E8%A1%8C%E7%9A%84%E6%83%85%E5%86%B5)\n  - [但是, 但多数使用的人并不想看到那么多的输出](#%E4%BD%86%E6%98%AF-%E4%BD%86%E5%A4%9A%E6%95%B0%E4%BD%BF%E7%94%A8%E7%9A%84%E4%BA%BA%E5%B9%B6%E4%B8%8D%E6%83%B3%E7%9C%8B%E5%88%B0%E9%82%A3%E4%B9%88%E5%A4%9A%E7%9A%84%E8%BE%93%E5%87%BA)\n  - [其实, 还可以使用主要给作者自身看的](#%E5%85%B6%E5%AE%9E-%E8%BF%98%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8%E4%B8%BB%E8%A6%81%E7%BB%99%E4%BD%9C%E8%80%85%E8%87%AA%E8%BA%AB%E7%9C%8B%E7%9A%84)\n- [命令行触发](#%E5%91%BD%E4%BB%A4%E8%A1%8C%E8%A7%A6%E5%8F%91)\n  - [是否调试模式](#%E6%98%AF%E5%90%A6%E8%B0%83%E8%AF%95%E6%A8%A1%E5%BC%8F)\n- [主要有三个生命周期方式](#%E4%B8%BB%E8%A6%81%E6%9C%89%E4%B8%89%E4%B8%AA%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E6%96%B9%E5%BC%8F)\n  - [ora的角度](#ora%E7%9A%84%E8%A7%92%E5%BA%A6)\n  - [winston的角度](#winston%E7%9A%84%E8%A7%92%E5%BA%A6)\n- [package.json](#packagejson)\n- [index.js](#indexjs)\n\n\u003c!-- END doctoc generated TOC please keep comment here to allow auto update --\u003e\n\n## 日志\n\n### 可以让人明白内部运行的情况\n\n那么 第一种日志, 就是使用[winston](https://github.com/winstonjs/winston) 「关于一切的日志」\n\n### 但是, 但多数使用的人并不想看到那么多的输出\n\n于是, 第二种日志, 就是使用等待 转圈圈的[ora](sindresorhus/ora) 优雅的终端等待\n\n### 其实, 还可以使用主要给作者自身看的\n\n第三种调试 [debug](https://github.com/visionmedia/debug) 需要设置node运行时的环境变量, 以达到相关调试\n\n信息的输出, 这种日志其实可以与 第一种日志 换一下也可以\n\n\u003e 但这更像是流程查看, 也许下次吧\n\n## 命令行触发\n\n### 是否调试模式\n\n命令行获取用户的 `-D`或其他值的定义,来选择 日志类型\n\n``` js\nconst twoLog = require('two-log');\nlet D = cli.flags['D'] ? true : false;\nlet l = twoLog(D);\n```\n\n## 主要有三个生命周期方式\n\n\u003e 主要是为了对应 `ora`, 而`winston`也就是不同样子的`console.log`\n\n- `start` 开始\n- `text`  换字\n- `stop`  结束 \n\n\u003e 我们来看看对应日志的三个阶段\n\n### ora的角度\n\n\u003e [官方例子](https://github.com/sindresorhus/ora#usage)\n\n``` js\nconst ora = require('ora');\n\nconst spinner = ora('Loading unicorns').start(); // start 🎩 字, 还有颜色\n\nsetTimeout(() =\u003e {\n\tspinner.color = 'yellow';\n\tspinner.text = 'Loading rainbows';  // text 阶段 可以换字, 还有颜色\n}, 1000);\n```\n\n- stop 阶段, 有几种可能性\n\n``` js\nspinner.stop() // 就没了, 换个行\n\nspinner.succeed([text]) // 打个勾 ✅, 结束\n\nspinner.fail([text]) // 打个差 ❌, 结束\n\nspinner.warn([text]) // ⚠️, 结束\n```\n\n### winston的角度\n\n这个库的日志, 在三个阶段, 其实差不多一样的\n\n\u003e 只是选择哪种等级的输出而已\n\n``` js\nconst levels = { \n  error: 0, \n  warn: 1, \n  info: 2, \n  verbose: 3, \n  debug: 4, \n  silly: 5 \n};\n```\n\n好了, 看了两种日志的表现, 我们进入库吧\n\n## package.json\n\n``` js\n\"main\": \"dist/two-log.js\",\n\"bin\": \"cli.js\"，\n\"scripts\": {\n    \"test\": \"nyc ava -v -s\",\n    \"prepublish\": \"npm run build\",\n    \"build\": \"microbundle\",\n```\n\n命令行`cli.js`文件只是一个demo, 让你[自观感受](https://github.com/chinanf-boy/two-log#demo)\n\n\u003e 我用了`microbundle`压缩构建, `index.js`是源代码\n\n## index.js\n\n- [ ] [explain two-log](./two-log.md)\n\n简单用文字讲讲:\n\n1. 导入两个库\n\n2. 因为是二选一, 所有准备 文件的全局变量`LOGGER`, 和是否调试的全局变量`D`\n\n3. 初始化`two-log`, 因为`winston`的初始化有需要自定义, \n\n3.1 所以提供api给用户\n\n``` js\nlet API = {\n\tora: Ora, // Ora 源\n\tlog: winston, // winston 源\n\tsetLog: options =\u003e {\n\t\tlogOpts = Object.assign({}, defaultWinston, options); // 以及可以 覆盖默认的选项 的函数\n\t},\n};\n```\n\n3.2 一个命令行只需要一个日志,所以我上锁了\n\n``` js\n\t\tif (LOCK) {\n\t\t\tthrow new TypeError(`Set two-log debug just only one,❌`);\n\t\t}\n```\n\n\u003e 当然这也是为了, 日志的生命与程序的生命周期联系在一起, 一起开始, 一起结束\n\n3.3 并返回 log对象\n\n\n``` js\n// log对象, 当然你可以用其他变量\n\treturn {\n\t\tstart: loggerStart,\n\t\ttext: loggerText,\n\t\tstop: loggerStop,\n\t\tone: oneOra,\n    };\n```\n\n\u003e `oneOra`是为了只显示一次 正确/错误/警告 的信息\n\n4. loggerStart-根据用户与初始化, 拿到唯一的日志,并存入`LOGGER`\n\n\u003e loggerStart === log.start\n\n``` js\n/**\n * @description start logger\n * @param {string} str\n * @param {string} options.ora ora color\n * @param {string} options.log winston log level\n * @param {string} options.only only one {ora|log} 其中这一个选项, 可以自己设置只能是哪种日志能被创建\n */\nfunction loggerStart(str, options) {\n```\n\n\u003e 创建 是 根据`D`与`only`当然还有`LOGGER`是否存在的值 决定的\n\n5. loggerText 换文本与或颜色\n\n``` js\n/**\n * @description set logger text\n * @param {String} str\n * @param {string} options.ora ora color\n * @param {string} options.log winston log level\n * @param {string} options.only only one {ora|log} 其中这一个选项, 可以自己设置只能是哪种日志能被输出\n */\nfunction loggerText(str, options) {\n```\n\n\u003e 文本 是 根据`D`与`only`当然还有`LOGGER`是否存在的值 决定的\n\n6. loggerStop 结束日志与清空全局变量\n\n``` js\n/**\n * @description logger stop\n * @param {string} str\n * @param {string} options.ora ora {fail|succeed|warn} https://github.com/sindresorhus/ora#instance 表现一下程序的结果\n * @param {string} options.log winston log level\n * @param {string} options.only only one {ora|log} 其中这一个选项, 可以自己设置只能是哪种日志能被输出\n */\nfunction loggerStop(str, options) {\n```\n\n因为是结束, 总要打个东西, 说明程序是否正确\n\n\u003e 结束 是 根据`D`与`only`当然还有`LOGGER`是否存在的值 决定的\n\n散花 🌹","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchinanf-boy%2Ftwo-log-explain","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchinanf-boy%2Ftwo-log-explain","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchinanf-boy%2Ftwo-log-explain/lists"}