• 离线电商数仓(四)之用户行为数据采集(四)数据生成模块(二) 数据生成脚本


    1 简介

    用户行为数据生成

    2 创建Maven工程

    1创建log-collector

     

    2)创建一个包名:com.atguigu.appclient

    3)com.atguigu.appclient包下创建一个类,AppMain。

    4pom.xml文件中添加如下内容

    <!--版本号统一-->
    <properties>
        <slf4j.version>1.7.20</slf4j.version>
        <logback.version>1.0.7</logback.version>
    </properties>
    
    <dependencies>
        <!--阿里巴巴开源json解析框架-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.51</version>
        </dependency>
    
        <!--日志生成框架-->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>${logback.version}</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>${logback.version}</version>
        </dependency>
    </dependencies>
    
    <!--编译打包插件-->
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-assembly-plugin </artifactId>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>com.atguigu.appclient.AppMain</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    View Code

    注意com.atguigu.appclient.AppMain要和自己的全类名一致

    2 公共字段Bean

    1)创建包名:com.atguigu.bean

    2com.atguigu.bean包下依次创建如下bean对象

    package com.atguigu.bean;
    /**
     * 公共日志
     */
    public class AppBase{
    
        private String mid; // (String) 设备唯一标识
        private String uid; // (String) 用户uid
        private String vc;  // (String) versionCode,程序版本号
        private String vn;  // (String) versionName,程序版本名
        private String l;   // (String) 系统语言
        private String sr;  // (String) 渠道号,应用从哪个渠道来的。
        private String os;  // (String) Android系统版本
        private String ar;  // (String) 区域
        private String md;  // (String) 手机型号
        private String ba;  // (String) 手机品牌
        private String sv;  // (String) sdkVersion
        private String g;   // (String) gmail
        private String hw;  // (String) heightXwidth,屏幕宽高
        private String t;   // (String) 客户端日志产生时的时间
        private String nw;  // (String) 网络模式
        private String ln;  // (double) lng经度
        private String la;  // (double) lat 纬度
    
        public String getMid() {
            return mid;
        }
    
        public void setMid(String mid) {
            this.mid = mid;
        }
    
        public String getUid() {
            return uid;
        }
    
        public void setUid(String uid) {
            this.uid = uid;
        }
    
        public String getVc() {
            return vc;
        }
    
        public void setVc(String vc) {
            this.vc = vc;
        }
    
        public String getVn() {
            return vn;
        }
    
        public void setVn(String vn) {
            this.vn = vn;
        }
    
        public String getL() {
            return l;
        }
    
        public void setL(String l) {
            this.l = l;
        }
    
        public String getSr() {
            return sr;
        }
    
        public void setSr(String sr) {
            this.sr = sr;
        }
    
        public String getOs() {
            return os;
        }
    
        public void setOs(String os) {
            this.os = os;
        }
    
        public String getAr() {
            return ar;
        }
    
        public void setAr(String ar) {
            this.ar = ar;
        }
    
        public String getMd() {
            return md;
        }
    
        public void setMd(String md) {
            this.md = md;
        }
    
        public String getBa() {
            return ba;
        }
    
        public void setBa(String ba) {
            this.ba = ba;
        }
    
        public String getSv() {
            return sv;
        }
    
        public void setSv(String sv) {
            this.sv = sv;
        }
    
        public String getG() {
            return g;
        }
    
        public void setG(String g) {
            this.g = g;
        }
    
        public String getHw() {
            return hw;
        }
    
        public void setHw(String hw) {
            this.hw = hw;
        }
    
        public String getT() {
            return t;
        }
    
        public void setT(String t) {
            this.t = t;
        }
    
        public String getNw() {
            return nw;
        }
    
        public void setNw(String nw) {
            this.nw = nw;
        }
    
        public String getLn() {
            return ln;
        }
    
        public void setLn(String ln) {
            this.ln = ln;
        }
    
        public String getLa() {
            return la;
        }
    
        public void setLa(String la) {
            this.la = la;
        }
    }
    View Code

    3 启动日志Bean

    package com.atguigu.bean;
    /**
     * 启动日志
     */
    public class AppStart extends AppBase {
    
        private String entry;//入口: push=1,widget=2,icon=3,notification=4, lockscreen_widget =5
        private String open_ad_type;//开屏广告类型:  开屏原生广告=1, 开屏插屏广告=2
        private String action;//状态:成功=1  失败=2
        private String loading_time;//加载时长:计算下拉开始到接口返回数据的时间,(开始加载报0,加载成功或加载失败才上报时间)
        private String detail;//失败码(没有则上报空)
        private String extend1;//失败的message(没有则上报空)
        private String en;//启动日志类型标记
    
        public String getEntry() {
            return entry;
        }
    
        public void setEntry(String entry) {
            this.entry = entry;
        }
    
        public String getOpen_ad_type() {
            return open_ad_type;
        }
    
        public void setOpen_ad_type(String open_ad_type) {
            this.open_ad_type = open_ad_type;
        }
    
        public String getAction() {
            return action;
        }
    
        public void setAction(String action) {
            this.action = action;
        }
    
        public String getLoading_time() {
            return loading_time;
        }
    
        public void setLoading_time(String loading_time) {
            this.loading_time = loading_time;
        }
    
        public String getDetail() {
            return detail;
        }
    
        public void setDetail(String detail) {
            this.detail = detail;
        }
    
        public String getExtend1() {
            return extend1;
        }
    
        public void setExtend1(String extend1) {
            this.extend1 = extend1;
        }
    
        public String getEn() {
            return en;
        }
    
        public void setEn(String en) {
            this.en = en;
        }
    }
    View Code

    3 错误日志Bean

    package com.atguigu.bean;
    /**
     * 错误日志
     */
    public class AppErrorLog {
    
        private String errorBrief;    //错误摘要
        private String errorDetail;   //错误详情
    
        public String getErrorBrief() {
            return errorBrief;
        }
    
        public void setErrorBrief(String errorBrief) {
            this.errorBrief = errorBrief;
        }
    
        public String getErrorDetail() {
            return errorDetail;
        }
    
        public void setErrorDetail(String errorDetail) {
            this.errorDetail = errorDetail;
        }
    }
    View Code

    4 事件日志Bean商品点击

    package com.atguigu.bean;
    /**
     * 商品点击日志
     */
    public class AppDisplay {
    
        private String action;//动作:曝光商品=1,点击商品=2,
        private String goodsid;//商品ID(服务端下发的ID)
        private String place;//顺序(第几条商品,第一条为0,第二条为1,如此类推)
        private String extend1;//曝光类型:1 - 首次曝光 2-重复曝光(没有使用)
        private String category;//分类ID(服务端定义的分类ID)
    
        public String getAction() {
            return action;
        }
    
        public void setAction(String action) {
            this.action = action;
        }
    
        public String getGoodsid() {
            return goodsid;
        }
    
        public void setGoodsid(String goodsid) {
            this.goodsid = goodsid;
        }
    
        public String getPlace() {
            return place;
        }
    
        public void setPlace(String place) {
            this.place = place;
        }
    
        public String getExtend1() {
            return extend1;
        }
    
        public void setExtend1(String extend1) {
            this.extend1 = extend1;
        }
    
        public String getCategory() {
            return category;
        }
    
        public void setCategory(String category) {
            this.category = category;
        }
    }
    View Code

    5 事件日志Bean商品详情

    package com.atguigu.bean;
    /**
     * 商品详情
     */
    public class AppNewsDetail {
    
        private String entry;//页面入口来源:应用首页=1、push=2、详情页相关推荐=3
        private String action;//动作:开始加载=1,加载成功=2(pv),加载失败=3, 退出页面=4
        private String goodsid;//商品ID(服务端下发的ID)
        private String showtype;//商品样式:0、无图1、一张大图2、两张图3、三张小图4、一张小图5、一张大图两张小图    来源于详情页相关推荐的商品,上报样式都为0(因为都是左文右图)
        private String news_staytime;//页面停留时长:从商品开始加载时开始计算,到用户关闭页面所用的时间。若中途用跳转到其它页面了,则暂停计时,待回到详情页时恢复计时。或中途划出的时间超过10分钟,则本次计时作废,不上报本次数据。如未加载成功退出,则报空。
        private String loading_time;//加载时长:计算页面开始加载到接口返回数据的时间 (开始加载报0,加载成功或加载失败才上报时间)
        private String type1;//加载失败码:把加载失败状态码报回来(报空为加载成功,没有失败)
        private String category;//分类ID(服务端定义的分类ID)
    
        public String getEntry() {
            return entry;
        }
    
        public void setEntry(String entry) {
            this.entry = entry;
        }
    
        public String getAction() {
            return action;
        }
    
        public void setAction(String action) {
            this.action = action;
        }
    
        public String getGoodsid() {
            return goodsid;
        }
    
        public void setGoodsid(String goodsid) {
            this.goodsid = goodsid;
        }
    
        public String getShowtype() {
            return showtype;
        }
    
        public void setShowtype(String showtype) {
            this.showtype = showtype;
        }
    
        public String getNews_staytime() {
            return news_staytime;
        }
    
        public void setNews_staytime(String news_staytime) {
            this.news_staytime = news_staytime;
        }
    
        public String getLoading_time() {
            return loading_time;
        }
    
        public void setLoading_time(String loading_time) {
            this.loading_time = loading_time;
        }
    
        public String getType1() {
            return type1;
        }
    
        public void setType1(String type1) {
            this.type1 = type1;
        }
    
        public String getCategory() {
            return category;
        }
    
        public void setCategory(String category) {
            this.category = category;
        }
    }
    View Code

    6 事件日志Bean商品列表

    package com.atguigu.bean;
    /**
     * 商品列表
     */
    public class AppLoading {
        private String action;//动作:开始加载=1,加载成功=2,加载失败=3
        private String loading_time;//加载时长:计算下拉开始到接口返回数据的时间,(开始加载报0,加载成功或加载失败才上报时间)
        private String loading_way;//加载类型:1-读取缓存,2-从接口拉新数据   (加载成功才上报加载类型)
        private String extend1;//扩展字段 Extend1
        private String extend2;//扩展字段 Extend2
        private String type;//加载类型:自动加载=1,用户下拽加载=2,底部加载=3(底部条触发点击底部提示条/点击返回顶部加载)
        private String type1;//加载失败码:把加载失败状态码报回来(报空为加载成功,没有失败)
    
        public String getAction() {
            return action;
        }
    
        public void setAction(String action) {
            this.action = action;
        }
    
        public String getLoading_time() {
            return loading_time;
        }
    
        public void setLoading_time(String loading_time) {
            this.loading_time = loading_time;
        }
    
        public String getLoading_way() {
            return loading_way;
        }
    
        public void setLoading_way(String loading_way) {
            this.loading_way = loading_way;
        }
    
        public String getExtend1() {
            return extend1;
        }
    
        public void setExtend1(String extend1) {
            this.extend1 = extend1;
        }
    
        public String getExtend2() {
            return extend2;
        }
    
        public void setExtend2(String extend2) {
            this.extend2 = extend2;
        }
    
        public String getType() {
            return type;
        }
    
        public void setType(String type) {
            this.type = type;
        }
    
        public String getType1() {
            return type1;
        }
    
        public void setType1(String type1) {
            this.type1 = type1;
        }
    }
    View Code

    7 事件日志Bean广告

    package com.atguigu.bean;
    /**
     * 广告
     */
    public class AppAd {
    
        private String entry;//入口:商品列表页=1  应用首页=2 商品详情页=3
        private String action;//动作:请求广告=1 取缓存广告=2  广告位展示=3 广告展示=4 广告点击=5
        private String content;//状态:成功=1  失败=2
        private String detail;//失败码(没有则上报空)
        private String source;//广告来源:admob=1 facebook=2  ADX(百度)=3 VK(俄罗斯)=4
        private String behavior;//用户行为:    主动获取广告=1    被动获取广告=2
        private String newstype;//Type: 1- 图文 2-图集 3-段子 4-GIF 5-视频 6-调查 7-纯文 8-视频+图文  9-GIF+图文  0-其他
        private String show_style;//内容样式:无图(纯文字)=6 一张大图=1  三站小图+文=4 一张小图=2 一张大图两张小图+文=3 图集+文 = 5
                               //一张大图+文=11   GIF大图+文=12  视频(大图)+文 = 13
                               //来源于详情页相关推荐的商品,上报样式都为0(因为都是左文右图)
    
        public String getEntry() {
            return entry;
        }
    
        public void setEntry(String entry) {
            this.entry = entry;
        }
    
        public String getAction() {
            return action;
        }
    
        public void setAction(String action) {
            this.action = action;
        }
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    
        public String getDetail() {
            return detail;
        }
    
        public void setDetail(String detail) {
            this.detail = detail;
        }
    
        public String getSource() {
            return source;
        }
    
        public void setSource(String source) {
            this.source = source;
        }
    
        public String getBehavior() {
            return behavior;
        }
    
        public void setBehavior(String behavior) {
            this.behavior = behavior;
        }
    
        public String getNewstype() {
            return newstype;
        }
    
        public void setNewstype(String newstype) {
            this.newstype = newstype;
        }
    
        public String getShow_style() {
            return show_style;
        }
    
        public void setShow_style(String show_style) {
            this.show_style = show_style;
        }
    }
    View Code

    8 事件日志Bean消息通知

    package com.atguigu.bean;
    /**
     * 消息通知日志
     */
    public class AppNotification {
        private String action;//动作:通知产生=1,通知弹出=2,通知点击=3,常驻通知展示(不重复上报,一天之内只报一次)=4
        private String type;//通知id:预警通知=1,天气预报(早=2,晚=3),常驻=4
        private String ap_time;//客户端弹出时间
        private String content;//备用字段
    
        public String getAction() {
            return action;
        }
    
        public void setAction(String action) {
            this.action = action;
        }
    
        public String getType() {
            return type;
        }
    
        public void setType(String type) {
            this.type = type;
        }
    
        public String getAp_time() {
            return ap_time;
        }
    
        public void setAp_time(String ap_time) {
            this.ap_time = ap_time;
        }
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    }
    View Code

    9 事件日志Bean用户前台活跃

    package com.atguigu.bean;
    /**
     * 用户前台活跃
     */
    public class AppActive_foreground {
        private String push_id;//推送的消息的id,如果不是从推送消息打开,传空
        private String access;//1.push 2.icon 3.其他
    
        public String getPush_id() {
            return push_id;
        }
    
        public void setPush_id(String push_id) {
            this.push_id = push_id;
        }
    
        public String getAccess() {
            return access;
        }
    
        public void setAccess(String access) {
            this.access = access;
        }
    }
    View Code

    10 事件日志Bean用户后台活跃

    package com.atguigu.bean;
    /**
     * 用户后台活跃
     */
    public class AppActive_background {
        private String active_source;//1=upgrade,2=download(下载),3=plugin_upgrade
    
        public String getActive_source() {
            return active_source;
        }
    
        public void setActive_source(String active_source) {
            this.active_source = active_source;
        }
    }
    View Code

    11 事件日志Bean用户评论

    package com.atguigu.bean;
    /**
     * 评论
     */
    public class AppComment {
    
        private int comment_id;//评论表
        private int userid;//用户id
        private  int p_comment_id;//父级评论id(为0则是一级评论,不为0则是回复)
        private String content;//评论内容
        private String addtime;//创建时间
        private int other_id;//评论的相关id
        private int praise_count;//点赞数量
        private int reply_count;//回复数量
    
        public int getComment_id() {
            return comment_id;
        }
    
        public void setComment_id(int comment_id) {
            this.comment_id = comment_id;
        }
    
        public int getUserid() {
            return userid;
        }
    
        public void setUserid(int userid) {
            this.userid = userid;
        }
    
        public int getP_comment_id() {
            return p_comment_id;
        }
    
        public void setP_comment_id(int p_comment_id) {
            this.p_comment_id = p_comment_id;
        }
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    
        public String getAddtime() {
            return addtime;
        }
    
        public void setAddtime(String addtime) {
            this.addtime = addtime;
        }
    
        public int getOther_id() {
            return other_id;
        }
    
        public void setOther_id(int other_id) {
            this.other_id = other_id;
        }
    
        public int getPraise_count() {
            return praise_count;
        }
    
        public void setPraise_count(int praise_count) {
            this.praise_count = praise_count;
        }
    
        public int getReply_count() {
            return reply_count;
        }
    
        public void setReply_count(int reply_count) {
            this.reply_count = reply_count;
        }
    }
    View Code

    12 事件日志Bean用户收藏

    package com.atguigu.bean;
    /**
     * 收藏
     */
    public class AppFavorites {
        private int id;//主键
        private int course_id;//商品id
        private int userid;//用户ID
        private String add_time;//创建时间
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public int getCourse_id() {
            return course_id;
        }
    
        public void setCourse_id(int course_id) {
            this.course_id = course_id;
        }
    
        public int getUserid() {
            return userid;
        }
    
        public void setUserid(int userid) {
            this.userid = userid;
        }
    
        public String getAdd_time() {
            return add_time;
        }
    
        public void setAdd_time(String add_time) {
            this.add_time = add_time;
        }
    }
    View Code

    13 事件日志Bean用户点赞

    package com.atguigu.bean;
    /**
     * 点赞
     */
    public class AppPraise {
        private int id; //主键id
        private int userid;//用户id
        private int target_id;//点赞的对象id
        private int type;//点赞类型 1问答点赞 2问答评论点赞 3 文章点赞数4 评论点赞
        private String add_time;//添加时间
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public int getUserid() {
            return userid;
        }
    
        public void setUserid(int userid) {
            this.userid = userid;
        }
    
        public int getTarget_id() {
            return target_id;
        }
    
        public void setTarget_id(int target_id) {
            this.target_id = target_id;
        }
    
        public int getType() {
            return type;
        }
    
        public void setType(int type) {
            this.type = type;
        }
    
        public String getAdd_time() {
            return add_time;
        }
    
        public void setAdd_time(String add_time) {
            this.add_time = add_time;
        }
    }
    View Code

    14 主函数

    在AppMain类中添加如下内容:

    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();
        }
    }
    View Code

    15 配置日志打印Logback

    Logback主要用于在磁盘控制台打印日志

    Logback具体使用:

    1)在resources文件夹下创建logback.xml文件

    2)在logback.xml文件中填写如下配置

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration debug="false">
       <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径 -->
       <property name="LOG_HOME" value="/tmp/logs/" />
    
       <!-- 控制台输出 -->
       <appender name="STDOUT"
          class="ch.qos.logback.core.ConsoleAppender">
          <encoder
             class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
             <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
          </encoder>
       </appender>
       
       <!-- 按照每天生成日志文件。存储事件日志 -->
       <appender name="FILE"
          class="ch.qos.logback.core.rolling.RollingFileAppender">
          <!-- <File>${LOG_HOME}/app.log</File>设置日志不超过${log.max.size}时的保存路径,注意,如果是web项目会保存到Tomcat的bin目录 下 -->  
          <rollingPolicy
             class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!--日志文件输出的文件名 -->
             <FileNamePattern>${LOG_HOME}/app-%d{yyyy-MM-dd}.log</FileNamePattern>
             <!--日志文件保留天数 -->
             <MaxHistory>30</MaxHistory>
          </rollingPolicy>
          <encoder
             class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
             <pattern>%msg%n</pattern>
          </encoder>
          <!--日志文件最大的大小 -->
          <triggeringPolicy
             class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
             <MaxFileSize>10MB</MaxFileSize>
          </triggeringPolicy>
       </appender>
    
        <!--异步打印日志-->
        <appender name ="ASYNC_FILE" class= "ch.qos.logback.classic.AsyncAppender">
            <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
            <discardingThreshold >0</discardingThreshold>
            <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
            <queueSize>512</queueSize>
            <!-- 添加附加的appender,最多只能添加一个 -->
            <appender-ref ref = "FILE"/>
        </appender>
    
        <!-- 日志输出级别 -->
       <root level="INFO">
          <appender-ref ref="STDOUT" />
          <appender-ref ref="ASYNC_FILE" />
          <appender-ref ref="error" />
       </root>
    </configuration>
    View Code

    16 打包

    1)采用Maven对程序打包

    在Idea中的最右边的导航栏中可以看到一个Maven Projects,单击打开,如图所示:

     (2)package

    2采用带依赖的jar包。包含了程序运行需要的所有依赖

    3)后续日志生成过程,在安装完HadoopZookeeper之后执行。

  • 相关阅读:
    【logback】认识logback
    【mybatis】认识selectKey
    【Mybatis】Insert批量操作
    JS事件委托
    android studio cmd获取SHA1 + java环境配置
    View的setOnClickListener的添加方法
    android apk 反编译 包括解密xml文件 资源文件 源代码
    localdb 2014 添加实例 v12.0 及IIS设置
    win10 离线安装 net 2.0 3.5
    c# json使用集
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/13499628.html
Copyright © 2020-2023  润新知