Java模拟定时生成日志到文件

教程目录

  • 0x00 教程内容
  • 0x01 编写Java程序
          • 1. 代码
          • 2. 操作要领
  • 0x02 执行Java程序
          • 1. 编辑器方式执行
          • 2. 命令行方式执行
  • 0x03 查看日志结果
          • 1. windows系统
          • 2. mac或者linux系统
  • 0xFF 总结

0x00 教程内容

  1. 编写Java程序
  2. 执行Java程序
  3. 查看日志结果

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. 不传参数
Java模拟定时生成日志到文件_第1张图片
b. 传一个参数
Java模拟定时生成日志到文件_第2张图片
c. 传两个参数
Java模拟定时生成日志到文件_第3张图片

2. 命令行方式执行

a. 先编译(在代码路径下):
javac GenerateLog.java
注意:win系统执行报编码错误,请这样执行:
javac -encoding UTF-8 GenerateLog.java
b. 三种方式执行:
java GenerateLog
java GenerateLog 200
java GenerateLog 50 5

0x03 查看日志结果

1. windows系统

a. 直接看行数或者刷新就可以看到日志越来越多了,想不到吧!
Java模拟定时生成日志到文件_第4张图片
日志样本:

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 总结

  1. 本篇教程为模拟定时生成特定格式的日志文件,所用的知识含括了大量的java se知识,如:数组生成、Random随机生成数字、for循环、substring字符串裁剪、String.format格式化、SimpleDateFormat日期格式转化、"\t"字符串拼接、写文件(覆盖、追加)、args传参数、if条件判断、while循环、字符串转整型,TimeUnit的睡眠、异常抛出或者异常捕获等等。学会此教程再扩展一下,就差不多入门java se了。
  2. 教程使用编辑器和命令行两种方式,分别在windows系统和mac、linux系统实现了代码的编译与执行,开阔了学习的视野。
  3. 此外,本代码也会用python脚本来实现,到时候我们一起通过模拟日志生成来入门python吧。后期会补充,待补充链接
  4. wc命令参数:
-c 统计字节数。
-l 统计行数。
-m 统计字符数。这个标志不能与 -c 标志一起使用。
-w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。
-L 打印最长行的长度。
-help 显示帮助信息
--version 显示版本信息 

作者简介:邵奈一
大学大数据讲师、大学市场洞察者、专栏编辑
公众号、微博、CSDN:邵奈一
本系列课均为本人:邵奈一原创,如转载请标明出处

你可能感兴趣的:(Java项目实战,一篇综合案例各种入门)