一个简单的日志module

本文介绍了一个简单实用的日志模块,支持多种日志级别、颜色输出及文件记录功能。通过缓存机制减少IO操作,提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个简单的日志module, 功能如下 

  • 时间显示
  • 调用log的文件名与行号显示
  • 不同日志级别使用不同颜色输出
  • 支持stdout输出的同时写入文件日志
  • 文件日志使用缓存以降低io次数

使用示例 :

var log = require('./log'),

	logWithoutFile = log.create();

	logWithFile = log.create(log.WARNING, 'my.log'),



logWithoutFile.info('info msg');

logWithoutFile.debug('debug msg');

logWithoutFile.warning('warning msg');

logWithoutFile.error('error msg');

logWithoutFile.trace('trace msg');



logWithFile.info('info msg');

logWithFile.debug('debug msg');

logWithFile.warning('warning msg');

logWithFile.error('error msg');

logWithFile.trace('trace msg');

输出效果: 

 

源码如下 :

var fs = require('fs');



var cwd = process.cwd() + '/',

    INFO = 0;

DEBUG = 1;

WARNING = 2;

ERROR = 3;

TRACE = 4;

INIT = 6;

type = ['INFO', 'DEBUG', 'WARNING', 'ERROR', 'TRACE', '', 'LOG_INIT'];

colors = [38, 34, 35, 31, 32, 36, 33];

bufferSize = 20000;

writeSize = 16384;



exports.INFO = INFO;

exports.DEBUG = DEBUG;

exports.WARNING = WARNING;

exports.ERROR = ERROR;

exports.TRACE = TRACE;



function getPos() {

    try {

        throw new Error();

    } catch(e) {

        var pos=e.stack.split('\n')[4];

        if(pos.split('(').length>1){

            pos = pos.split('(')[1].split(')')[0].split(':');

        }else{

            pos = pos.split('at ')[1].split(':');

        }

        pos=pos[0].replace(cwd, '') + ':' + pos[1];

        return pos;
    }
}



function pad2(num) {

    return num > 9 ? num : '0' + num;

}



function getTime() {

    var t = new Date();

    return [t.getFullYear(), '-', pad2(t.getMonth() + 1) , '-', pad2(t.getDate()), ' ',

        pad2(t.getHours()), ':', pad2(t.getMinutes()), ':', pad2(t.getSeconds())].join('');

}

function addArgumentsBefore(data,arguments){

    var args = Array.prototype.slice.call(arguments);

    var afterData={};

    afterData[0]=data;

    for(var i=0;i<args.length;i++){

        afterData[i+1]=args[i];

    }
    afterData['length']=args.length+1;

    return afterData;
}

function formatLog(log, color) {

    var tag = head = foot = '';

    if (color) {

        head = '\x1B[';

        foot = '\x1B[0m';

        tag = colors[5]+'m';

        color = colors[log.type]+'m';

    }

    var message='';

    for(var key in log.msg){

        var value=log.msg[key];

        if(typeof value=='object'){

            if(JSON.stringify(value)!=='{}'){

                message+=' '+JSON.stringify(value);

            }else{

                message+=' '+value.toString();

            }

        }else{

            message+=' '+value;

        }
    }
    return [log.time, ' [', head, color, type[log.type], foot, '] [', head, tag, log.pos, foot, ']  ', message].join('');
}



exports.create = function(level, file) {

    if (!level) {

        level = INFO;

    }

    if (file) {

        var buffer = new Buffer(bufferSize);

        var pos = 0;

        var fd = fs.openSync(file, 'a');

        process.on('exit', function(){

            fs.writeSync(fd, buffer, 0, pos, null);

        })

    }

    function log(type, msg) {

        if (type < level){

            return;

        }

        var log = {type:type, msg:msg, time:getTime(), pos:getPos()};

        var header=formatLog(log, true).split(']  ')[0]+']';

        console.log.apply(console, addArgumentsBefore(header,msg));

        if (file) {

            if (pos >= writeSize) {

                fs.writeSync(fd, buffer, 0, pos, null);

                pos = 0;

            }

            pos += buffer.write(formatLog(log) + "\r\n", pos);

        }

    }

//    console.log(formatLog({type:INIT, pos:file, time:getTime(), msg: 'log init with level ' + type[level]}, true));

    return {

        info : function() {log(INFO, arguments);},

        debug : function() {log(DEBUG, arguments);},

        warning : function() {log(WARNING, arguments);},

        error : function() {log(ERROR, arguments);},

        trace : function() {log(TRACE, arguments);}

    };

};





<think>好的,我现在需要帮助用户解决在Android Studio打包时,Module只显示“no module”的问题。首先,我要理解这个问题的原因。根据用户提供的引用内容,可能的原因包括Gradle配置错误、模块未正确导入或识别、缓存问题等。 首先,引用[1]提到,APK不存在或名称不一致时,需要刷新Gradle项目。这可能意味着模块未被正确构建,所以检查Gradle同步是必要的步骤。用户可能需要点击“Sync Project with Gradle Files”来确保所有模块被正确加载。 接下来,引用[2]涉及模块的build.gradle文件配置。如果模块被错误地配置为应用程序(application)而非库(library),可能导致无法识别。例如,将apply plugin: 'com.android.application'改为apply plugin: 'com.android.library',并删除applicationId的设置,这可能解决模块识别问题。 引用[3]提到在更高版本的Android Studio中,可能需要直接编辑build.gradle文件,而不是通过界面操作。此外,执行Rebuild Project和清理缓存也可能有帮助。这提示用户需要检查build.gradle的配置是否正确,并进行项目重建和缓存清理。 引用[4]提到Gradle构建速度的问题,这可能和硬件或配置有关,但当前的问题更可能出在配置上,而不是性能。不过,如果构建过程中有错误导致模块未被正确识别,也可能导致“no module”的问题。 综合这些信息,我需要分步骤指导用户检查Gradle同步、模块配置、build.gradle文件设置、缓存清理等。同时,需要确保用户正确导入模块,并处理可能的依赖问题。此外,如果模块存在错误,Android Studio可能无法正确识别,因此检查错误日志也很重要。 在生成相关问题部分,需要考虑用户可能遇到的类似问题,例如Gradle同步失败、模块配置错误、缓存问题等。这些问题都与当前问题相关,用户可能进一步需要了解如何解决这些衍生问题。</think>### 解决Android Studio打包时Module显示“no module”的问题 #### 1. **检查Gradle同步状态** - **操作步骤**:点击Android Studio右上角的 **Sync Project with Gradle Files** 按钮(图标为大象)[^1]。 - **原因**:Gradle配置未同步可能导致模块未被正确识别。若同步失败,控制台会显示具体错误,需根据日志修复配置。 #### 2. **验证模块的build.gradle配置** - **修改插件类型**:打开模块的`build.gradle`文件,确保应用的是`com.android.library`或`com.android.application`插件。例如: ```groovy apply plugin: 'com.android.application' // 正确的主模块配置 ``` 如果是依赖库模块,应改为: ```groovy apply plugin: 'com.android.library' ``` 并删除`applicationId`字段[^2]。 #### 3. **检查模块是否被正确导入** - **操作步骤**:通过 **File > New > Import Module** 重新导入模块,确保路径正确且无冲突。 - **常见错误**:模块名重复或目录结构错误会导致识别失败。 #### 4. **清理缓存并重建项目** - **操作步骤**: 1. 点击 **Build > Rebuild Project**。 2. 点击 **File > Invalidate Caches / Restart > Invalidate and Restart**[^3]。 - **原因**:缓存损坏可能导致模块列表未更新。 #### 5. **检查settings.gradle文件** - **关键配置**:在项目根目录的`settings.gradle`中,确认包含所有模块。例如: ```groovy include ':app', ':mylibrary' ``` 若模块未在此声明,Android Studio将无法识别。 #### 6. **处理依赖冲突** - **操作步骤**:在模块的`build.gradle`中检查`dependencies`块,确保无版本冲突。例如: ```groovy dependencies { implementation project(':mylibrary') // 正确引用本地模块 implementation 'com.android.support:appcompat-v7:28.0.0' // 版本需一致 } ``` - **错误示例**:若依赖库模块未正确转换为`com.android.library`,会导致冲突。 #### 7. **检查AndroidManifest.xml** - **关键点**:主模块的`AndroidManifest.xml`中需包含`<application>`标签,且`package`属性与`build.gradle`中的`applicationId`一致。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值