分享

企业级数据仓库构建(二)

本帖最后由 levycui 于 2020-9-9 22:59 编辑
问题导读:
1、如何进行埋点数据处理?
2、事件日志数据如何设计表?
3、如何使用数据生成脚本?
4、如何配置日志打印Logback?




上一篇:企业级数据仓库构建(一)

一、数据生成模块
1)埋点数据基本格式
  • 公共字段:基本所有安卓手机都包含的字段
  • 业务(事件)字段:埋点上报的字段,有具体的业务类型
示例如下
20200428092148276.png

2)示例日志(服务器时间戳 | 日志)如下
注意:事件字段包含多个用户行为数据
20200428092250499.png

3)事件日志数据
【3.1】商品列表页(loading)
事件名称:loading

2020-09-09_225528.jpg

【3.2】商品点击(display)
事件标签:display
2020-09-09_225606.jpg

【3.3】商品详情页(newsdetail)
事件名称:newsdetail
2020-09-09_225647.jpg

【3.4】广告(ad)
事件名称:ad

2020-09-09_225717.jpg

【3.5】消息通知(notification)
事件名称:notification
2020-09-09_225746.jpg
【3.7】评论(comment)
事件名称:comment
2020-09-09_225816.jpg
【3.8】收藏(favorites)
事件名称:favorites
2020-09-09_225849.jpg

2020-09-09_225919.jpg

【3.11】启动日志数据
事件标签: start
2020-09-09_225953.jpg

2020-09-09_230040.jpg
4)数据生成脚本
【4.1】架构图
2020-09-09_230118.jpg

【4.2】流程
1)创建Maven工程
2)导入依赖
  1. <!--版本号统一-->
  2.     <properties>
  3.         <slf4j.version>1.7.20</slf4j.version>
  4.         <logback.version>1.0.7</logback.version>
  5.     </properties>
  6.     <dependencies>
  7.         <!--阿里巴巴开源 json 解析框架-->
  8.         <dependency>
  9.             <groupId>com.alibaba</groupId>
  10.             <artifactId>fastjson</artifactId>
  11.             <version>1.2.51</version>
  12.         </dependency>
  13.         <!--日志生成框架-->
  14.         <dependency>
  15.             <groupId>ch.qos.logback</groupId>
  16.             <artifactId>logback-core</artifactId>
  17.             <version>${logback.version}</version>
  18.         </dependency>
  19.         <dependency>
  20.             <groupId>ch.qos.logback</groupId>
  21.             <artifactId>logback-classic</artifactId>
  22.             <version>${logback.version}</version>
  23.         </dependency>
  24.     </dependencies>
  25.     <!--编译打包插件-->
  26.     <build>
  27.         <plugins>
  28.             <plugin>
  29.                 <artifactId>maven-compiler-plugin</artifactId>
  30.                 <version>2.3.2</version>
  31.                 <configuration>
  32.                     <source>1.8</source>
  33.                     <target>1.8</target>
  34.                 </configuration>
  35.             </plugin>
  36.             <plugin>
  37.                 <artifactId>maven-assembly-plugin </artifactId>
  38.                 <configuration>
  39.                     <descriptorRefs>
  40.                         <descriptorRef>jar-with-dependencies</descriptorRef>
  41.                     </descriptorRefs>
  42.                     <archive>
  43.                         <manifest>
  44.                             <!--主方法全限定名-->
  45.                             <mainClass>com.zsy.appclient.AppMain</mainClass>
  46.                         </manifest>
  47.                     </archive>
  48.                 </configuration>
  49.                 <executions>
  50.                     <execution>
  51.                         <id>make-assembly</id>
  52.                         <phase>package</phase>
  53.                         <goals>
  54.                             <goal>single</goal>
  55.                         </goals>
  56.                     </execution>
  57.                 </executions>
  58.             </plugin>
  59.         </plugins>
  60.     </build>
复制代码

3)编写bean对象
  • 用户后台活跃 AppActive_background.java
  1. package com.zsy.bean;
  2. /**
  3. * 用户后台活跃
  4. */
  5. public class AppActive_background {
  6.     private String active_source;//1=upgrade,2=download(下载),3=plugin_upgrade
  7.     public String getActive_source() {
  8.         return active_source;
  9.     }
  10.     public void setActive_source(String active_source) {
  11.         this.active_source = active_source;
  12.     }
  13. }
复制代码
广告AppAd.java

  1. package com.zsy.bean;
  2. /**
  3. * 广告
  4. */
  5. public class AppAd {
  6.     private String entry;//入口:商品列表页=1  应用首页=2 商品详情页=3
  7.     private String action;//动作: 广告展示=1 广告点击=2
  8.     private String contentType;//Type: 1 商品 2 营销活动
  9.     private String displayMills;//展示时长 毫秒数
  10.     private String itemId; //商品id
  11.     private String activityId; //营销活动id
  12.     public String getEntry() {
  13.         return entry;
  14.     }
  15.     public void setEntry(String entry) {
  16.         this.entry = entry;
  17.     }
  18.     public String getAction() {
  19.         return action;
  20.     }
  21.     public void setAction(String action) {
  22.         this.action = action;
  23.     }
  24.     public String getActivityId() {
  25.         return activityId;
  26.     }
  27.     public void setActivityId(String activityId) {
  28.         this.activityId = activityId;
  29.     }
  30.     public String getContentType() {
  31.         return contentType;
  32.     }
  33.     public void setContentType(String contentType) {
  34.         this.contentType = contentType;
  35.     }
  36.     public String getDisplayMills() {
  37.         return displayMills;
  38.     }
  39.     public void setDisplayMills(String displayMills) {
  40.         this.displayMills = displayMills;
  41.     }
  42.     public String getItemId() {
  43.         return itemId;
  44.     }
  45.     public void setItemId(String itemId) {
  46.         this.itemId = itemId;
  47.     }
  48. }
复制代码

公共日志 AppBase.java
  1. package com.zsy.bean;
  2. /**
  3. * 公共日志
  4. */
  5. public class AppBase{
  6.     private String mid; // (String) 设备唯一标识
  7.     private String uid; // (String) 用户uid
  8.     private String vc;  // (String) versionCode,程序版本号
  9.     private String vn;  // (String) versionName,程序版本名
  10.     private String l;   // (String) 系统语言
  11.     private String sr;  // (String) 渠道号,应用从哪个渠道来的。
  12.     private String os;  // (String) Android系统版本
  13.     private String ar;  // (String) 区域
  14.     private String md;  // (String) 手机型号
  15.     private String ba;  // (String) 手机品牌
  16.     private String sv;  // (String) sdkVersion
  17.     private String g;   // (String) gmail
  18.     private String hw;  // (String) heightXwidth,屏幕宽高
  19.     private String t;   // (String) 客户端日志产生时的时间
  20.     private String nw;  // (String) 网络模式
  21.     private String ln;  // (double) lng经度
  22.     private String la;  // (double) lat 纬度
  23.     public String getMid() {
  24.         return mid;
  25.     }
  26.     public void setMid(String mid) {
  27.         this.mid = mid;
  28.     }
  29.     public String getUid() {
  30.         return uid;
  31.     }
  32.     public void setUid(String uid) {
  33.         this.uid = uid;
  34.     }
  35.     public String getVc() {
  36.         return vc;
  37.     }
  38.     public void setVc(String vc) {
  39.         this.vc = vc;
  40.     }
  41.     public String getVn() {
  42.         return vn;
  43.     }
  44.     public void setVn(String vn) {
  45.         this.vn = vn;
  46.     }
  47.     public String getL() {
  48.         return l;
  49.     }
  50.     public void setL(String l) {
  51.         this.l = l;
  52.     }
  53.     public String getSr() {
  54.         return sr;
  55.     }
  56.     public void setSr(String sr) {
  57.         this.sr = sr;
  58.     }
  59.     public String getOs() {
  60.         return os;
  61.     }
  62.     public void setOs(String os) {
  63.         this.os = os;
  64.     }
  65.     public String getAr() {
  66.         return ar;
  67.     }
  68.     public void setAr(String ar) {
  69.         this.ar = ar;
  70.     }
  71.     public String getMd() {
  72.         return md;
  73.     }
  74.     public void setMd(String md) {
  75.         this.md = md;
  76.     }
  77.     public String getBa() {
  78.         return ba;
  79.     }
  80.     public void setBa(String ba) {
  81.         this.ba = ba;
  82.     }
  83.     public String getSv() {
  84.         return sv;
  85.     }
  86.     public void setSv(String sv) {
  87.         this.sv = sv;
  88.     }
  89.     public String getG() {
  90.         return g;
  91.     }
  92.     public void setG(String g) {
  93.         this.g = g;
  94.     }
  95.     public String getHw() {
  96.         return hw;
  97.     }
  98.     public void setHw(String hw) {
  99.         this.hw = hw;
  100.     }
  101.     public String getT() {
  102.         return t;
  103.     }
  104.     public void setT(String t) {
  105.         this.t = t;
  106.     }
  107.     public String getNw() {
  108.         return nw;
  109.     }
  110.     public void setNw(String nw) {
  111.         this.nw = nw;
  112.     }
  113.     public String getLn() {
  114.         return ln;
  115.     }
  116.     public void setLn(String ln) {
  117.         this.ln = ln;
  118.     }
  119.     public String getLa() {
  120.         return la;
  121.     }
  122.     public void setLa(String la) {
  123.         this.la = la;
  124.     }
  125. }
复制代码



评论 AppComment.java
  1. package com.zsy.bean;
  2. /**
  3. * 评论
  4. */
  5. public class AppComment {
  6.     private int comment_id;//评论表
  7.     private int userid;//用户id
  8.     private  int p_comment_id;//父级评论id(为0则是一级评论,不为0则是回复)
  9.     private String content;//评论内容
  10.     private String addtime;//创建时间
  11.     private int other_id;//评论的相关id
  12.     private int praise_count;//点赞数量
  13.     private int reply_count;//回复数量
  14.     public int getComment_id() {
  15.         return comment_id;
  16.     }
  17.     public void setComment_id(int comment_id) {
  18.         this.comment_id = comment_id;
  19.     }
  20.     public int getUserid() {
  21.         return userid;
  22.     }
  23.     public void setUserid(int userid) {
  24.         this.userid = userid;
  25.     }
  26.     public int getP_comment_id() {
  27.         return p_comment_id;
  28.     }
  29.     public void setP_comment_id(int p_comment_id) {
  30.         this.p_comment_id = p_comment_id;
  31.     }
  32.     public String getContent() {
  33.         return content;
  34.     }
  35.     public void setContent(String content) {
  36.         this.content = content;
  37.     }
  38.     public String getAddtime() {
  39.         return addtime;
  40.     }
  41.     public void setAddtime(String addtime) {
  42.         this.addtime = addtime;
  43.     }
  44.     public int getOther_id() {
  45.         return other_id;
  46.     }
  47.     public void setOther_id(int other_id) {
  48.         this.other_id = other_id;
  49.     }
  50.     public int getPraise_count() {
  51.         return praise_count;
  52.     }
  53.     public void setPraise_count(int praise_count) {
  54.         this.praise_count = praise_count;
  55.     }
  56.     public int getReply_count() {
  57.         return reply_count;
  58.     }
  59.     public void setReply_count(int reply_count) {
  60.         this.reply_count = reply_count;
  61.     }
  62. }
复制代码

商品点击日志 AppDisplay.java
  1. package com.zsy.bean;
  2. /**
  3. * 商品点击日志
  4. */
  5. public class AppDisplay {
  6.     private String action;//动作:曝光商品=1,点击商品=2,
  7.     private String goodsid;//商品ID(服务端下发的ID)
  8.     private String place;//顺序(第几条商品,第一条为0,第二条为1,如此类推)
  9.     private String extend1;//曝光类型:1 - 首次曝光 2-重复曝光(没有使用)
  10.     private String category;//分类ID(服务端定义的分类ID)
  11.     public String getAction() {
  12.         return action;
  13.     }
  14.     public void setAction(String action) {
  15.         this.action = action;
  16.     }
  17.     public String getGoodsid() {
  18.         return goodsid;
  19.     }
  20.     public void setGoodsid(String goodsid) {
  21.         this.goodsid = goodsid;
  22.     }
  23.     public String getPlace() {
  24.         return place;
  25.     }
  26.     public void setPlace(String place) {
  27.         this.place = place;
  28.     }
  29.     public String getExtend1() {
  30.         return extend1;
  31.     }
  32.     public void setExtend1(String extend1) {
  33.         this.extend1 = extend1;
  34.     }
  35.     public String getCategory() {
  36.         return category;
  37.     }
  38.     public void setCategory(String category) {
  39.         this.category = category;
  40.     }
  41. }
复制代码
错误日志 AppErrorLog.java
  1. package com.zsy.bean;
  2. /**
  3. * 错误日志
  4. */
  5. public class AppErrorLog {
  6.     private String errorBrief;    //错误摘要
  7.     private String errorDetail;   //错误详情
  8.     public String getErrorBrief() {
  9.         return errorBrief;
  10.     }
  11.     public void setErrorBrief(String errorBrief) {
  12.         this.errorBrief = errorBrief;
  13.     }
  14.     public String getErrorDetail() {
  15.         return errorDetail;
  16.     }
  17.     public void setErrorDetail(String errorDetail) {
  18.         this.errorDetail = errorDetail;
  19.     }
  20. }
复制代码
收藏 AppFavorites.java
  1. package com.zsy.bean;
  2. /**
  3. * 收藏
  4. */
  5. public class AppFavorites {
  6.     private int id;//主键
  7.     private int course_id;//商品id
  8.     private int userid;//用户ID
  9.     private String add_time;//创建时间
  10.     public int getId() {
  11.         return id;
  12.     }
  13.     public void setId(int id) {
  14.         this.id = id;
  15.     }
  16.     public int getCourse_id() {
  17.         return course_id;
  18.     }
  19.     public void setCourse_id(int course_id) {
  20.         this.course_id = course_id;
  21.     }
  22.     public int getUserid() {
  23.         return userid;
  24.     }
  25.     public void setUserid(int userid) {
  26.         this.userid = userid;
  27.     }
  28.     public String getAdd_time() {
  29.         return add_time;
  30.     }
  31.     public void setAdd_time(String add_time) {
  32.         this.add_time = add_time;
  33.     }
  34. }
复制代码

商品列表 AppLoading.java
  1. package com.zsy.bean;
  2. /**
  3. * 商品列表
  4. */
  5. public class AppLoading {
  6.     private String action;//动作:开始加载=1,加载成功=2,加载失败=3
  7.     private String loading_time;//加载时长:计算下拉开始到接口返回数据的时间,(开始加载报0,加载成功或加载失败才上报时间)
  8.     private String loading_way;//加载类型:1-读取缓存,2-从接口拉新数据   (加载成功才上报加载类型)
  9.     private String extend1;//扩展字段 Extend1
  10.     private String extend2;//扩展字段 Extend2
  11.     private String type;//加载类型:自动加载=1,用户下拽加载=2,底部加载=3(底部条触发点击底部提示条/点击返回顶部加载)
  12.     private String type1;//加载失败码:把加载失败状态码报回来(报空为加载成功,没有失败)
  13.     public String getAction() {
  14.         return action;
  15.     }
  16.     public void setAction(String action) {
  17.         this.action = action;
  18.     }
  19.     public String getLoading_time() {
  20.         return loading_time;
  21.     }
  22.     public void setLoading_time(String loading_time) {
  23.         this.loading_time = loading_time;
  24.     }
  25.     public String getLoading_way() {
  26.         return loading_way;
  27.     }
  28.     public void setLoading_way(String loading_way) {
  29.         this.loading_way = loading_way;
  30.     }
  31.     public String getExtend1() {
  32.         return extend1;
  33.     }
  34.     public void setExtend1(String extend1) {
  35.         this.extend1 = extend1;
  36.     }
  37.     public String getExtend2() {
  38.         return extend2;
  39.     }
  40.     public void setExtend2(String extend2) {
  41.         this.extend2 = extend2;
  42.     }
  43.     public String getType() {
  44.         return type;
  45.     }
  46.     public void setType(String type) {
  47.         this.type = type;
  48.     }
  49.     public String getType1() {
  50.         return type1;
  51.     }
  52.     public void setType1(String type1) {
  53.         this.type1 = type1;
  54.     }
  55. }
复制代码

商品详情 AppNewsDetail.java
  1. package com.zsy.bean;
  2. /**
  3. * 商品详情
  4. */
  5. public class AppNewsDetail {
  6.     private String entry;//页面入口来源:应用首页=1、push=2、详情页相关推荐=3
  7.     private String action;//动作:开始加载=1,加载成功=2(pv),加载失败=3, 退出页面=4
  8.     private String goodsid;//商品ID(服务端下发的ID)
  9.     private String showtype;//商品样式:0、无图1、一张大图2、两张图3、三张小图4、一张小图5、一张大图两张小图    来源于详情页相关推荐的商品,上报样式都为0(因为都是左文右图)
  10.     private String news_staytime;//页面停留时长:从商品开始加载时开始计算,到用户关闭页面所用的时间。若中途用跳转到其它页面了,则暂停计时,待回到详情页时恢复计时。或中途划出的时间超过10分钟,则本次计时作废,不上报本次数据。如未加载成功退出,则报空。
  11.     private String loading_time;//加载时长:计算页面开始加载到接口返回数据的时间 (开始加载报0,加载成功或加载失败才上报时间)
  12.     private String type1;//加载失败码:把加载失败状态码报回来(报空为加载成功,没有失败)
  13.     private String category;//分类ID(服务端定义的分类ID)
  14.     public String getEntry() {
  15.         return entry;
  16.     }
  17.     public void setEntry(String entry) {
  18.         this.entry = entry;
  19.     }
  20.     public String getAction() {
  21.         return action;
  22.     }
  23.     public void setAction(String action) {
  24.         this.action = action;
  25.     }
  26.     public String getGoodsid() {
  27.         return goodsid;
  28.     }
  29.     public void setGoodsid(String goodsid) {
  30.         this.goodsid = goodsid;
  31.     }
  32.     public String getShowtype() {
  33.         return showtype;
  34.     }
  35.     public void setShowtype(String showtype) {
  36.         this.showtype = showtype;
  37.     }
  38.     public String getNews_staytime() {
  39.         return news_staytime;
  40.     }
  41.     public void setNews_staytime(String news_staytime) {
  42.         this.news_staytime = news_staytime;
  43.     }
  44.     public String getLoading_time() {
  45.         return loading_time;
  46.     }
  47.     public void setLoading_time(String loading_time) {
  48.         this.loading_time = loading_time;
  49.     }
  50.     public String getType1() {
  51.         return type1;
  52.     }
  53.     public void setType1(String type1) {
  54.         this.type1 = type1;
  55.     }
  56.     public String getCategory() {
  57.         return category;
  58.     }
  59.     public void setCategory(String category) {
  60.         this.category = category;
  61.     }
  62. }
复制代码

消息通知日志 AppNotification.java
  1. package com.zsy.bean;
  2. /**
  3. * 消息通知日志
  4. */
  5. public class AppNotification {
  6.     private String action;//动作:通知产生=1,通知弹出=2,通知点击=3,常驻通知展示(不重复上报,一天之内只报一次)=4
  7.     private String type;//通知id:预警通知=1,天气预报(早=2,晚=3),常驻=4
  8.     private String ap_time;//客户端弹出时间
  9.     private String content;//备用字段
  10.     public String getAction() {
  11.         return action;
  12.     }
  13.     public void setAction(String action) {
  14.         this.action = action;
  15.     }
  16.     public String getType() {
  17.         return type;
  18.     }
  19.     public void setType(String type) {
  20.         this.type = type;
  21.     }
  22.     public String getAp_time() {
  23.         return ap_time;
  24.     }
  25.     public void setAp_time(String ap_time) {
  26.         this.ap_time = ap_time;
  27.     }
  28.     public String getContent() {
  29.         return content;
  30.     }
  31.     public void setContent(String content) {
  32.         this.content = content;
  33.     }
  34. }
复制代码

点赞 AppPraise.java
  1. package com.zsy.bean;
  2. /**
  3. * 点赞
  4. */
  5. public class AppPraise {
  6.     private int id; //主键id
  7.     private int userid;//用户id
  8.     private int target_id;//点赞的对象id
  9.     private int type;//点赞类型 1问答点赞 2问答评论点赞 3 文章点赞数4 评论点赞
  10.     private String add_time;//添加时间
  11.     public int getId() {
  12.         return id;
  13.     }
  14.     public void setId(int id) {
  15.         this.id = id;
  16.     }
  17.     public int getUserid() {
  18.         return userid;
  19.     }
  20.     public void setUserid(int userid) {
  21.         this.userid = userid;
  22.     }
  23.     public int getTarget_id() {
  24.         return target_id;
  25.     }
  26.     public void setTarget_id(int target_id) {
  27.         this.target_id = target_id;
  28.     }
  29.     public int getType() {
  30.         return type;
  31.     }
  32.     public void setType(int type) {
  33.         this.type = type;
  34.     }
  35.     public String getAdd_time() {
  36.         return add_time;
  37.     }
  38.     public void setAdd_time(String add_time) {
  39.         this.add_time = add_time;
  40.     }
  41. }
复制代码

启动日志 AppStart.java
  1. package com.zsy.bean;
  2. /**
  3. * 启动日志
  4. */
  5. public class AppStart extends AppBase {
  6.     private String entry;//入口: push=1,widget=2,icon=3,notification=4, lockscreen_widget =5
  7.     private String open_ad_type;//开屏广告类型:  开屏原生广告=1, 开屏插屏广告=2
  8.     private String action;//状态:成功=1  失败=2
  9.     private String loading_time;//加载时长:计算下拉开始到接口返回数据的时间,(开始加载报0,加载成功或加载失败才上报时间)
  10.     private String detail;//失败码(没有则上报空)
  11.     private String extend1;//失败的message(没有则上报空)
  12.     private String en;//启动日志类型标记
  13.     public String getEntry() {
  14.         return entry;
  15.     }
  16.     public void setEntry(String entry) {
  17.         this.entry = entry;
  18.     }
  19.     public String getOpen_ad_type() {
  20.         return open_ad_type;
  21.     }
  22.     public void setOpen_ad_type(String open_ad_type) {
  23.         this.open_ad_type = open_ad_type;
  24.     }
  25.     public String getAction() {
  26.         return action;
  27.     }
  28.     public void setAction(String action) {
  29.         this.action = action;
  30.     }
  31.     public String getLoading_time() {
  32.         return loading_time;
  33.     }
  34.     public void setLoading_time(String loading_time) {
  35.         this.loading_time = loading_time;
  36.     }
  37.     public String getDetail() {
  38.         return detail;
  39.     }
  40.     public void setDetail(String detail) {
  41.         this.detail = detail;
  42.     }
  43.     public String getExtend1() {
  44.         return extend1;
  45.     }
  46.     public void setExtend1(String extend1) {
  47.         this.extend1 = extend1;
  48.     }
  49.     public String getEn() {
  50.         return en;
  51.     }
  52.     public void setEn(String en) {
  53.         this.en = en;
  54.     }
  55. }
复制代码

4.创建数据生成代码 AppMain.java
  1. package com.zsy.appclient;
  2. import java.io.UnsupportedEncodingException;
  3. import java.util.Random;
  4. import com.alibaba.fastjson.JSON;
  5. import com.alibaba.fastjson.JSONArray;
  6. import com.alibaba.fastjson.JSONObject;
  7. import com.zsy.bean.*;
  8. import org.slf4j.Logger;
  9. import org.slf4j.LoggerFactory;
  10. /**
  11. * 日志行为数据模拟
  12. */
  13. public class AppMain {
  14.     private final static Logger logger = LoggerFactory.getLogger(AppMain.class);
  15.     private static Random rand = new Random();
  16.     // 设备id
  17.     private static int s_mid = 0;
  18.     // 用户id
  19.     private static int s_uid = 0;
  20.     // 商品id
  21.     private static int s_goodsid = 0;
  22.     public static void main(String[] args) {
  23.         // 参数一:控制发送每条的延时时间,默认是0
  24.         Long delay = args.length > 0 ? Long.parseLong(args[0]) : 0L;
  25.         // 参数二:循环遍历次数
  26.         int loop_len = args.length > 1 ? Integer.parseInt(args[1]) : 1000;
  27.         // 生成数据
  28.         generateLog(delay, loop_len);
  29.     }
  30.     private static void generateLog(Long delay, int loop_len) {
  31.         for (int i = 0; i < loop_len; i++) {
  32.             int flag = rand.nextInt(2);
  33.             switch (flag) {
  34.                 case (0):
  35.                     //应用启动
  36.                     AppStart appStart = generateStart();
  37.                     String jsonString = JSON.toJSONString(appStart);
  38.                     //控制台打印
  39.                     logger.info(jsonString);
  40.                     break;
  41.                 case (1):
  42.                     JSONObject json = new JSONObject();
  43.                     json.put("ap", "app");
  44.                     json.put("cm", generateComFields());
  45.                     JSONArray eventsArray = new JSONArray();
  46.                     // 事件日志
  47.                     // 商品点击,展示
  48.                     if (rand.nextBoolean()) {
  49.                         eventsArray.add(generateDisplay());
  50.                         json.put("et", eventsArray);
  51.                     }
  52.                     // 商品详情页
  53.                     if (rand.nextBoolean()) {
  54.                         eventsArray.add(generateNewsDetail());
  55.                         json.put("et", eventsArray);
  56.                     }
  57.                     // 商品列表页
  58.                     if (rand.nextBoolean()) {
  59.                         eventsArray.add(generateNewList());
  60.                         json.put("et", eventsArray);
  61.                     }
  62.                     // 广告
  63.                     if (rand.nextBoolean()) {
  64.                         eventsArray.add(generateAd());
  65.                         json.put("et", eventsArray);
  66.                     }
  67.                     // 消息通知
  68.                     if (rand.nextBoolean()) {
  69.                         eventsArray.add(generateNotification());
  70.                         json.put("et", eventsArray);
  71.                     }
  72.                     // 用户后台活跃
  73.                     if (rand.nextBoolean()) {
  74.                         eventsArray.add(generateBackground());
  75.                         json.put("et", eventsArray);
  76.                     }
  77.                     //故障日志
  78.                     if (rand.nextBoolean()) {
  79.                         eventsArray.add(generateError());
  80.                         json.put("et", eventsArray);
  81.                     }
  82.                     // 用户评论
  83.                     if (rand.nextBoolean()) {
  84.                         eventsArray.add(generateComment());
  85.                         json.put("et", eventsArray);
  86.                     }
  87.                     // 用户收藏
  88.                     if (rand.nextBoolean()) {
  89.                         eventsArray.add(generateFavorites());
  90.                         json.put("et", eventsArray);
  91.                     }
  92.                     // 用户点赞
  93.                     if (rand.nextBoolean()) {
  94.                         eventsArray.add(generatePraise());
  95.                         json.put("et", eventsArray);
  96.                     }
  97.                     //时间
  98.                     long millis = System.currentTimeMillis();
  99.                     //控制台打印
  100.                     logger.info(millis + "|" + json.toJSONString());
  101.                     break;
  102.             }
  103.             // 延迟
  104.             try {
  105.                 Thread.sleep(delay);
  106.             } catch (InterruptedException e) {
  107.                 e.printStackTrace();
  108.             }
  109.         }
  110.     }
  111.     /**
  112.      * 公共字段设置
  113.      */
  114.     private static JSONObject generateComFields() {
  115.         AppBase appBase = new AppBase();
  116.         //设备id
  117.         appBase.setMid(s_mid + "");
  118.         s_mid++;
  119.         // 用户id
  120.         appBase.setUid(s_uid + "");
  121.         s_uid++;
  122.         // 程序版本号 5,6等
  123.         appBase.setVc("" + rand.nextInt(20));
  124.         //程序版本名 v1.1.1
  125.         appBase.setVn("1." + rand.nextInt(4) + "." + rand.nextInt(10));
  126.         // 安卓系统版本
  127.         appBase.setOs("8." + rand.nextInt(3) + "." + rand.nextInt(10));
  128.         // 语言  es,en,pt
  129.         int flag = rand.nextInt(3);
  130.         switch (flag) {
  131.             case (0):
  132.                 appBase.setL("es");
  133.                 break;
  134.             case (1):
  135.                 appBase.setL("en");
  136.                 break;
  137.             case (2):
  138.                 appBase.setL("pt");
  139.                 break;
  140.         }
  141.         // 渠道号   从哪个渠道来的
  142.         appBase.setSr(getRandomChar(1));
  143.         // 区域
  144.         flag = rand.nextInt(2);
  145.         switch (flag) {
  146.             case 0:
  147.                 appBase.setAr("BR");
  148.             case 1:
  149.                 appBase.setAr("MX");
  150.         }
  151.         // 手机品牌 ba ,手机型号 md,就取2位数字了
  152.         flag = rand.nextInt(3);
  153.         switch (flag) {
  154.             case 0:
  155.                 appBase.setBa("Sumsung");
  156.                 appBase.setMd("sumsung-" + rand.nextInt(20));
  157.                 break;
  158.             case 1:
  159.                 appBase.setBa("Huawei");
  160.                 appBase.setMd("Huawei-" + rand.nextInt(20));
  161.                 break;
  162.             case 2:
  163.                 appBase.setBa("HTC");
  164.                 appBase.setMd("HTC-" + rand.nextInt(20));
  165.                 break;
  166.         }
  167.         // 嵌入sdk的版本
  168.         appBase.setSv("V2." + rand.nextInt(10) + "." + rand.nextInt(10));
  169.         // gmail
  170.         appBase.setG(getRandomCharAndNumr(8) + "@gmail.com");
  171.         // 屏幕宽高 hw
  172.         flag = rand.nextInt(4);
  173.         switch (flag) {
  174.             case 0:
  175.                 appBase.setHw("640*960");
  176.                 break;
  177.             case 1:
  178.                 appBase.setHw("640*1136");
  179.                 break;
  180.             case 2:
  181.                 appBase.setHw("750*1134");
  182.                 break;
  183.             case 3:
  184.                 appBase.setHw("1080*1920");
  185.                 break;
  186.         }
  187.         // 客户端产生日志时间
  188.         long millis = System.currentTimeMillis();
  189.         appBase.setT("" + (millis - rand.nextInt(99999999)));
  190.         // 手机网络模式 3G,4G,WIFI
  191.         flag = rand.nextInt(3);
  192.         switch (flag) {
  193.             case 0:
  194.                 appBase.setNw("3G");
  195.                 break;
  196.             case 1:
  197.                 appBase.setNw("4G");
  198.                 break;
  199.             case 2:
  200.                 appBase.setNw("WIFI");
  201.                 break;
  202.         }
  203.         // 拉丁美洲 西经34°46′至西经117°09;北纬32°42′至南纬53°54′
  204.         // 经度
  205.         appBase.setLn((-34 - rand.nextInt(83) - rand.nextInt(60) / 10.0) + "");
  206.         // 纬度
  207.         appBase.setLa((32 - rand.nextInt(85) - rand.nextInt(60) / 10.0) + "");
  208.         return (JSONObject) JSON.toJSON(appBase);
  209.     }
  210.     /**
  211.      * 商品展示事件
  212.      */
  213.     private static JSONObject generateDisplay() {
  214.         AppDisplay appDisplay = new AppDisplay();
  215.         boolean boolFlag = rand.nextInt(10) < 7;
  216.         // 动作:曝光商品=1,点击商品=2,
  217.         if (boolFlag) {
  218.             appDisplay.setAction("1");
  219.         } else {
  220.             appDisplay.setAction("2");
  221.         }
  222.         // 商品id
  223.         String goodsId = s_goodsid + "";
  224.         s_goodsid++;
  225.         appDisplay.setGoodsid(goodsId);
  226.         // 顺序  设置成6条吧
  227.         int flag = rand.nextInt(6);
  228.         appDisplay.setPlace("" + flag);
  229.         // 曝光类型
  230.         flag = 1 + rand.nextInt(2);
  231.         appDisplay.setExtend1("" + flag);
  232.         // 分类
  233.         flag = 1 + rand.nextInt(100);
  234.         appDisplay.setCategory("" + flag);
  235.         JSONObject jsonObject = (JSONObject) JSON.toJSON(appDisplay);
  236.         return packEventJson("display", jsonObject);
  237.     }
  238.     /**
  239.      * 商品详情页
  240.      */
  241.     private static JSONObject generateNewsDetail() {
  242.         AppNewsDetail appNewsDetail = new AppNewsDetail();
  243.         // 页面入口来源
  244.         int flag = 1 + rand.nextInt(3);
  245.         appNewsDetail.setEntry(flag + "");
  246.         // 动作
  247.         appNewsDetail.setAction("" + (rand.nextInt(4) + 1));
  248.         // 商品id
  249.         appNewsDetail.setGoodsid(s_goodsid + "");
  250.         // 商品来源类型
  251.         flag = 1 + rand.nextInt(3);
  252.         appNewsDetail.setShowtype(flag + "");
  253.         // 商品样式
  254.         flag = rand.nextInt(6);
  255.         appNewsDetail.setShowtype("" + flag);
  256.         // 页面停留时长
  257.         flag = rand.nextInt(10) * rand.nextInt(7);
  258.         appNewsDetail.setNews_staytime(flag + "");
  259.         // 加载时长
  260.         flag = rand.nextInt(10) * rand.nextInt(7);
  261.         appNewsDetail.setLoading_time(flag + "");
  262.         // 加载失败码
  263.         flag = rand.nextInt(10);
  264.         switch (flag) {
  265.             case 1:
  266.                 appNewsDetail.setType1("102");
  267.                 break;
  268.             case 2:
  269.                 appNewsDetail.setType1("201");
  270.                 break;
  271.             case 3:
  272.                 appNewsDetail.setType1("325");
  273.                 break;
  274.             case 4:
  275.                 appNewsDetail.setType1("433");
  276.                 break;
  277.             case 5:
  278.                 appNewsDetail.setType1("542");
  279.                 break;
  280.             default:
  281.                 appNewsDetail.setType1("");
  282.                 break;
  283.         }
  284.         // 分类
  285.         flag = 1 + rand.nextInt(100);
  286.         appNewsDetail.setCategory("" + flag);
  287.         JSONObject eventJson = (JSONObject) JSON.toJSON(appNewsDetail);
  288.         return packEventJson("newsdetail", eventJson);
  289.     }
  290.     /**
  291.      * 商品列表
  292.      */
  293.     private static JSONObject generateNewList() {
  294.         AppLoading appLoading = new AppLoading();
  295.         // 动作
  296.         int flag = rand.nextInt(3) + 1;
  297.         appLoading.setAction(flag + "");
  298.         // 加载时长
  299.         flag = rand.nextInt(10) * rand.nextInt(7);
  300.         appLoading.setLoading_time(flag + "");
  301.         // 失败码
  302.         flag = rand.nextInt(10);
  303.         switch (flag) {
  304.             case 1:
  305.                 appLoading.setType1("102");
  306.                 break;
  307.             case 2:
  308.                 appLoading.setType1("201");
  309.                 break;
  310.             case 3:
  311.                 appLoading.setType1("325");
  312.                 break;
  313.             case 4:
  314.                 appLoading.setType1("433");
  315.                 break;
  316.             case 5:
  317.                 appLoading.setType1("542");
  318.                 break;
  319.             default:
  320.                 appLoading.setType1("");
  321.                 break;
  322.         }
  323.         // 页面  加载类型
  324.         flag = 1 + rand.nextInt(2);
  325.         appLoading.setLoading_way("" + flag);
  326.         // 扩展字段1
  327.         appLoading.setExtend1("");
  328.         // 扩展字段2
  329.         appLoading.setExtend2("");
  330.         // 用户加载类型
  331.         flag = 1 + rand.nextInt(3);
  332.         appLoading.setType("" + flag);
  333.         JSONObject jsonObject = (JSONObject) JSON.toJSON(appLoading);
  334.         return packEventJson("loading", jsonObject);
  335.     }
  336.     /**
  337.      * 广告相关字段
  338.      */
  339.     private static JSONObject generateAd() {
  340.         AppAd appAd = new AppAd();
  341.         // 入口
  342.         int flag = rand.nextInt(3) + 1;
  343.         appAd.setEntry(flag + "");
  344.         // 动作
  345.         flag = rand.nextInt(5) + 1;
  346.         appAd.setAction(flag + "");
  347.         // 内容类型类型
  348.         flag = rand.nextInt(6) + 1;
  349.         appAd.setContentType(flag + "");
  350.         // 展示样式
  351.         flag = rand.nextInt(120000) + 1000;
  352.         appAd.setDisplayMills(flag + "");
  353.         flag = rand.nextInt(1);
  354.         if (flag == 1) {
  355.             appAd.setContentType(flag + "");
  356.             flag = rand.nextInt(6);
  357.             appAd.setItemId(flag + "");
  358.         } else {
  359.             appAd.setContentType(flag + "");
  360.             flag = rand.nextInt(1) + 1;
  361.             appAd.setActivityId(flag + "");
  362.         }
  363.         JSONObject jsonObject = (JSONObject) JSON.toJSON(appAd);
  364.         return packEventJson("ad", jsonObject);
  365.     }
  366.     /**
  367.      * 启动日志
  368.      */
  369.     private static AppStart generateStart() {
  370.         AppStart appStart = new AppStart();
  371.         //设备id
  372.         appStart.setMid(s_mid + "");
  373.         s_mid++;
  374.         // 用户id
  375.         appStart.setUid(s_uid + "");
  376.         s_uid++;
  377.         // 程序版本号 5,6等
  378.         appStart.setVc("" + rand.nextInt(20));
  379.         //程序版本名 v1.1.1
  380.         appStart.setVn("1." + rand.nextInt(4) + "." + rand.nextInt(10));
  381.         // 安卓系统版本
  382.         appStart.setOs("8." + rand.nextInt(3) + "." + rand.nextInt(10));
  383.         //设置日志类型
  384.         appStart.setEn("start");
  385.         //    语言  es,en,pt
  386.         int flag = rand.nextInt(3);
  387.         switch (flag) {
  388.             case (0):
  389.                 appStart.setL("es");
  390.                 break;
  391.             case (1):
  392.                 appStart.setL("en");
  393.                 break;
  394.             case (2):
  395.                 appStart.setL("pt");
  396.                 break;
  397.         }
  398.         // 渠道号   从哪个渠道来的
  399.         appStart.setSr(getRandomChar(1));
  400.         // 区域
  401.         flag = rand.nextInt(2);
  402.         switch (flag) {
  403.             case 0:
  404.                 appStart.setAr("BR");
  405.             case 1:
  406.                 appStart.setAr("MX");
  407.         }
  408.         // 手机品牌 ba ,手机型号 md,就取2位数字了
  409.         flag = rand.nextInt(3);
  410.         switch (flag) {
  411.             case 0:
  412.                 appStart.setBa("Sumsung");
  413.                 appStart.setMd("sumsung-" + rand.nextInt(20));
  414.                 break;
  415.             case 1:
  416.                 appStart.setBa("Huawei");
  417.                 appStart.setMd("Huawei-" + rand.nextInt(20));
  418.                 break;
  419.             case 2:
  420.                 appStart.setBa("HTC");
  421.                 appStart.setMd("HTC-" + rand.nextInt(20));
  422.                 break;
  423.         }
  424.         // 嵌入sdk的版本
  425.         appStart.setSv("V2." + rand.nextInt(10) + "." + rand.nextInt(10));
  426.         // gmail
  427.         appStart.setG(getRandomCharAndNumr(8) + "@gmail.com");
  428.         // 屏幕宽高 hw
  429.         flag = rand.nextInt(4);
  430.         switch (flag) {
  431.             case 0:
  432.                 appStart.setHw("640*960");
  433.                 break;
  434.             case 1:
  435.                 appStart.setHw("640*1136");
  436.                 break;
  437.             case 2:
  438.                 appStart.setHw("750*1134");
  439.                 break;
  440.             case 3:
  441.                 appStart.setHw("1080*1920");
  442.                 break;
  443.         }
  444.         // 客户端产生日志时间
  445.         long millis = System.currentTimeMillis();
  446.         appStart.setT("" + (millis - rand.nextInt(99999999)));
  447.         // 手机网络模式 3G,4G,WIFI
  448.         flag = rand.nextInt(3);
  449.         switch (flag) {
  450.             case 0:
  451.                 appStart.setNw("3G");
  452.                 break;
  453.             case 1:
  454.                 appStart.setNw("4G");
  455.                 break;
  456.             case 2:
  457.                 appStart.setNw("WIFI");
  458.                 break;
  459.         }
  460.         // 拉丁美洲 西经34°46′至西经117°09;北纬32°42′至南纬53°54′
  461.         // 经度
  462.         appStart.setLn((-34 - rand.nextInt(83) - rand.nextInt(60) / 10.0) + "");
  463.         // 纬度
  464.         appStart.setLa((32 - rand.nextInt(85) - rand.nextInt(60) / 10.0) + "");
  465.         // 入口
  466.         flag = rand.nextInt(5) + 1;
  467.         appStart.setEntry(flag + "");
  468.         // 开屏广告类型
  469.         flag = rand.nextInt(2) + 1;
  470.         appStart.setOpen_ad_type(flag + "");
  471.         // 状态
  472.         flag = rand.nextInt(10) > 8 ? 2 : 1;
  473.         appStart.setAction(flag + "");
  474.         // 加载时长
  475.         appStart.setLoading_time(rand.nextInt(20) + "");
  476.         // 失败码
  477.         flag = rand.nextInt(10);
  478.         switch (flag) {
  479.             case 1:
  480.                 appStart.setDetail("102");
  481.                 break;
  482.             case 2:
  483.                 appStart.setDetail("201");
  484.                 break;
  485.             case 3:
  486.                 appStart.setDetail("325");
  487.                 break;
  488.             case 4:
  489.                 appStart.setDetail("433");
  490.                 break;
  491.             case 5:
  492.                 appStart.setDetail("542");
  493.                 break;
  494.             default:
  495.                 appStart.setDetail("");
  496.                 break;
  497.         }
  498.         // 扩展字段
  499.         appStart.setExtend1("");
  500.         return appStart;
  501.     }
  502.     /**
  503.      * 消息通知
  504.      */
  505.     private static JSONObject generateNotification() {
  506.         AppNotification appNotification = new AppNotification();
  507.         int flag = rand.nextInt(4) + 1;
  508.         // 动作
  509.         appNotification.setAction(flag + "");
  510.         // 通知id
  511.         flag = rand.nextInt(4) + 1;
  512.         appNotification.setType(flag + "");
  513.         // 客户端弹时间
  514.         appNotification.setAp_time((System.currentTimeMillis() - rand.nextInt(99999999)) + "");
  515.         // 备用字段
  516.         appNotification.setContent("");
  517.         JSONObject jsonObject = (JSONObject) JSON.toJSON(appNotification);
  518.         return packEventJson("notification", jsonObject);
  519.     }
  520.     /**
  521.      * 后台活跃
  522.      */
  523.     private static JSONObject generateBackground() {
  524.         AppActive_background appActive_background = new AppActive_background();
  525.         // 启动源
  526.         int flag = rand.nextInt(3) + 1;
  527.         appActive_background.setActive_source(flag + "");
  528.         JSONObject jsonObject = (JSONObject) JSON.toJSON(appActive_background);
  529.         return packEventJson("active_background", jsonObject);
  530.     }
  531.     /**
  532.      * 错误日志数据
  533.      */
  534.     private static JSONObject generateError() {
  535.         AppErrorLog appErrorLog = new AppErrorLog();
  536.         String[] errorBriefs = {"at cn.lift.dfdf.web.AbstractBaseController.validInbound(AbstractBaseController.java:72)", "at cn.lift.appIn.control.CommandUtil.getInfo(CommandUtil.java:67)"};        //错误摘要
  537.         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"};        //错误详情
  538.         //错误摘要
  539.         appErrorLog.setErrorBrief(errorBriefs[rand.nextInt(errorBriefs.length)]);
  540.         //错误详情
  541.         appErrorLog.setErrorDetail(errorDetails[rand.nextInt(errorDetails.length)]);
  542.         JSONObject jsonObject = (JSONObject) JSON.toJSON(appErrorLog);
  543.         return packEventJson("error", jsonObject);
  544.     }
  545.     /**
  546.      * 为各个事件类型的公共字段(时间、事件类型、Json数据)拼接
  547.      */
  548.     private static JSONObject packEventJson(String eventName, JSONObject jsonObject) {
  549.         JSONObject eventJson = new JSONObject();
  550.         eventJson.put("ett", (System.currentTimeMillis() - rand.nextInt(99999999)) + "");
  551.         eventJson.put("en", eventName);
  552.         eventJson.put("kv", jsonObject);
  553.         return eventJson;
  554.     }
  555.     /**
  556.      * 获取随机字母组合
  557.      *
  558.      * @param length 字符串长度
  559.      */
  560.     private static String getRandomChar(Integer length) {
  561.         StringBuilder str = new StringBuilder();
  562.         Random random = new Random();
  563.         for (int i = 0; i < length; i++) {
  564.             // 字符串
  565.             str.append((char) (65 + random.nextInt(26)));// 取得大写字母
  566.         }
  567.         return str.toString();
  568.     }
  569.     /**
  570.      * 获取随机字母数字组合
  571.      *
  572.      * @param length 字符串长度
  573.      */
  574.     private static String getRandomCharAndNumr(Integer length) {
  575.         StringBuilder str = new StringBuilder();
  576.         Random random = new Random();
  577.         for (int i = 0; i < length; i++) {
  578.             boolean b = random.nextBoolean();
  579.             if (b) { // 字符串
  580.                 // int choice = random.nextBoolean() ? 65 : 97; 取得65大写字母还是97小写字母
  581.                 str.append((char) (65 + random.nextInt(26)));// 取得大写字母
  582.             } else { // 数字
  583.                 str.append(String.valueOf(random.nextInt(10)));
  584.             }
  585.         }
  586.         return str.toString();
  587.     }
  588.     /**
  589.      * 收藏
  590.      */
  591.     private static JSONObject generateFavorites() {
  592.         AppFavorites favorites = new AppFavorites();
  593.         favorites.setCourse_id(rand.nextInt(10));
  594.         favorites.setUserid(rand.nextInt(10));
  595.         favorites.setAdd_time((System.currentTimeMillis() - rand.nextInt(99999999)) + "");
  596.         JSONObject jsonObject = (JSONObject) JSON.toJSON(favorites);
  597.         return packEventJson("favorites", jsonObject);
  598.     }
  599.     /**
  600.      * 点赞
  601.      */
  602.     private static JSONObject generatePraise() {
  603.         AppPraise praise = new AppPraise();
  604.         praise.setId(rand.nextInt(10));
  605.         praise.setUserid(rand.nextInt(10));
  606.         praise.setTarget_id(rand.nextInt(10));
  607.         praise.setType(rand.nextInt(4) + 1);
  608.         praise.setAdd_time((System.currentTimeMillis() - rand.nextInt(99999999)) + "");
  609.         JSONObject jsonObject = (JSONObject) JSON.toJSON(praise);
  610.         return packEventJson("praise", jsonObject);
  611.     }
  612.     /**
  613.      * 评论
  614.      */
  615.     private static JSONObject generateComment() {
  616.         AppComment comment = new AppComment();
  617.         comment.setComment_id(rand.nextInt(10));
  618.         comment.setUserid(rand.nextInt(10));
  619.         comment.setP_comment_id(rand.nextInt(5));
  620.         comment.setContent(getCONTENT());
  621.         comment.setAddtime((System.currentTimeMillis() - rand.nextInt(99999999)) + "");
  622.         comment.setOther_id(rand.nextInt(10));
  623.         comment.setPraise_count(rand.nextInt(1000));
  624.         comment.setReply_count(rand.nextInt(200));
  625.         JSONObject jsonObject = (JSONObject) JSON.toJSON(comment);
  626.         return packEventJson("comment", jsonObject);
  627.     }
  628.     /**
  629.      * 生成单个汉字
  630.      */
  631.     private static char getRandomChar() {
  632.         String str = "";
  633.         int hightPos; //
  634.         int lowPos;
  635.         Random random = new Random();
  636.         //随机生成汉子的两个字节
  637.         hightPos = (176 + Math.abs(random.nextInt(39)));
  638.         lowPos = (161 + Math.abs(random.nextInt(93)));
  639.         byte[] b = new byte[2];
  640.         b[0] = (Integer.valueOf(hightPos)).byteValue();
  641.         b[1] = (Integer.valueOf(lowPos)).byteValue();
  642.         try {
  643.             str = new String(b, "GBK");
  644.         } catch (UnsupportedEncodingException e) {
  645.             e.printStackTrace();
  646.             System.out.println("错误");
  647.         }
  648.         return str.charAt(0);
  649.     }
  650.     /**
  651.      * 拼接成多个汉字
  652.      */
  653.     private static String getCONTENT() {
  654.         StringBuilder str = new StringBuilder();
  655.         for (int i = 0; i < rand.nextInt(100); i++) {
  656.             str.append(getRandomChar());
  657.         }
  658.         return str.toString();
  659.     }
  660. }
复制代码

5)配置日志打印Logback
简介:Logback主要用于在磁盘和控制台打印日志
使用
  • 1)在resource文件夹下创建logback.xml文件
  • 2)在logback.xml文件添加如下配置
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration debug="false">
  3.     <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径 -->
  4.     <property name="LOG_HOME" value="/opt/tmp/logs"/>
  5.     <!-- 控制台输出 -->
  6.     <appender name="STDOUT"
  7.               class="ch.qos.logback.core.ConsoleAppender">
  8.         <encoder
  9.                 class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
  10.             <!--格式化输出:%d 表示日期,%thread 表示线程名,%-5level:级别从左显示 5 个字符宽度%msg:
  11.             日志消息,%n 是换行符 -->
  12.             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
  13.         </encoder>
  14.     </appender>
  15.     <!-- 按照每天生成日志文件。存储事件日志 -->
  16.     <appender name="FILE"
  17.               class="ch.qos.logback.core.rolling.RollingFileAppender">
  18.         <!-- <File>${LOG_HOME}/app.log</File>设置日志不超过${log.max.size}时的保存路径,注意,
  19.         如果是 web 项目会保存到 Tomcat 的 bin 目录 下 -->
  20.         <rollingPolicy
  21.                 class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  22.             <!--日志文件输出的文件名 -->
  23.             <FileNamePattern>${LOG_HOME}/app-%d{yyyy-MM-dd}.log</FileNamePattern>
  24.             <!--日志文件保留天数 -->
  25.             <MaxHistory>30</MaxHistory>
  26.         </rollingPolicy>
  27.         <encoder
  28.                 class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
  29.             <pattern>%msg%n</pattern>
  30.         </encoder>
  31.         <!--日志文件最大的大小 -->
  32.         <triggeringPolicy
  33.                 class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
  34.             <MaxFileSize>10MB</MaxFileSize>
  35.         </triggeringPolicy>
  36.     </appender>
  37.     <!--异步打印日志-->
  38.     <appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
  39.         <!-- 不丢失日志.默认的,如果队列的 80%已满,则会丢弃 TRACT、DEBUG、INFO 级别的日志 -->
  40.         <discardingThreshold>0</discardingThreshold>
  41.         <!-- 更改默认的队列的深度,该值会影响性能.默认值为 256 -->
  42.         <queueSize>512</queueSize>
  43.         <!-- 添加附加的 appender,最多只能添加一个 -->
  44.         <appender-ref ref="FILE"/>
  45.     </appender>
  46.     <!-- 日志输出级别 -->
  47.     <root level="INFO">
  48.         <appender-ref ref="STDOUT"/>
  49.         <appender-ref ref="ASYNC_FILE"/>
  50.         <appender-ref ref="error"/>
  51.     </root>
  52. </configuration>
复制代码
6.代码整体架构
2020-09-09_230557.jpg

7.项目打包准备后续放在服务器上运行产生测试数据

作者:together
来源:https://together.blog.csdn.net/article/details/105805852

最新经典文章,欢迎关注公众号

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条