0

I need all the logs to be written to a file like we do it in server side programming. I tried using cordova-plugin-logtofile but I'm not able to install it. So I tried directly writing to file like this.

Please see my code.

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")

Here my problem is I'm only able to write anyone of the line.

Suraj Rao
  • 29,388
  • 11
  • 94
  • 103
Sreenath
  • 480
  • 2
  • 6
  • 17

1 Answers1

0

I had the similar need to write all my cordova android app's logs to a file.

What I did is a hook that will patch the cordova activity and LOG.java file to log to a file instead of just using android's default log system.

The advantage if that not only the javascript's logs (console.log) are stored in the file but also other logs from plugins that are calling the cordova LOG class.

The problem is that I have to check my hook each time I update the cordova android platform version (one of the many reasons why I'm still using cordova 6).

You should also be carefull to use a kind of logrotate system if you don't want to end filling all the disk with your logs.

QuickFix
  • 11,661
  • 2
  • 38
  • 50