使用Bunyan和Logentrieslogin打字稿
我想在我的离子应用程序中使用logentries.com设置远程日志logging。
这是从我的package.json
摘录:
"dependencies": { "bunyan": "^1.8.5", "bunyan-logentries": "^1.2.0", }, "devDependencies": { "@types/bunyan": "0.0.35", "@types/bunyan-logentries": "0.1.30", "typescript": "2.0.9" },
码
import {createStream} from "bunyan-logentries"; import * as Logger from "bunyan"; // ... constructor() { let token = 'xxxxxxxxxxxxxxxxx'; let log = Logger.createLogger({ name: '', streams: [{ level: 'info', stream: createStream({token: token}), type: 'raw' }] }); log.info("Created log"); }
问题
我的IDE并没有警告我有关任何错误。 但只要我运行的应用程序,我得到以下错误:
存在不是一个function。 (在'exists(pkgPath)'中,'exists'是未定义的)
findPackage@http://localhost:8101/build/main.js:131257:18 register@http://localhost:8101/build/main.js:131332:31 http://localhost:8101/build/main.js:112585:50 http://localhost:8101/build/main.js:113391:34 __webpack_require__@http://localhost:8101/build/main.js:20:34 http://localhost:8101/build/main.js:129423:37 __webpack_require__@http://localhost:8101/build/main.js:20:34 http://localhost:8101/build/main.js:29972:95 __webpack_require__@http://localhost:8101/build/main.js:20:34 http://localhost:8101/build/main.js:80592:90 __webpack_require__@http://localhost:8101/build/main.js:20:34 http://localhost:8101/build/main.js:59390:96 __webpack_require__@http://localhost:8101/build/main.js:20:34 http://localhost:8101/build/main.js:59495:94 __webpack_require__@http://localhost:8101/build/main.js:20:34 http://localhost:8101/build/main.js:128048:94 __webpack_require__@http://localhost:8101/build/main.js:20:34 http://localhost:8101/build/main.js:116775:92 __webpack_require__@http://localhost:8101/build/main.js:20:34 http://localhost:8101/build/main.js:149625:89 __webpack_require__@http://localhost:8101/build/main.js:20:34 http://localhost:8101/build/main.js:66:37 global code@http://localhost:8101/build/main.js:67:12
我认为问题的核心在于@types
与实际的节点模块不匹配,但不清楚这是如何解决的。
我面临同样的问题。 bunyan-logentries
模块依赖于le_node
:节点的logentries模块。
le_node
使用浏览器le_node
用的net
和tls
模块。 继续,我已经实现了一个自定义的bunayanstream,通过REST API将日志发送给logentry。 它是直接的代码和它的作品。
这里是一个示例代码来说明这个解决scheme。
创buildBunyan实例的LoggerService:
@Injectable() export class LoggerService { constructor(private http: Http) { } public create(name: string): Logger{ return Bunyan.createLogger({ name: name, streams: [{ stream: new LogentriesBunyanStream(AppConfig.LogEntries.token, this.http), type: 'raw' }] }); } }
将日志发送给logentry的bunyan自定义stream:
export class LogentriesBunyanStream extends Writable { private token: string; private http: Http; constructor(token: string, http: Http) { super({objectMode: true}); this.http = http; this.token = token; } public _write(rec: any, encoding?: string, cb?: Function) { // Replace the level code with a friendly string rec.level = LogentriesBunyanStream.resolveLevel(rec.level); // Send the post request to logentries // https://docs.logentries.com/docs/http-post const LOGENTRIES_URL = "https://webhook.logentries.com/noformat/logs/"; let headers = new Headers(); headers.append("Content-Type", 'application/json'); let requestoptions = new RequestOptions({ method: RequestMethod.Post, headers: headers, body: JSON.stringify(rec) }); this.http.request(LOGENTRIES_URL + this.token, requestoptions).toPromise().then((response) => { cb(); }).catch((error) =>{ console.log("faield to send log to the logentries server"); }); }; private static resolveLevel(bunyanLevel) { let levelToName = { 10: 'DEBUG', 20: 'DEBUG', 30: 'INFO', 40: 'WARN', 50: 'ERROR', 60: 'CRIT' }; return levelToName[bunyanLevel] || 'INFO'; } };
也许它有帮助,
问候。