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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 编写Java程序; 执行Java程序; 查看日志结果

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. 不传参数


20190215093837740.png


b. 传一个参数


20190215093925133.png


c. 传两个参数


20190215094037799.png

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. 直接看行数或者刷新就可以看到日志越来越多了,想不到吧!

20190215152212732.png

日志样本:

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


20190215152342129.png

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. wc命令参数:


-c 统计字节数。
-l 统计行数。
-m 统计字符数。这个标志不能与 -c 标志一起使用。
-w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。
-L 打印最长行的长度。
-help 显示帮助信息
--version 显示版本信息 


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
13天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
43 2
|
17天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
125 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
17天前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的控制文件与归档日志文件
本文介绍了Oracle数据库中的控制文件和归档日志文件。控制文件记录了数据库的物理结构信息,如数据库名、数据文件和联机日志文件的位置等。为了保护数据库,通常会进行控制文件的多路复用。归档日志文件是联机重做日志文件的副本,用于记录数据库的变更历史。文章还提供了相关SQL语句,帮助查看和设置数据库的日志模式。
【赵渝强老师】Oracle的控制文件与归档日志文件
|
17天前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
40 2
|
17天前
|
Oracle 关系型数据库 数据库
【赵渝强老师】Oracle的参数文件与告警日志文件
本文介绍了Oracle数据库的参数文件和告警日志文件。参数文件分为初始化参数文件(PFile)和服务器端参数文件(SPFile),在数据库启动时读取并分配资源。告警日志文件记录了数据库的重要活动、错误和警告信息,帮助诊断问题。文中还提供了相关视频讲解和示例代码。
|
25天前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
|
27天前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
36 4
|
29天前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
29天前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
|
2月前
|
人工智能 Oracle Java
解决 Java 打印日志吞异常堆栈的问题
前几天有同学找我查一个空指针问题,Java 打印日志时,异常堆栈信息被吞了,导致定位不到出问题的地方。
36 2