node用log4js输出日志能输出行号,和具体文件名吗

JavaScript016

node用log4js输出日志能输出行号,和具体文件名吗,第1张

var log4js = require('')

log4js.configure({

appenders: [

{ type: 'console' }, //控制台输出

{

type: 'file', //文件输出

filename: '',

maxLogSize: 1024,

backups:3,

category: 'normal'

}

]

})

var logger = log4js.getLogger('normal')

logger.setLevel('INFO')

...

//app.use(...)

//app.use(...)

app.use(log4js.connectLogger(logger, {level:log4js.levels.INFO}))

app.use(app.router)

Android和H5之间的交互hybridApp开发也不是什么新鲜事了,其中native和h5之间的交互则是必不可少的。Android中是如何和H5交互的?1、webView加载页面我们都知道在Android中是通过webView来加载html页面的,根据HTML文件所在的位置不同写法也不同://例如:加载assets文件夹下的test.html页面mWebView.loadUrl("file:///android_asset/test.html")//例如:加载网页mWebView.loadUrl("")如果只是这样调用mWebView.loadUrl()加载的话,那么当你点击页面中的链接时,页面将会在你手机默认的浏览器上打开。那如果想要页面在App内中打开的话,那么就得设置setWebViewClient:mWebView.setWebViewClient(newWebViewClient(){@OverridepublicbooleanshouldOverrideUrlLoading(WebViewview,Stringurl){mWebView.loadUrl(url)returntrue}}})2、Android本地通过Java调用HTML页面中的JavaScript方法想要调用js方法那么就必须让webView支持WebSettingswebSettings=mWebView.getSettings()//设置为可调用js方法webSettings.setJavaScriptEnabled(true)若调用的js方法没有返回值,则直接可以调用mWebView.loadUrl("JavaScript:do()")其中do是js中的方法;若有返回值时我们可以调用mWebView.evaluateJavascript()方法:mWebView.evaluateJavascript("sum(1,2)",newValueCallback(){@OverridepublicvoidonReceiveValue(Stringvalue){Log.e(TAG,"onReceiveValuevalue="+value)}})js代码如下:2、js调用Android本地Java方法在Android4.2以上可以直接使用@JavascriptInterface注解来声明,下面是在一个本地Java方法publicclassJsInteration{@JavascriptInterfacepublicStringback(){return"helloworld"}}定义完这个方法后再调用mWebView.addJavascriptInterface()方法:mWebView.addJavascriptInterface(newJsInteration(),"android")那么在js中怎么来调用呢?4、拦截HTML页面中的点击事件mWebView.setWebViewClient(newWebViewClient(){@OverridepublicbooleanshouldOverrideUrlLoading(WebViewview,Stringurl){//判断url拦截事件if(url.equals("file:///android_asset/test2.html")){Log.e(TAG,"shouldOverrideUrlLoading:"+url)startActivity(newIntent(MainActivity.this,Main2Activity.class))returntrue}else{mWebView.loadUrl(url)returnfalse}}})以上就是Java调用js方法以及js调用Java方法的实现交互方式中的一种。下面给出完整代码:mainActivitypublicclassMainActivityextendsAppCompatActivity{publicstaticfinalStringTAG="MainActivity"privateWebViewmWebView@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)mWebView=(WebView)findViewById(R.id.webView)mWebView.loadUrl("file:///android_asset/test.html")WebSettingswebSettings=mWebView.getSettings()webSettings.setJavaScriptEnabled(true)mWebView.addJavascriptInterface(newJsInteration(),"android")mWebView.setWebViewClient(newWebViewClient(){@OverridepublicbooleanshouldOverrideUrlLoading(WebViewview,Stringurl){if(url.equals("file:///android_asset/test2.html")){Log.e(TAG,"shouldOverrideUrlLoading:"+url)startActivity(newIntent(MainActivity.this,Main2Activity.class))returntrue}else{mWebView.loadUrl(url)returnfalse}}})}//Android调用有返回值js方法@TargetApi(Build.VERSION_CODES.KITKAT)publicvoidonClick(Viewv){mWebView.evaluateJavascript("sum(1,2)",newValueCallback(){@OverridepublicvoidonReceiveValue(Stringvalue){Log.e(TAG,"onReceiveValuevalue="+value)}})}publicclassJsInteration{@JavascriptInterfacepublicStringback(){return"helloworld"}}}test.html调用本地方法点击

function readLog(date,type,operation){//函数接受3个参数,日期、精度(天时分秒)和操作(查找、刷新或者默认)        if(date){        //如果有时间参数则对时间参数进行处理(一般日志名称都是时间加类型)            var dataStr = arguments[0]            var date = dataStr.slice(0,10)            var hour = dataStr.slice(11,13)            var minute = dataStr.slice(11,16)            var second =dataStr.slice(11,19)            var type = arguments[1]            //获取精度

        }else{        //若无时间参数则获取当前时间,然后精度默认            var date = new Date(+new Date()+8*3600*1000).toISOString().replace(/T/g,' ').replace(/\.[\d]{3}Z/,'').slice(0,10)            var type=null

        }        var op = arguments[2]        var countResult = 0        //对日志结果进行统计        var logPath = appDirName.slice(0,-3)+'log\\'+'ivsvr_'+date+'.log'        //拼接日志文件名称        var logStr = ''

        fs.stat(logPath, function (err, stats) {        //获取对应的日志文件状态        if(err){        //日志不存在或者异常处理信息

            $('#logTipInfo tr td').html('无日志信息可供查看')            console.log(err)

        }else{            var lineCount = 0            var readline = require('readline')            var fReadName = logPath            var fRead = fs.createReadStream(fReadName)            var objReadline = readline.createInterface({                input: fRead,

            })            //按行读取日志

            objReadline.on('line', (line)=>{                var itemStr = $.trim(line)                var time = itemStr.slice(0,19)                var content = itemStr.substr(20)                if(!time || !content){return}

                ++ lineCount                //计数行数                var matched = true                var itemStr = $.trim(line)                var itemArr = itemStr.split(' ')                var logDate = itemArr[0]                var logTime = itemArr[1]                var time = logDate+' '+logTime                switch(type){                //进度查找过滤                    case '0':                    case null:

                        matched = true                        break                    case '1':                        var timeSplit = logTime.slice(0,2)                        if(timeSplit == hour){

                            matched = true                            break

                        }

                        matched = false                        break                    case '2':                        var timeSplit = logTime.slice(0,5)                        if(timeSplit == minute){

                            matched = true                            break

                        }

                        matched = false                        break                    case '3':                        var timeSplit = logTime.slice(0,8)                        if(timeSplit == second){

                            matched = true                            break

                        }

                        matched = false                        break                    default:                        console.log('unkonw type!')                        break

                }                if(matched === true &&(lineCount>logReadFlag)){                //日志结果格式化输出呈现

                    countResult ++                    var result = itemArr[2]                    if(result == 'err'){                        var operation = itemArr[4]

                        result = '失败:'+itemArr[5]+' '+(itemArr[6]?itemArr[6]:'')

                    }else{                        var operation = itemArr[4]+' '+itemArr[5]+(itemArr[6]?itemArr[6]:'')

                        result = '成功'

                    }

                    logStr += '<tr><td>'+time+'</td><td>'+operation+'</td><td>'+result+'</td></tr>'

                }

                logStr += '<tr><td>'+time+'</td><td>'+content+'</td></tr>'

            })            objReadline.on('close', ()=>{                if(logReadFlag == 0 && (logStr == '')){                    var info = '无日志信息可供查看'

                }                if(logReadFlag >0 && (logStr != '')){                    var newLogNum = lineCount - logReadFlag                    var info = '刷新成功,更新'+newLogNum+'条日志!'

                    $('#logInfoTable').prepend(logStr)

                }else if(logReadFlag >0 && (logStr == '')){                    var info = '刷新成功,无日志更新!'

                }else{

                    $('#logInfoTable').html(logStr)

                }                if(op == 'search'){                    var info = '查找到'+countResult+'条日志'

                }

                $('#logTipInfo tr td').html(info)                if((op == 'search' || op == 'refresh') &&(logReadFlag != 0 || newLogNum >0 || countResult >0)){

                    setTimeout(function() {$('#logTipInfo').fadeOut(567)}, 2000)                    //操作结束后给出信息反馈,反馈自动淡出消失

                }                else{

                    $('#logTipInfo').hide()

                }

                logReadFlag = lineCount                console.log('closed')

            })

        }

    })

}