缘起

最近Android,IOS自动化多开群控都搞好了,但是Appium中的log 显示中文乱码问题像个苍蝇一样,看着感觉特别难受,挥之不去,抚之不平。论坛搜索了一下,很多帖子都反映过这个问题,但是都没给出解决策略。不知道这些小 伙伴最终有没有解决。遂决定,吃个大闸蟹,研究一下看能否解决。

特别声明

本文只针对解决Jenkins集成后Appium的log日志中文乱码问题。桌面版本人1.8.1版的未发现乱码,如您桌面版的乱码,我也解决不 了。另外命令执行时受限于机器,环境,开发语言,执行姿势等多方面影响,如果参考本帖未能解决您的问题,真诚的对您说声非常抱歉。没能终结您的乱码问题, 牛逼吹大了😂

工程代码编码设置

  • 设置自己工程代码字符编码为UTF-8
  • 设置Maven打包编译jar的编码为UTF-8

Jenkins环境变量设置

简而言之一句话:管理员账号登录后,设置全局属性 LANG :zh.CH.UTF-8
设置位置:【系统管理】--->【系统设置】--->【全局属性】

 

 

Java启动参数设置

设置java执行的环境变量,也即如下执行testng时设置一个编码的参数
java -Dfile.encoding=UTF-8 -classpath /Users/iosTest.jar org.testng.TestNG /Users/mytestng.xml

如果经过以上的几步骚操作后,您的log中文不乱码了,那下面的可以忽略了。

Appium的log采集处理

由于要命令起Appium服务,写一个java调用CMD或者shell的共通类。执行命令时,输出命令返回的log也即Appium服务日志信息。在接受命令执行输出时设置一下编码:UTF-8。
废话少说,放码过来。

/**
* 命令执行器
* @author Zhang
*
*/
public class CommandExecutorImpl implements CommandExecutor {

static final Logger logger = LoggerFactory.getLogger(CommandExecutorImpl.class);
static ExecutorService pool = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 3L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());

public ExecuteResult executeCommand(long timeout,String ... commands) {

Process process = null;
InputStream pIn = null;
StreamManger outputManger = null;
try {
if(commands == null || commands.length == 0){
logger.error("执行的命令行语句不能为空!");
return new ExecuteResult(9999,"执行的命令行语句不能为空");
}
process = Runtime.getRuntime().exec(commands);
final Process p = process;
p.waitFor(timeout, TimeUnit.MILLISECONDS);
p.getOutputStream().close();

pIn = process.getInputStream();
outputManger = new StreamManger(pIn);
outputManger.start();

return new ExecuteResult(0, "命令执行成功!");

} catch (Exception ex) {
String errorMessage = "命令:" + commands + "执行失败!";
logger.error(errorMessage, ex);
return new ExecuteResult(-1, null);
}
}

}

输入输出流管理控制器,这里其实还可以做更多操作,自由控制输出某些内容,或者不输出某些内容。

/**
* 输入输出流管理
* @author Zhang
*
*/
public class StreamManger extends Thread {
private static Logger logger = LoggerFactory.getLogger(StreamManger.class);
private InputStream inputStream;


/**
* 构造方法
* 实例化输入流
* @param in 输入流
*/
public StreamManger(final InputStream in) {
this.inputStream = in;
}

/**
* 打印输出
*/
@Override
public void run() {
try {
// 设置默认编码为UTF-8
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String line = null;
while ((line = bufferedReader.readLine()) != null) {
logger.debug(line);

}
} catch (Exception ex) {
logger.trace("打印输出流失败:", ex);
} finally {
synchronized (this) {
notify();
}
}
}

}

日志输出

贴个图吧。不然说解决了Jenkins的appium日志中文乱码问题,肯定会有人不信。
安卓:

 


IOS:

 

 

附录appium命令参数地址

社区真伟大,由本论坛翻译Appium官网中文参数介绍。中文参数介绍传送门

后记

感谢社区,给予很多精神食粮,感谢大师们的无私奉献。解决问题的方法,就像平X的妹子的R沟,挤一挤总归还是有点的,多来论坛逛逛,多多学习,多动手实践,总会有解决的方向。
分享一下自己解决这个问题的方法,反哺一下和我一样low的兄弟们。方法比较挫,也许不能解决您的问题,轻喷谢谢!