Nodejs 被越来越多的使用到线上系统中,但线上系统没有日志怎么行呢。
一、forever记录日志
我的线上系统使用forever来启动服务,最开始就直接使用了forever来记录
forever start -a -l ./logs/forever.log
-a 表示追加日志文件
-l 指定日志文件
-s 忽略console.log输出的日志记录(使用log4j时要用这个)
最开始还挺好的,所有日志都能记录下来,但是既然是线上环境,日志比较多,跑着跑着就出问题了。
forever.log文件变得越来越大,在我的系统里直接占了3GB的内存,而且全在内存里面,然后服务器就报警了。
然后尝试对forever.log文件进行切割,结果这SB玩意更本没法切割,具体问题:
1.对forever.log 重命名 forever.log.bak 然后新建forever.log,结果日志仍然往forever.log.bak里写,内存一点也没减少
2.直接删除forever.log ,forever不会新建forever.log,占用的内存也一直不释放
似乎是forever一直使用着文件句柄根本不释放就往里面写,根本没法做日志切割。
二、log4j记录日志
log4j是nodejs的一个log日志包,具体使用方法就不说了,只说怎么配置和分割日志
1 { 2 "appenders": [ 3 { "type" : "console" }, 4 { 5 "type": "dateFile", 6 "filename": "logs/access.log", 7 "pattern": "-yyyy-MM-dd", 8 "category" : "normal", 9 "level" : "LOG" 10 }, 11 { 12 "type": "file", 13 "filename": "logs/error.log", 14 "maxLogSize": 2097152, 15 "backup": 10, 16 "category": "error" 17 }, 18 { 19 "type": "dateFile", 20 "filename": "logs/record.log", 21 "pattern": "-yyyy-MM-dd", 22 "category": "record" 23 } 24 ], 25 "replaceConsole" : true, 26 "levels": { 27 "error": "error", 28 "record" : "trace" 39 } 30 }
log4j的type:
- console 往控制台输出
- file 文件日志 maxLogSize 表示当文件超过这个值时切换文件 backup:n 会循环使用 error[1,n].log 的文件名
- dateFile 使用这个就会按天切割日志,按天生成文件名 access.log-2014-12-14
问题:
日志文件名和内容会相差一天 access.log-2014-12-14 的文件里其实记录的是 2014-12-15 的日志文件,这个暂时还没有找到解决办法
换了log4j之后会自动切割日志,按天进行保存,内存就一直没暴增了。
内存不满就没报警,没了报警整个世界都清净了。