content: package com.atguigu.appclient;
  
  import java.io.UnsupportedEncodingException;
  import java.util.Random;
  
  import com.alibaba.fastjson.JSON;
  import com.alibaba.fastjson.JSONArray;
  import com.alibaba.fastjson.JSONObject;
  import com.atguigu.bean.*;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
  /**
   * 日志行为数据模拟
   */
  public class AppMain {
  
      private final static Logger logger = LoggerFactory.getLogger(AppMain.class);
      private static Random rand = new Random();
  
      // 设备id
      private static int s_mid = 0;
  
      // 用户id
      private static int s_uid = 0;
  
      // 商品id
      private static int s_goodsid = 0;
  
      public static void main(String[] args) {
  
          // 参数一：控制发送每条的延时时间，默认是0
          Long delay = args.length > 0 ? Long.parseLong(args[0]) : 0L;
  
          // 参数二：循环遍历次数
          int loop_len = args.length > 1 ? Integer.parseInt(args[1]) : 1000;
  
          // 生成数据
          generateLog(delay, loop_len);
      }
  
      private static void generateLog(Long delay, int loop_len) {
  
          for (int i = 0; i < loop_len; i++) {
  
              int flag = rand.nextInt(2);
  
              switch (flag) {
                  case (0):
                      //应用启动
                      AppStart appStart = generateStart();
                      String jsonString = JSON.toJSONString(appStart);
  
                      //控制台打印
                      logger.info(jsonString);
                      break;
  
                  case (1):
  
                      JSONObject json = new JSONObject();
  
                      json.put("ap", "app");
                      json.put("cm", generateComFields());
  
                      JSONArray eventsArray = new JSONArray();
  
                      // 事件日志
                      // 商品点击，展示
                      if (rand.nextBoolean()) {
                          eventsArray.add(generateDisplay());
                          json.put("et", eventsArray);
                      }
  
                      // 商品详情页
                      if (rand.nextBoolean()) {
                          eventsArray.add(generateNewsDetail());
                          json.put("et", eventsArray);
                      }
  
                      // 商品列表页
                      if (rand.nextBoolean()) {
                          eventsArray.add(generateNewList());
                          json.put("et", eventsArray);
                      }
  
                      // 广告
                      if (rand.nextBoolean()) {
                          eventsArray.add(generateAd());
                          json.put("et", eventsArray);
                      }
  
                      // 消息通知
                      if (rand.nextBoolean()) {
                          eventsArray.add(generateNotification());
                          json.put("et", eventsArray);
                      }
  
                      // 用户前台活跃
                      if (rand.nextBoolean()) {
                          eventsArray.add(generatbeforeground());
                          json.put("et", eventsArray);
                      }
  
                      // 用户后台活跃
                      if (rand.nextBoolean()) {
                          eventsArray.add(generateBackground());
                          json.put("et", eventsArray);
                      }
  
                      //故障日志
                      if (rand.nextBoolean()) {
                          eventsArray.add(generateError());
                          json.put("et", eventsArray);
                      }
  
                      // 用户评论
                      if (rand.nextBoolean()) {
                          eventsArray.add(generateComment());
                          json.put("et", eventsArray);
                      }
  
                      // 用户收藏
                      if (rand.nextBoolean()) {
                          eventsArray.add(generateFavorites());
                          json.put("et", eventsArray);
                      }
  
                      // 用户点赞
                      if (rand.nextBoolean()) {
                          eventsArray.add(generatePraise());
                          json.put("et", eventsArray);
                      }
  
                      //时间
                      long millis = System.currentTimeMillis();
  
                      //控制台打印
                      logger.info(millis + "|" + json.toJSONString());
                      break;
              }
  
              // 延迟
              try {
                  Thread.sleep(delay);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
          }
      }
  
      /**
       * 公共字段设置
       */
      private static JSONObject generateComFields() {
  
          AppBase appBase = new AppBase();
  
          //设备id
          appBase.setMid(s_mid + "");
          s_mid++;
  
          // 用户id
          appBase.setUid(s_uid + "");
          s_uid++;
  
          // 程序版本号 5,6等
          appBase.setVc("" + rand.nextInt(20));
  
          //程序版本名 v1.1.1
          appBase.setVn("1." + rand.nextInt(4) + "." + rand.nextInt(10));
  
          // 安卓系统版本
          appBase.setOs("8." + rand.nextInt(3) + "." + rand.nextInt(10));
  
          // 语言  es,en,pt
          int flag = rand.nextInt(3);
          switch (flag) {
              case (0):
                  appBase.setL("es");
                  break;
              case (1):
                  appBase.setL("en");
                  break;
              case (2):
                  appBase.setL("pt");
                  break;
          }
  
          // 渠道号   从哪个渠道来的
          appBase.setSr(getRandomChar(1));
  
          // 区域
          flag = rand.nextInt(2);
          switch (flag) {
              case 0:
                  appBase.setAr("BR");
              case 1:
                  appBase.setAr("MX");
          }
  
          // 手机品牌 ba ,手机型号 md，就取2位数字了
          flag = rand.nextInt(3);
          switch (flag) {
              case 0:
                  appBase.setBa("Sumsung");
                  appBase.setMd("sumsung-" + rand.nextInt(20));
                  break;
              case 1:
                  appBase.setBa("Huawei");
                  appBase.setMd("Huawei-" + rand.nextInt(20));
                  break;
              case 2:
                  appBase.setBa("HTC");
                  appBase.setMd("HTC-" + rand.nextInt(20));
                  break;
          }
  
          // 嵌入sdk的版本
          appBase.setSv("V2." + rand.nextInt(10) + "." + rand.nextInt(10));
          // gmail
          appBase.setG(getRandomCharAndNumr(8) + "@gmail.com");
  
          // 屏幕宽高 hw
          flag = rand.nextInt(4);
          switch (flag) {
              case 0:
                  appBase.setHw("640*960");
                  break;
              case 1:
                  appBase.setHw("640*1136");
                  break;
              case 2:
                  appBase.setHw("750*1134");
                  break;
              case 3:
                  appBase.setHw("1080*1920");
                  break;
          }
  
          // 客户端产生日志时间
          long millis = System.currentTimeMillis();
          appBase.setT("" + (millis - rand.nextInt(99999999)));
  
          // 手机网络模式 3G,4G,WIFI
          flag = rand.nextInt(3);
          switch (flag) {
              case 0:
                  appBase.setNw("3G");
                  break;
              case 1:
                  appBase.setNw("4G");
                  break;
              case 2:
                  appBase.setNw("WIFI");
                  break;
          }
  
          // 拉丁美洲 西经34°46′至西经117°09；北纬32°42′至南纬53°54′
          // 经度
          appBase.setLn((-34 - rand.nextInt(83) - rand.nextInt(60) / 10.0) + "");
          // 纬度
          appBase.setLa((32 - rand.nextInt(85) - rand.nextInt(60) / 10.0) + "");
  
          return (JSONObject) JSON.toJSON(appBase);
      }
  
      /**
       * 商品展示事件
       */
      private static JSONObject generateDisplay() {
  
          AppDisplay appDisplay = new AppDisplay();
  
          boolean boolFlag = rand.nextInt(10) < 7;
  
          // 动作：曝光商品=1，点击商品=2，
          if (boolFlag) {
              appDisplay.setAction("1");
          } else {
              appDisplay.setAction("2");
          }
  
          // 商品id
          String goodsId = s_goodsid + "";
          s_goodsid++;
  
          appDisplay.setGoodsid(goodsId);
  
          // 顺序  设置成6条吧
          int flag = rand.nextInt(6);
          appDisplay.setPlace("" + flag);
  
          // 曝光类型
          flag = 1 + rand.nextInt(2);
          appDisplay.setExtend1("" + flag);
  
          // 分类
          flag = 1 + rand.nextInt(100);
          appDisplay.setCategory("" + flag);
  
          JSONObject jsonObject = (JSONObject) JSON.toJSON(appDisplay);
  
          return packEventJson("display", jsonObject);
      }
  
      /**
       * 商品详情页
       */
      private static JSONObject generateNewsDetail() {
  
          AppNewsDetail appNewsDetail = new AppNewsDetail();
  
          // 页面入口来源
          int flag = 1 + rand.nextInt(3);
          appNewsDetail.setEntry(flag + "");
  
          // 动作
          appNewsDetail.setAction("" + (rand.nextInt(4) + 1));
  
          // 商品id
          appNewsDetail.setGoodsid(s_goodsid + "");
  
          // 商品来源类型
          flag = 1 + rand.nextInt(3);
          appNewsDetail.setShowtype(flag + "");
  
          // 商品样式
          flag = rand.nextInt(6);
          appNewsDetail.setShowtype("" + flag);
  
          // 页面停留时长
          flag = rand.nextInt(10) * rand.nextInt(7);
          appNewsDetail.setNews_staytime(flag + "");
  
          // 加载时长
          flag = rand.nextInt(10) * rand.nextInt(7);
          appNewsDetail.setLoading_time(flag + "");
  
          // 加载失败码
          flag = rand.nextInt(10);
          switch (flag) {
              case 1:
                  appNewsDetail.setType1("102");
                  break;
              case 2:
                  appNewsDetail.setType1("201");
                  break;
              case 3:
                  appNewsDetail.setType1("325");
                  break;
              case 4:
                  appNewsDetail.setType1("433");
                  break;
              case 5:
                  appNewsDetail.setType1("542");
                  break;
              default:
                  appNewsDetail.setType1("");
                  break;
          }
  
          // 分类
          flag = 1 + rand.nextInt(100);
          appNewsDetail.setCategory("" + flag);
  
          JSONObject eventJson = (JSONObject) JSON.toJSON(appNewsDetail);
  
          return packEventJson("newsdetail", eventJson);
      }
  
      /**
       * 商品列表
       */
      private static JSONObject generateNewList() {
  
          AppLoading appLoading = new AppLoading();
  
          // 动作
          int flag = rand.nextInt(3) + 1;
          appLoading.setAction(flag + "");
  
          // 加载时长
          flag = rand.nextInt(10) * rand.nextInt(7);
          appLoading.setLoading_time(flag + "");
  
          // 失败码
          flag = rand.nextInt(10);
          switch (flag) {
              case 1:
                  appLoading.setType1("102");
                  break;
              case 2:
                  appLoading.setType1("201");
                  break;
              case 3:
                  appLoading.setType1("325");
                  break;
              case 4:
                  appLoading.setType1("433");
                  break;
              case 5:
                  appLoading.setType1("542");
                  break;
              default:
                  appLoading.setType1("");
                  break;
          }
  
          // 页面  加载类型
          flag = 1 + rand.nextInt(2);
          appLoading.setLoading_way("" + flag);
  
          // 扩展字段1
          appLoading.setExtend1("");
  
          // 扩展字段2
          appLoading.setExtend2("");
  
          // 用户加载类型
          flag = 1 + rand.nextInt(3);
          appLoading.setType("" + flag);
  
          JSONObject jsonObject = (JSONObject) JSON.toJSON(appLoading);
  
          return packEventJson("loading", jsonObject);
      }
  
      /**
       * 广告相关字段
       */
      private static JSONObject generateAd() {
  
          AppAd appAd = new AppAd();
  
          // 入口
          int flag = rand.nextInt(3) + 1;
          appAd.setEntry(flag + "");
  
          // 动作
          flag = rand.nextInt(5) + 1;
          appAd.setAction(flag + "");
  
          // 状态
          flag = rand.nextInt(10) > 6 ? 2 : 1;
          appAd.setContent(flag + "");
  
          // 失败码
          flag = rand.nextInt(10);
          switch (flag) {
              case 1:
                  appAd.setDetail("102");
                  break;
              case 2:
                  appAd.setDetail("201");
                  break;
              case 3:
                  appAd.setDetail("325");
                  break;
              case 4:
                  appAd.setDetail("433");
                  break;
              case 5:
                  appAd.setDetail("542");
                  break;
              default:
                  appAd.setDetail("");
                  break;
          }
  
          // 广告来源
          flag = rand.nextInt(4) + 1;
          appAd.setSource(flag + "");
  
          // 用户行为
          flag = rand.nextInt(2) + 1;
          appAd.setBehavior(flag + "");
  
          // 商品类型
          flag = rand.nextInt(10);
          appAd.setNewstype("" + flag);
  
          // 展示样式
          flag = rand.nextInt(6);
          appAd.setShow_style("" + flag);
  
          JSONObject jsonObject = (JSONObject) JSON.toJSON(appAd);
  
          return packEventJson("ad", jsonObject);
      }
  
      /**
       * 启动日志
       */
      private static AppStart generateStart() {
  
          AppStart appStart = new AppStart();
  
          //设备id
          appStart.setMid(s_mid + "");
          s_mid++;
  
          // 用户id
          appStart.setUid(s_uid + "");
          s_uid++;
  
          // 程序版本号 5,6等
          appStart.setVc("" + rand.nextInt(20));
  
          //程序版本名 v1.1.1
          appStart.setVn("1." + rand.nextInt(4) + "." + rand.nextInt(10));
  
          // 安卓系统版本
          appStart.setOs("8." + rand.nextInt(3) + "." + rand.nextInt(10));
  
          //设置日志类型
          appStart.setEn("start");
  
          //    语言  es,en,pt
          int flag = rand.nextInt(3);
          switch (flag) {
              case (0):
                  appStart.setL("es");
                  break;
              case (1):
                  appStart.setL("en");
                  break;
              case (2):
                  appStart.setL("pt");
                  break;
          }
  
          // 渠道号   从哪个渠道来的
          appStart.setSr(getRandomChar(1));
  
          // 区域
          flag = rand.nextInt(2);
          switch (flag) {
              case 0:
                  appStart.setAr("BR");
              case 1:
                  appStart.setAr("MX");
          }
  
          // 手机品牌 ba ,手机型号 md，就取2位数字了
          flag = rand.nextInt(3);
          switch (flag) {
              case 0:
                  appStart.setBa("Sumsung");
                  appStart.setMd("sumsung-" + rand.nextInt(20));
                  break;
              case 1:
                  appStart.setBa("Huawei");
                  appStart.setMd("Huawei-" + rand.nextInt(20));
                  break;
              case 2:
                  appStart.setBa("HTC");
                  appStart.setMd("HTC-" + rand.nextInt(20));
                  break;
          }
  
          // 嵌入sdk的版本
          appStart.setSv("V2." + rand.nextInt(10) + "." + rand.nextInt(10));
          // gmail
          appStart.setG(getRandomCharAndNumr(8) + "@gmail.com");
  
          // 屏幕宽高 hw
          flag = rand.nextInt(4);
          switch (flag) {
              case 0:
                  appStart.setHw("640*960");
                  break;
              case 1:
                  appStart.setHw("640*1136");
                  break;
              case 2:
                  appStart.setHw("750*1134");
                  break;
              case 3:
                  appStart.setHw("1080*1920");
                  break;
          }
  
          // 客户端产生日志时间
          long millis = System.currentTimeMillis();
          appStart.setT("" + (millis - rand.nextInt(99999999)));
  
          // 手机网络模式 3G,4G,WIFI
          flag = rand.nextInt(3);
          switch (flag) {
              case 0:
                  appStart.setNw("3G");
                  break;
              case 1:
                  appStart.setNw("4G");
                  break;
              case 2:
                  appStart.setNw("WIFI");
                  break;
          }
  
          // 拉丁美洲 西经34°46′至西经117°09；北纬32°42′至南纬53°54′
          // 经度
          appStart.setLn((-34 - rand.nextInt(83) - rand.nextInt(60) / 10.0) + "");
          // 纬度
          appStart.setLa((32 - rand.nextInt(85) - rand.nextInt(60) / 10.0) + "");
  
          // 入口
          flag = rand.nextInt(5) + 1;
          appStart.setEntry(flag + "");
  
          // 开屏广告类型
          flag = rand.nextInt(2) + 1;
          appStart.setOpen_ad_type(flag + "");
  
          // 状态
          flag = rand.nextInt(10) > 8 ? 2 : 1;
          appStart.setAction(flag + "");
  
          // 加载时长
          appStart.setLoading_time(rand.nextInt(20) + "");
  
          // 失败码
          flag = rand.nextInt(10);
          switch (flag) {
              case 1:
                  appStart.setDetail("102");
                  break;
              case 2:
                  appStart.setDetail("201");
                  break;
              case 3:
                  appStart.setDetail("325");
                  break;
              case 4:
                  appStart.setDetail("433");
                  break;
              case 5:
                  appStart.setDetail("542");
                  break;
              default:
                  appStart.setDetail("");
                  break;
          }
  
          // 扩展字段
          appStart.setExtend1("");
  
          return appStart;
      }
      /**
       * 消息通知
       */
      private static JSONObject generateNotification() {
  
          AppNotification appNotification = new AppNotification();
  
          int flag = rand.nextInt(4) + 1;
  
          // 动作
          appNotification.setAction(flag + "");
  
          // 通知id
          flag = rand.nextInt(4) + 1;
          appNotification.setType(flag + "");
  
          // 客户端弹时间
          appNotification.setAp_time((System.currentTimeMillis() - rand.nextInt(99999999)) + "");
  
          // 备用字段
          appNotification.setContent("");
  
          JSONObject jsonObject = (JSONObject) JSON.toJSON(appNotification);
  
          return packEventJson("notification", jsonObject);
      }
  
      /**
       * 前台活跃
       */
      private static JSONObject generatbeforeground() {
  
          AppActive_foreground appActive_foreground = new AppActive_foreground();
  
          // 推送消息的id
          int flag = rand.nextInt(2);
          switch (flag) {
              case 1:
                  appActive_foreground.setAccess(flag + "");
                  break;
              default:
                  appActive_foreground.setAccess("");
                  break;
          }
  
          // 1.push 2.icon 3.其他
          flag = rand.nextInt(3) + 1;
          appActive_foreground.setPush_id(flag + "");
  
          JSONObject jsonObject = (JSONObject) JSON.toJSON(appActive_foreground);
  
          return packEventJson("active_foreground", jsonObject);
      }
  
      /**
       * 后台活跃
       */
      private static JSONObject generateBackground() {
  
          AppActive_background appActive_background = new AppActive_background();
  
          // 启动源
          int flag = rand.nextInt(3) + 1;
          appActive_background.setActive_source(flag + "");
  
          JSONObject jsonObject = (JSONObject) JSON.toJSON(appActive_background);
  
          return packEventJson("active_background", jsonObject);
      }
  
      /**
       * 错误日志数据
       */
      private static JSONObject generateError() {
  
          AppErrorLog appErrorLog = new AppErrorLog();
  
          String[] errorBriefs = {"at cn.lift.dfdf.web.AbstractBaseController.validInbound(AbstractBaseController.java:72)", "at cn.lift.appIn.control.CommandUtil.getInfo(CommandUtil.java:67)"};        //错误摘要
          String[] errorDetails = {"java.lang.NullPointerException\\n    " + "at cn.lift.appIn.web.AbstractBaseController.validInbound(AbstractBaseController.java:72)\\n " + "at cn.lift.dfdf.web.AbstractBaseController.validInbound", "at cn.lift.dfdfdf.control.CommandUtil.getInfo(CommandUtil.java:67)\\n " + "at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\n" + " at java.lang.reflect.Method.invoke(Method.java:606)\\n"};        //错误详情
  
          //错误摘要
          appErrorLog.setErrorBrief(errorBriefs[rand.nextInt(errorBriefs.length)]);
          //错误详情
          appErrorLog.setErrorDetail(errorDetails[rand.nextInt(errorDetails.length)]);
  
          JSONObject jsonObject = (JSONObject) JSON.toJSON(appErrorLog);
  
          return packEventJson("error", jsonObject);
      }
  
      /**
       * 为各个事件类型的公共字段（时间、事件类型、Json数据）拼接
       */
      private static JSONObject packEventJson(String eventName, JSONObject jsonObject) {
  
          JSONObject eventJson = new JSONObject();
  
          eventJson.put("ett", (System.currentTimeMillis() - rand.nextInt(99999999)) + "");
          eventJson.put("en", eventName);
          eventJson.put("kv", jsonObject);
  
          return eventJson;
      }
  
      /**
       * 获取随机字母组合
       *
       * @param length 字符串长度
       */
      private static String getRandomChar(Integer length) {
  
          StringBuilder str = new StringBuilder();
          Random random = new Random();
  
          for (int i = 0; i < length; i++) {
              // 字符串
              str.append((char) (65 + random.nextInt(26)));// 取得大写字母
          }
  
          return str.toString();
      }
  
      /**
       * 获取随机字母数字组合
       *
       * @param length 字符串长度
       */
      private static String getRandomCharAndNumr(Integer length) {
  
          StringBuilder str = new StringBuilder();
          Random random = new Random();
  
          for (int i = 0; i < length; i++) {
  
              boolean b = random.nextBoolean();
  
              if (b) { // 字符串
                  // int choice = random.nextBoolean() ? 65 : 97; 取得65大写字母还是97小写字母
                  str.append((char) (65 + random.nextInt(26)));// 取得大写字母
              } else { // 数字
                  str.append(String.valueOf(random.nextInt(10)));
              }
          }
  
          return str.toString();
      }
  
      /**
       * 收藏
       */
      private static JSONObject generateFavorites() {
  
          AppFavorites favorites = new AppFavorites();
  
          favorites.setCourse_id(rand.nextInt(10));
          favorites.setUserid(rand.nextInt(10));
          favorites.setAdd_time((System.currentTimeMillis() - rand.nextInt(99999999)) + "");
  
          JSONObject jsonObject = (JSONObject) JSON.toJSON(favorites);
  
          return packEventJson("favorites", jsonObject);
      }
  
      /**
       * 点赞
       */
      private static JSONObject generatePraise() {
  
          AppPraise praise = new AppPraise();
  
          praise.setId(rand.nextInt(10));
          praise.setUserid(rand.nextInt(10));
          praise.setTarget_id(rand.nextInt(10));
          praise.setType(rand.nextInt(4) + 1);
          praise.setAdd_time((System.currentTimeMillis() - rand.nextInt(99999999)) + "");
  
          JSONObject jsonObject = (JSONObject) JSON.toJSON(praise);
  
          return packEventJson("praise", jsonObject);
      }
  
      /**
       * 评论
       */
      private static JSONObject generateComment() {
  
          AppComment comment = new AppComment();
  
          comment.setComment_id(rand.nextInt(10));
          comment.setUserid(rand.nextInt(10));
          comment.setP_comment_id(rand.nextInt(5));
  
          comment.setContent(getCONTENT());
          comment.setAddtime((System.currentTimeMillis() - rand.nextInt(99999999)) + "");
  
          comment.setOther_id(rand.nextInt(10));
          comment.setPraise_count(rand.nextInt(1000));
          comment.setReply_count(rand.nextInt(200));
  
          JSONObject jsonObject = (JSONObject) JSON.toJSON(comment);
  
          return packEventJson("comment", jsonObject);
      }
  
      /**
       * 生成单个汉字
       */
      private static char getRandomChar() {
  
          String str = "";
          int hightPos; //
          int lowPos;
  
          Random random = new Random();
  
          //随机生成汉子的两个字节
          hightPos = (176 + Math.abs(random.nextInt(39)));
          lowPos = (161 + Math.abs(random.nextInt(93)));
  
          byte[] b = new byte[2];
          b[0] = (Integer.valueOf(hightPos)).byteValue();
          b[1] = (Integer.valueOf(lowPos)).byteValue();
  
          try {
              str = new String(b, "GBK");
          } catch (UnsupportedEncodingException e) {
              e.printStackTrace();
              System.out.println("错误");
          }
  
          return str.charAt(0);
      }
  
      /**
       * 拼接成多个汉字
       */
      private static String getCONTENT() {
  
          StringBuilder str = new StringBuilder();
  
          for (int i = 0; i < rand.nextInt(100); i++) {
              str.append(getRandomChar());
          }
  
          return str.toString();
      }
  }
  