-
-
Notifications
You must be signed in to change notification settings - Fork 1.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
如何更优雅的使用egg的日志体系? #2006
Comments
思考的很细,感谢反馈。
|
多谢回复我的2、5实际上可以通过一套解决方案来实现,2的目的也是为了5. 即通过记录请求响应记录来复现全链路路由。 看了那个RFC,可能大家理解的方向不同。 抛个砖。。。 理论上,所谓tracer也好,全链路也罢。
个人理解其目的,一言以蔽之:追踪从入到出的全链路路由,并且可以回溯各阶段响应情况。 主要几点:
解决问题前提
存储问题
侵入式问题
结合ELK体系的解决方案简单说下思路
|
1和2,我在尝试写一个中间件来自己实现下。 |
赞。这里还是要澄清一点: Egg 是微内核 + 插件生态的方式的。 这些高级功能,都是在插件里面去实现的,因此:
因此我们非常欢迎社区开发者能分享出自己的实践,来碾压我们的某些插件。 |
个人感觉:如果要接入elk的话,egg的日志格式就不太适用,希望可以自定义日志输出格式! |
egg-logger 现在的自定义输出有什么问题么?不是一直支持么? |
我自己封装了一个middleware,但并无法改变前边这一部分。
如果想要改变输出的format,应该是需要自定义Logger了,没法直接使用ctx.logger。 如果直接把 |
贴一个我自己写了一部分的code [!注意]以下代码并没有解决问题在
在
之后, 感觉应该是我什么地方的配置没加载。。。 很尴尬。。。😓 |
[!注意]以下代码会导致linux中文件句柄数打开过多,具体见命令
|
@atian25 前面这段 2018-01-27 15:40:32,534 INFO 48536 [-/::1/-/7ms GET /user/judge?a=2] 格式是定死的,你觉得没问题?日志系统都需要这样的格式吗?貌似并不是吧,一般开发者要么就是改变配置将输出格式设置为JSON,要么就是向上面说的自己写中间件,个人觉得不是很理想,还有就是日志的储存位置,就算我改了日志的摆放位置。系统的终端日志还是会打到根目录下(非本地开发 npm run dev),个人觉得没必要打出来,想知道打出来有什么意义? |
这个没太看懂,默认的配置是 |
我就想知道错误日志,怎么能加上 ip ua 和请求参数信息... |
要上下文必须用
可以这样自定义 |
@popomore 如果我只想改掉某个 custom logger 的 context logger 的 formattor 呢? |
这个不能改 format,只能在原来的 logger 上增加上下文信息 后面在 example 里面加个例子好了 |
我看着默认实现好像带了一些参数,但是实际打的日志,我没看到 ip(更新,是我看错了...) get paddingMessage() {
const ctx = this.ctx;
// Auto record necessary request context infomation, e.g.: user id, request spend time
// format: '[$userId/$ip/$traceId/$use_ms $method $url]'
const userId = ctx.userId || '-';
const traceId = ctx.tracer && ctx.tracer.traceId || '-';
const use = ctx.starttime ? Date.now() - ctx.starttime : 0;
return '[' +
userId + '/' +
ctx.ip + '/' +
traceId + '/' +
use + 'ms ' +
ctx.method + ' ' +
ctx.url +
']';
} �我的需求比较简单,只有错误日志才想多加几个字段 |
你把你的日志发一下 |
是否能定制一个通用日志格式,然后再根据需求,覆盖某种日志格式(比如错误日志) 格式里的字段,是否能传入日志对象里,还是说,必须按你说的方式去继承 |
@popomore 我的诉求是这样 config.customLogger = {
biz: {
file: path.join(appInfo.root, 'logs/biz.log'),
formatter(meta) {
console.log(meta);
return `### ${JSON.stringify(meta)}`;
},
// 或者再支持个 contextFormatter(meta, ctx)
},
};
this.app.getLogger('biz').warn('app', 'msg');
this.ctx.getLogger('biz').warn('ctx', 'msg'); 实际输出, context logger 的 formatter 是无法自定义的 ### {"level":"WARN","date":"2018-04-09 15:22:48,429","pid":53978,"hostname":"TZ-Mac.local","message":"app msg"}
2018-04-09 15:22:48,431 WARN 53978 [-/127.0.0.1/-/11ms GET /] ctx msg |
egg 会打印访问日志么?还是说必须看 nginx 的访问日志? |
@occultskyrong
您之前代码是每次写出都new一次。我放到开头的地方只new一次。会好很多吧。 |
@occultskyrong 修复好的代码 不会出现无限打开文件 不释放
|
@occultskyrong 你这个非常坑,根本不适用 楼上说的 文件描述符 |
自定义日志可以输出userId, traceId等上下文相关的内容吗? @atian25 |
用 ctx.getLogger |
这个不能自定义格式吧 @popomore |
自定义 ContextLogger |
直接实例化const EggLogger = require('egg-logger').EggLogger; 调自己的logger |
这个日志真的是搞死我了。。。我觉得我是个十足的菜鸡,真的整不明白!!!!!! 正题: 我的诉求:自定义内置日志的格式 我可能说的很多地方都不对,我也是刚接触这方面,我搞了将近一周的时间了,真的不会了。。。 可能我还是在浮躁了,沉下心在研究一下吧,周一就要开例会报告了,啊,(〒︿〒) 内心十分期盼大佬的回答,谢谢~ |
自定义 ContextLogger 可以看下这个示例: atian25/egg-showcase#11 |
有没有直接使用 的 elk 日志中间件啊 @atian25 |
官方没维护,可以自己写个 |
看很多人这么煎熬。。。 满足绝大多数有关日志的需求。。。 具体怎么用,自己看下文档。。。。上手已经是很简单了。。 至于与elk的结合。。。 常规操作。。。(逃 |
看我上面 #2006 (comment) 给的链接 |
在egg里面用winston,如何把traceId加进去? |
如下这样就可以了 config.logger = { |
第一步:在
第二步:不要使用 示例: 对比二者打印出的日志分别如下:
|
真的关键,Nice🤔,拿来吧你😁 |
请问你使用winston是不是只打业务日志?我理解egg的框架日志和egg-logger绑定在一起的,无法替换? |
以前用express+log4js,配置式参数使用的好好的。。
换做egg后,这个日志格式看得我各种别扭。
以下内容,我只能是尽可能去官方文档去获知解决方案,如果有已经提供的解决方案而我尚未看到,请原谅。
包括但不限于:
1、日志的时间精度:
应该是基于
process.hrtime()
的高精度时间,而不是new Date().getTime()
吧?。比如 egg-logger/lib/egg/context_logger.js 25行,这种计算方式得出的
use
时间,真的可用么?2、请求响应日志
token
或者其他authorization
信息,响应时间,响应状态(http status)log4js
的layouts - Pattern Format方案?尝试使用自写中间件完成
accessLogger
的功能呢,结果发现绑定到Context Logger
时会因为所以只能使用App Logger在加载中间件,将中间件绑定到app上,来实现access日志的记录
3、日志可封装和解析:
直接引入egg-logger后,原生的日志输出不符合基本需求,并且格式不统一
既然是企业级框架,就应该需要考虑每个企业有自己的一套日志体系吧?
按照log4js去配置是一件相对简单的事情,只不过
express
中res
的finish
和close
监听需要耗费一部分代码去完成。很多日志最后都是使用
filebeat
+logstash
去采集的,日志格式统一,有利于L的快速过滤?4、多级别日志分装
5、全链路标记可配置
request
-header
中,因公司不同,可能使用的全链路唯一标志不同。有的公司用
traceId
、而有的用request-id
,诸如此类的,如果都需要去改源码去完成,是否对生产的部署是一种障碍?这些原因大概是我选择关闭egg原生日志,#1667。
转而去寻找一种可能,使用koa-log4来复现已经成型的日志体系。
以上,如果我对日志的使用违反egg的日志规则,请指出
感谢egg
The text was updated successfully, but these errors were encountered: