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')
})
}
})
}