0

我需要将所有日志写入文件,就像我们在服务器端编程中所做的那样。我尝试使用cordova-plugin-logtofile但我无法安装它。所以我尝试像这样直接写入文件。

请看我的代码。

logger.js

var loggerOb = null; 
var loggerFilePath = null; 
var loggerLevel = 4;

function logStr(logType, str, obj) {
    let time = new Date().getTime();
    return "[" + time + "] :: "+ logType + " :: " + str + " :: " + JSON.stringify(obj) + " \n";
}

function loggerWriteLog(str) {
    loggerOb.createWriter(function(fileWriter) {
      fileWriter.seek(fileWriter.length);
      var blob = new Blob([str], {type:'text/plain'});
      fileWriter.write(blob);
      console.log("Logger :: Ok, in theory i worked", str);
    }, function(err){
      console.log("Logger :: Failed to log ", err);
    });  
}

function loggerInit(log) {

    loggerFilePath = cordova.file.externalApplicationStorageDirectory;
    window.resolveLocalFileSystemURL(loggerFilePath, function(dir) {
        dir.getFile("log.txt", {create:true}, function(file) {
            console.log("Logger :: got the file", file);
            loggerOb = file;
            loggerWriteLog(log);
        });
    });
}

export default {

    debug(str, obj = {}) {
        var log =  logStr('debug', str, obj);
        if(loggerLevel >= 4) {
            if(loggerOb == null){
                loggerInit(log);
            } else {
                loggerWriteLog(log);
            }
        } 
    },

    info(str, obj = {}) {
        var log =  logStr('info', str, obj);
        if(loggerLevel >= 3) {
            if(loggerOb == null){
                loggerInit(log);
            } else {
                loggerWriteLog(log);
            }
        } 
    },

    warn(str, obj = {}) {
        var log =  logStr('warning', str, obj);
        if(loggerLevel >= 2) {
            if(loggerOb == null){
                loggerInit(log);
            } else {
                loggerWriteLog(log);
            }
        } 
    },

    error(str, obj = {}) {
        var log =  logStr('error', str, obj);
        if(loggerLevel >= 1) {
            if(loggerOb == null){
                loggerInit(log);
            } else {
                loggerWriteLog(log);
            }
        } 
    },

}

my_component.js

import logger from '../common/logger';
logger.info("test info")
logger.debug("test debug")
logger.error("test error")

在这里,我的问题是我只能写任何一行。

4

1 回答 1

0

我有类似的需要将我所有的cordova android应用程序的日志写入文件。

我所做的是一个钩子,它将修补科尔多瓦活动和 LOG.java 文件以记录到一个文件,而不是仅仅使用 android 的默认日志系统。

如果不仅javascript的日志(console.log)存储在文件中,而且来自调用cordova LOG类的插件的其他日志也存储在文件中,这是一个优势。

问题是我每次更新cordova android平台版本时都必须检查我的钩子(我仍在使用cordova 6的众多原因之一)。

如果您不想用日志填满所有磁盘,您还应该小心使用一种 logrotate 系统。

于 2018-08-10T14:15:16.043 回答