文件管理 · 2022年8月19日

js记录日志到文件|Nodejs的运行日志怎么做

① nodejs morgan输出日志在哪儿看

morgan是express默认的日志中间件,也可以脱离express,作为node.js的日志组件单独使用。本文由浅入深,内容主要包括:morgan使用入门例子如何将日志保存到本地文件核心API使用说明及例子进阶使用:1、日志分割 2、将日志写入数据库源码剖析:morgan的日志格式以及预编译

② 如何用JS代码来写出每次系统登陆的时候,平台日志就会记录你的所有操作和登陆时间

JS是运行于客户端的,对服务器的资源没办法进行操作,所以,你这个功能如果单纯靠JS不能实现,只能用Ajax+服务器脚本来实现..问题是,针对一个记录操作,没必要再搞的这么复杂..因为判断登录永远是在服务器进行逻辑判断的,在此业务逻辑中插入一段代码就可以起到记录操作,而没必要在验证成功后,再用Ajax异步调用另外的页面,实现记录操作..

③ 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日志包,说下怎么配置和分割日志 { "appenders": [ { "type" : "console" }, { "type": "dateFile", "filename": "logs/access.log", "pattern": "-yyyy-MM-dd", "category" : "normal", "level" : "LOG" }, { "type": "file", "filename": "logs/error.log", "maxLogSize": 2097152, "backup": 10, "category": "error" }, { "type": "dateFile", "filename": "logs/record.log", "pattern": "-yyyy-MM-dd", "category": "record" } ], "replaceConsole" : true, "levels": { "error": "error", "record" : "trace" } }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之后会自动切割日志,按天进行保存,内存就一直没暴增了。内存不满就没报警,没了报警整个世界都清净了。

④ 如何让Node.js正确地日志

为了完成这点,你会需要使用一个最流行的开发包,叫做 winston. Winston 是一个 Node.js 的多通道异步传输日志库。

你可以通过安装 winston 的方式,添加它到你的项目中:

一旦你安装之后,你可以这样添加 winston 到你的项目:

上面的代码片段会推送接下来的这行信息到 stdout :

如同你所看到的那样,我们传递了 info 字符串到 winston ,从而告诉 winston 这个将要日志的事件有一个日志级别与之关联,也就是 info。默认情况下, winston 附带了接下来的几种日志级别 (也可以添加自定义的级别) :

你可以通过接下来的一行设置日志的级别:

在 RisingStack ,我们通常利用一个叫 LOG_LEVEL 的环境变量来配置。这样的话,我们就可以动态改变哪些内容应该被日志记录:

当你的日志级别是 silly 时,你应该尽可能的多记录所有的日志。尽管如此,你还是需要遵守一个经验法则:绝对不要记录凭证,密码以及任何敏感的信息。

“绝对不要记录凭证,密码以及任何敏感的信息。” via @RisingStack #nodejs #logging #security

点击直达 TWEET

通常来说,会有至少一个以上的用户访问日志,所以,日志事件里面包含凭证信息会增加额外的风险。

当你 开始使用微服务 , 从日志角度来看,最大的挑战就是分布式追踪。

在一个分布式的架构中,错误检测会令人沮丧,因为由于系统的瑕疵会导致大量的警报信息涌现。分布式追踪的目的就是为了消除这个问题,它可以提供更多的事务和错误的视角,而普通的日志文件并没有能力做到这些。

为了做到这点,你不得不使用一个所谓的相关标识符——并且把它传递给所有的参与事务操作的服务。然后,如果每行日志都标注了这个 ID ,你就可以搜索这些事件了。

为了生成一个唯一的 ID ,你可以这样使用 uuid 模块:

这个 ID 不得不在函数调用中传递,并且它也不得不被发送到下游的服务。 如同你可以想象到的,这不是个特别值当的任务。

这里讲到追踪,我们的 Node.js / 微服务监控 解决方案如下图所示。追踪相关的 ID 到请求的容器,并且可视化了一个简单的树状图的数据流。你不会需要去搜索日志,因为它会直接以一种容易理解的方式去展示你的事务:

Node.js distributed tracing with trace by risingstack

根据这种方式, 你可以直接看到你的微服务和持续产生的 issue 之间的依赖关系

如果你实现了我们刚刚讨论的这些方法和工具,Node.js 的日志记录将不再是一件难事。

⑤ nodejs 添加操作数据库怎么添加日志

如何用SQL语言在已有数据库日志文件中再添加一个数据库日志文件 use masteralter database 你的数据库名(建立数据库时的名称)add log file( name=tt_log2,filename='F:\tt_log2.ldf',size=2MB,maxsize=2MB,filegrowth=10%)go这样就行了

⑥ node用log4js输出日志能输出行号,和具体文件名吗

var log4js = require('');log4js.configure({ appenders: [ { type: 'console' }, //控制台输出 { type: 'file', //文件输出 filename: '', maxLogSize: 1024, backups:3, category: 'normal' } ]});var logger = log4js.getLogger('normal');logger.setLevel('INFO');…//app.use(…)//app.use(…)app.use(log4js.connectLogger(logger, {level:log4js.levels.INFO}));app.use(app.router);

⑦ 为什么通过前端 .js 记用户日志会丢数据求答案

2. 做点击跳转, 用户点击后先跳到自己服务器上, 然后由自己的服务器做重定向, 并记录这一次请求3. 前端 JavaScript 监控用户鼠标行为, 并及时上报到服务器这三种方法也分别有各自的优缺点, 当时分析的是2. 绝对完整的记录. 不过需要新增服务器响应跳转请求, 并且如果跳转服务挂了会让用户压根到不了 url 指向的地方. 目前所有的广告服务都是这样 (而且点击串加密), Google 的网页搜索很早就是这样, 网络跟 360 干上后也换成了这种. 根据度厂员工在新浪微博上跟别人的讨论, 即使是网络网页搜索那么大的量, 算上灾备最多 50 台跳转服务器可以搞定 (根据公开资料, 网络每天网页搜索量在十亿这个量级, 按搜索引擎页面点击率 30% 算, 每天至少三亿次点击跳转请求)今天跟前端同学讨论, 终于搞懂了为什么是这样. 后端的思维是每发生一次事件就打一条日志, 所以极难发生日志丢失的问题. 而前端不能每发生一次事件就向服务器发请求打一次日志, 这样会带来很大的网络开销并拖慢用户的浏览器, 所以前端都是把要纪录的行为在用户端先缓存, 等积累够若干条或过了若干秒后才向服务器汇总上报, 如果在这个上报条件触发前浏览器崩溃掉, 那日志就没了, 或者用户关掉浏览器也会丢掉这部分数据 (据说有一些方式可以响应关闭事件并上报日志, 但具体方式不了解, 另外前端同学反馈 IE6 下丢数据现象更严重). 所以丢数据这事其实是用户流畅度体验和数据完备性的一个平衡, 如果让用户卡一点那丢失比例就低一点. 另外接 js 汇报日志的服务器压力也是一个要考虑的点, 因为如果真用 js 汇报, 那一定就不止点击这点数据了, 鼠标滚轮, 悬停等事件显然是能有都有, 服务器不一定扛的过来.

⑧ 如何用JS捕捉 浏览器关闭事件,我想在浏览器关闭的时候记录一些日志。要兼容Firefox和IE 6、7、8 !3Q….

尊敬的用户,您好!很高兴为您答疑。考虑到浏览器实际是一个应用载体,而web页面是此载体内的应用,您希望通过内部应用过多地接管外部事件,而不依赖可以获得更高权限的内容(如插件等),是很难办到的。而在跨浏览器的情况下,因为不同的浏览器设计方面的差异以及安全机制的迥异,使得您的需求更加难以实现,建议考虑换个思路实现此需求。希望我的回答对您有所帮助,如有疑问,欢迎继续咨询我们。

⑨ nodejs, log4js为什么生成的日志文件是空的。。

很有可能logs目录的权限不够

⑩ nodejs怎么获取当前请求的日志

functionreadLog(date,type,operation){//函数接受3个参数,日期、精度(天时分秒)和操作(查找、刷新或者默认)if(date){//如果有时间参数则对时间参数进行处理(一般日志名称都是时间加类型)vardataStr=arguments[0];vardate=dataStr.slice(0,10);varhour=dataStr.slice(11,13);varminute=dataStr.slice(11,16);varsecond=dataStr.slice(11,19);vartype=arguments[1];//获取精度}else{//若无时间参数则获取当前时间,然后精度默认vardate=newDate(+newDate()+8*3600*1000).toISOString().replace(/T/g,'').replace(/.[d]{3}Z/,'').slice(0,10);vartype=null;}varop=arguments[2];varcountResult=0;//对日志结果进行统计varlogPath=appDirName.slice(0,-3)+'log\'+'ivsvr_'+date+'.log';//拼接日志文件名称varlogStr='';fs.stat(logPath,function(err,stats){//获取对应的日志文件状态if(err){//日志不存在或者异常处理信息$('#logTipInfotrtd').html('无日志信息可供查看');console.log(err);}else{varlineCount=0;varreadline=require('readline');varfReadName=logPath;varfRead=fs.createReadStream(fReadName);varobjReadline=readline.createInterface({input:fRead,});//按行读取日志objReadline.on('line',(line)=>{varitemStr=$.trim(line);vartime=itemStr.slice(0,19);varcontent=itemStr.substr(20);if(!time||!content){return;}++lineCount;//计数行数varmatched=true;varitemStr=$.trim(line);varitemArr=itemStr.split('');varlogDate=itemArr[0];varlogTime=itemArr[1];vartime=logDate+''+logTime;switch(type){//进度查找过滤case'0':casenull:matched=true;break;case'1':vartimeSplit=logTime.slice(0,2);if(timeSplit==hour){matched=true;break;}matched=false;break;case'2':vartimeSplit=logTime.slice(0,5);if(timeSplit==minute){matched=true;break;}matched=false;break;case'3':vartimeSplit=logTime.slice(0,8);if(timeSplit==second){matched=true;break;}matched=false;break;default:console.log('unkonwtype!');break;}if(matched===true&&(lineCount>logReadFlag)){//日志结果格式化输出呈现countResult++;varresult=itemArr[2];if(result=='err'){varoperation=itemArr[4];result='失败:'+itemArr[5]+''+(itemArr[6]?itemArr[6]:'');}else{varoperation=itemArr[4]+''+itemArr[5]+(itemArr[6]?itemArr[6]:'');result='成功';}logStr+='<tr><td>'+time+'</td><td>'+operation+'</td><td>'+result+'</td></tr>'}logStr+='<tr><td>'+time+'</td><td>'+content+'</td></tr>'});objReadline.on('close',()=>{if(logReadFlag==0&&(logStr=='')){varinfo='无日志信息可供查看';}if(logReadFlag>0&&(logStr!='')){varnewLogNum=lineCount-logReadFlag;varinfo='刷新成功,更新'+newLogNum+'条日志!';$('#logInfoTable').prepend(logStr);}elseif(logReadFlag>0&&(logStr=='')){varinfo='刷新成功,无日志更新!';}else{$('#logInfoTable').html(logStr);}if(op=='search'){varinfo='查找到'+countResult+'条日志';}$('#logTipInfotrtd').html(info);if((op=='search'||op=='refresh')&&(logReadFlag!=0||newLogNum>0||countResult>0)){setTimeout(function(){$('#logTipInfo').fadeOut(567);},2000);//操作结束后给出信息反馈,反馈自动淡出消失}else{$('#logTipInfo').hide();}logReadFlag=lineCount;console.log('closed');});}});}