Appium Appium日志乱码终结指北

hello · 2018年09月18日 · 1287 次阅读

缘起

最近 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 的兄弟们。方法比较挫,也许不能解决您的问题,轻喷谢谢!

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册