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之后會自動切割日志,按天進行保存,內存就一直沒暴增了。
內存不滿就沒報警,沒了報警整個世界都清凈了。