【前端】JS日志输出-console完美封装

最近在开发一款chrome扩展插件,经常会打印一些调试的日志,然后上生产的时候日志打印的地方总是会有一些漏网之鱼,没有被删掉,控制台还会打印出很多的敏感信息,这是很不合理的,也是不被允许的,鉴于此,对console做了封装,废话不多说,直接上干货

使用方法

Log.info("logging info: " + "message");
Log.warn("log warn: " + "message");
Log.error("log error: " + message);
Log.debug("debug message");

引入下面的 js

var StringUtil = function () {
    return {
        format: function (n, r) {
            return n.replace(/\{(\d+)\}/g, function (n, t) {
                return typeof r[t] != "undefined" ? r[t] : n
            })
        }, hashCode: function (n) {
            if (typeof n != "string") return "not string";
            var r = 0;
            if (n.length === 0) return r;
            for (i = 0; i < n.length; i++) {
                r = (r << 5) - r + n.charCodeAt(i);
                r = r & r
            }
            return r
        }
    }
}();

以下是对console的封装

var Log = function (isLog) {
    var now = new Date;
    var dev, prod, logModel;
    if (typeof window !== "undefined") {
        var logType = ["debug", "info", "warn", "error"];
        var f = ["assert", "dir", "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
        if (!window.console) {
            window.console = {}
        }
        if (!window.console.log) {
            window.console.log = function () {}
        }
        for (var i = 0; i < f.length; ++i) {
            if (!window.console[f[i]]) {
                window.console[f[i]] = function () {}
            }
        }
        for (var i = 0; i < logType.length; ++i) {
            if (!window.console[logType[i]]) {
                window.console[logType[i]] = window.console.log
            }
        }
    }
    dev = {
        DEBUG: function (msg) {
            console.debug(msg) // 这里如果上面初始化失败不能使用可直接将这里改为 console.log
        }, INFO: function (msg) {
            console.info(msg)
        }, WARN: function (msg) {
            console.warn(msg)
        }, ERROR: function (msg) {
            console.error(msg)
        }
    };
    //生产环境中使用任需要打印日志可在这里做相应的修改
    prod = {
        DEBUG: function (msg) {}, INFO: function (msg) {}, WARN: function (msg) {}, ERROR: function (msg) {}
    };
    logModel = isLog ? dev : prod;
    var s;
    var u;
    var c = [];
    var oldDate = now;

    function l(n) {
        var newDate = new Date;
        var timeStamp = newDate - oldDate;
        var message = timeStamp > 150 ? timeStamp + "(ms): " + n.msg : n.msg;
        try {
            logModel[n.type](message)
        } catch (e) {
            return
        }
        oldDate = newDate;
    }

    function d(n) {
        if (Object.prototype.toString.call(n) === "[object Array]") {
            var o = "[";
            for (var r = 0; r < n.length; r++) {
                o = o + d(n[r]) + ","
            }
            return o + "]"
        } else {
            return StringUtil.hashCode(n)
        }
    }

    function w(n) {
        if (n.length == 0) return null;
        var o = n[0];
        if (typeof o != "string") {
            throw "not a string: " + o
        }
        var r = [];
        for (var t = 1; t < n.length; t++) {
            var i = n[t];
            r.push(typeof i == "object" ? JSON.stringify(i, function (n, o) {
                if (typeof n == "string") {
                    var r = n.toLowerCase();
                    return r.indexOf("password") != -1 || r == "value" && (this.key == "p" || this.type == "password") ? d(o) : o
                }
                return o
            }) : i)
        }
        return StringUtil.format(o, r)
    }

    function v(logType, o) {
        var r = {
            type: logType,
            msg: w(o)
        };
        l(r);
        if (u == undefined) {
            c.push(r)
        } else if (u && u.passwords) {
            c.push(r);
            var t = u.passwords;
            for (var i = 0; i < t.length; i++) {
                var e = t[i];
                if ("password".indexOf(e) != -1) {
                    continue
                }
                if (r.msg.indexOf(e) != -1) {
                    var f = "audit fail for: " + e;
                    l({
                        type: "ERROR",
                        msg: f
                    });
                    throw f
                }
            }
        }
    }
    return {
        setLogging: function (isLogging) {
            logModel = isLogging ? dev : prod
        }, skipAudit: function () {
            l({
                type: "DEBUG",
                msg: w(arguments)
            })
        }, debug: function () {
            v("DEBUG", arguments)
        }, info: function () {
            v("INFO", arguments)
        }, warn: function () {
            v("WARN", arguments)
        }, error: function () {
            v("ERROR", arguments)
        }, getAuditString: function () {
            var n = [];
            for (var o = 0; o < c.length; o++) {
                var r = c[o];
                n.push(r.type + ":" + r.msg)
            }
            return n.join("\n")
        }, init: function (flag) {
            u = flag;
            if (u === false) {
                c = []
            }
        }
    }
}(islog);// boolean类型参数 全局控制是否打印日志
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值