0x01 编写Java程序
1. 代码
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Random; import java.util.concurrent.TimeUnit; public class GenerateLog { //url地址 public static String[] url_paths = { "article/112.html", "article/113.html", "article/114.html", "article/115.html", "article/116.html", "article/117.html", "article/118.html", "article/119.html", "video/821", "tag/list" }; //ip数字 public static String[] ip_splices = {"102","71","145","33","67","54","164","121"}; //http网址 public static String[] http_referers = { "https://www.baidu.com/s?wd=%s", "https://www.sogou.com/web?query=%s", "https://cn.bing.com/search?q=%s", "https://search.yahoo.com/search?p=%s" }; //搜索关键字 public static String[] search_keyword = { "复制粘贴玩大数据", "Bootstrap全局css样式的使用", "Elasticsearch的安装(windows)", "Kafka的安装及发布订阅消息系统(windows)", "window7系统上Centos7的安装", "复制粘贴玩大数据系列教程说明", "Docker搭建Spark集群(实践篇)" }; //状态码 public static String[] status_codes = {"200","404","500"}; //随机生成url public static String sample_url(){ int urlNum = new Random().nextInt(10); return url_paths[urlNum]; } //随机生成ip public static String sample_ip(){ int ipNum; String ip = ""; for (int i=0; i<4; i++){ ipNum = new Random().nextInt(8); ip += "."+ip_splices[ipNum]; } return ip.substring(1); } //随机生成检索 public static String sample_referer(){ Random random = new Random(); int refNum = random.nextInt(4); int queryNum = random.nextInt(7); if (random.nextDouble() < 0.2){ return "-"; } String query_str = search_keyword[queryNum]; String referQuery = String.format(http_referers[refNum], query_str); return referQuery; } //随机生成状态码 public static String sample_status_code(){ int codeNum = new Random().nextInt(3); return status_codes[codeNum]; } //格式化时间样式 public static String formatTime(){ DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return dateFormat.format(new Date()); } //生成日志方法 public static String generateLog(){ String url = sample_url(); String ip = sample_ip(); String referer = sample_referer(); String code = sample_status_code(); String newTime = formatTime(); String log = ip+"\t"+newTime+"\t"+"\"GET /"+url+" HTTP/1.1 \""+"\t"+referer+"\t"+code; System.out.println(log); return log; } //主类 public static void main(String[] args) throws IOException, InterruptedException { //dest生成日志的路径 String dest = "D:\\logs.txt"; File file = new File(dest); int num, sleepTime; if (args.length ==0 ){ //默认生成日志条数 num = 100; //默认每10秒生成一次 sleepTime = 10; } else if (args.length == 1){ //传一个参数 num = Integer.valueOf(args[0]); sleepTime = 10; } else { //传两个参数 num = Integer.valueOf(args[0]); sleepTime = Integer.valueOf(args[1]); } while (true){ for (int i=0; i< num; i++){ String content = generateLog()+"\n"; FileOutputStream fos = new FileOutputStream(file, true); fos.write(content.getBytes()); fos.close(); } //默认多久日志时间 TimeUnit.SECONDS.sleep(sleepTime); } } }
2. 操作要领
a. 不传参数时,默认是每10秒生成100条日志,传一个参数时为设置每次生成日志的条数,传两个参数时,第一个为条数,第二个为多少秒生成一次。
b. 不修改路径为生成日志到windows系统的D盘的logs.txt文件,如用mac或者linux,请自行修改日志路径:如:/home/shaonaiyi/logs/logs.txt
0x02 执行Java程序
1. 编辑器方式执行
a. 不传参数
b. 传一个参数
c. 传两个参数
2. 命令行方式执行
a. 先编译(在代码路径下):
javac GenerateLog.java
注意:win系统执行报编码错误,请这样执行:
javac -encoding UTF-8 GenerateLog.java
b. 三种方式执行:
java GenerateLogjava GenerateLog 200
java GenerateLog 50 5
0x03 查看日志结果
1. windows系统
a. 直接看行数或者刷新就可以看到日志越来越多了,想不到吧!
日志样本:
67.54.33.102 2019-02-22 09:06:00 "GET /tag/list HTTP/1.1 " https://search.yahoo.com/search?p=复制粘贴玩大数据 404 121.102.145.54 2019-02-22 09:06:00 "GET /tag/list HTTP/1.1 " https://cn.bing.com/search?q=Elasticsearch的安装(windows) 404 67.121.33.102 2019-02-22 09:06:00 "GET /article/119.html HTTP/1.1 " - 200 71.67.121.33 2019-02-22 09:06:00 "GET /article/119.html HTTP/1.1 " - 200 67.54.54.33 2019-02-22 09:06:00 "GET /video/821 HTTP/1.1 " - 500 71.164.164.145 2019-02-22 09:06:00 "GET /article/113.html HTTP/1.1 " https://cn.bing.com/search?q=Bootstrap全局css样式的使用 500
b. 每10秒大11kb
2. mac或者linux系统
a. 用命令行查看行数
wc -l logs.txt
b. 查看文件大小
c. 用肉眼…
0xFF 总结
- 本篇教程为模拟定时生成特定格式的日志文件,所用的知识含括了大量的java se知识,如:数组生成、Random随机生成数字、for循环、substring字符串裁剪、String.format格式化、SimpleDateFormat日期格式转化、"\t"字符串拼接、写文件(覆盖、追加)、args传参数、if条件判断、while循环、字符串转整型,TimeUnit的睡眠、异常抛出或者异常捕获等等。学会此教程再扩展一下,就差不多入门java se了。
- 教程使用编辑器和命令行两种方式,分别在windows系统和mac、linux系统实现了代码的编译与执行,开阔了学习的视野。
- wc命令参数:
-c 统计字节数。 -l 统计行数。 -m 统计字符数。这个标志不能与 -c 标志一起使用。 -w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。 -L 打印最长行的长度。 -help 显示帮助信息 --version 显示版本信息