非Node环境下使用log4javascript的AjaxAppender将日志写入文件的问题
问题1:如何实现将日志信息写入到txt文件
首先明确:log4javascript是浏览器端的日志库,受浏览器沙箱安全限制,前端JavaScript无法直接静默写入用户本地的txt文件,你可以根据需求选择两种实现方案:
- 方案1:将日志写入服务端的txt文件
这是最常用的实现方式,你当前使用的AjaxAppender就是为这个场景设计的:- 先在你的服务端开发一个接收日志的接口,支持POST请求,能够解析log4javascript发送的日志内容
- 服务端代码(可使用Java、Python、PHP等任意后端语言)将接收到的日志内容追加写入到服务端的txt文件中即可
- 方案2:导出日志为本地txt文件(用户手动触发)
如果需要将日志保存到用户本地设备,可以自定义Appender收集日志,在需要导出时通过Blob对象生成txt文件,触发用户手动下载,参考实现代码如下:
var log = log4javascript.getDefaultLogger(); // 自定义Appender收集日志 var logs = []; var CustomFileAppender = function() {}; CustomFileAppender.prototype = new log4javascript.Appender(); CustomFileAppender.prototype.doAppend = function(loggingEvent) { // 格式化日志内容 var logStr = loggingEvent.timeStamp.toLocaleString() + ' ' + loggingEvent.level.name + ': ' + loggingEvent.getCombinedMessages(); logs.push(logStr); }; log.addAppender(new CustomFileAppender()); // 导出日志的触发函数,可绑定到按钮点击事件 function exportLogsToTxt() { var blob = new Blob([logs.join('\n')], { type: 'text/plain' }); var a = document.createElement('a'); a.download = 'logs.txt'; a.href = URL.createObjectURL(blob); a.click(); URL.revokeObjectURL(a.href); }
问题2:AjaxAppender的url参数如何填写
你只填域名是不正确的,需要填写服务端接收日志的完整接口地址,比如你的接口部署在域名下的/api/log/receive路径,就填完整地址https://你的域名/api/log/receive。
需要额外注意两点:
- 该接口需要支持跨域请求,否则浏览器会因同源策略拦截日志上报请求
- 默认情况下log4javascript的AjaxAppender会发送POST请求,请求体为你设置的JsonLayout格式化后的日志内容,服务端需要对应解析请求体内容
内容的提问来源于stack exchange,提问作者andreeadlr223
相关产品推荐
相关产品推荐

