`
lettoo
  • 浏览: 35330 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
博客专栏
58ccff5b-5ca6-387a-9c99-a277f31a9e51
我和Java数据库操作的那...
浏览量:9513
社区版块
存档分类
最新评论

一个Log生成工具小项目的实现

 
阅读更多
    这两天的主要工作是用java写一个log生成工具,用于大数据量的测试。写这个工具,使用了:
  • Spring RMI:用于启动、关闭工具
  • Commons-logging + log4j,用于写log,其中重新实现了RollingFileAppender用于自定义log文件名
  • Math.random以及Ramdon,用于生成随机的数据
  • ScheduledThreadPoolExecutor用于多线程定时执行一些job,每个job负责生成相应的log文件
  • 泛型,每种log的生成器在运行时决定是哪一种log
  • Maven assembly plugin,用于打包,打成一个.zip包,解开后,运行里面的shell(linux下)或者bat(windows下)即可以运行
  • Windows bat的写法,用于写在windows下可执行bat文件


1. Spring RMI应用,在我的另外一篇文章中有介绍,而且工具也采用那个后台server框架。一个简单的JAVA后台程序框架

2. Commons-logging + log4j,这块没什么好讲的,自定义log文件名这一块详见自定义log4j生成的log文件名

3. 随机数的生成
3.1 在一个指定范围内生成随机整数
    public static final long getRandomNumber(long begin, long end) {
        return (long) (begin + (end - begin) * Math.random());
    }

3.2 生成指定长度的字符串
    public static final String randomString(int length) {
        if (length < 1) {
            return null;
        }
        if (randGen == null) {
            synchronized (initLock) {
                if (randGen == null) {
                    randGen = new Random();
                    numbersAndLetters = ("0123456789abcdefghijklmnopqrstuvwxyz"
                            + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ")
                            .toCharArray();
                }
            }
        }
        char[] randBuffer = new char[length];
        for (int i = 0; i < randBuffer.length; i++) {
            randBuffer[i] = numbersAndLetters[randGen.nextInt(71)];
        }
        return new String(randBuffer);
    }


4. ScheduledThreadPoolExecutor
    主要是使用其scheduleAtFixedRate方法。
引用

Creates and executes a periodic action that becomes enabled first after the given initial delay, and subsequently with the given period; that is executions will commence after initialDelay then initialDelay+period, then initialDelay + 2 * period, and so on. If any execution of the task encounters an exception, subsequent executions are suppressed. Otherwise, the task will only terminate via cancellation or termination of the executor. If any execution of this task takes longer than its period, then subsequent executions may start late, but will not concurrently execute.


5. 泛型主要是我有不同的log,而且我有通用的接口方法和实现这个接口的Abstract类,在运行的时候才知道具体是哪种log生成器
public interface QosLogTool<T> extends Runnable {

    boolean isBatchMode();
    
    T getRandomQosLog();

    void setDelay(long delay);
    
    void setInterval(long interval);
    
    long getDelay();

    long getInterval();
}

public abstract class AbstractQosLogTool<T> implements QosLogTool<T> {

    protected boolean batchMode = false;


    public boolean isBatchMode() {
        return batchMode;
    }

    public void setBatchMode(boolean batchMode) {
        this.batchMode = batchMode;
    }

    protected int batchSize = 100;

    public int getBatchSize() {
        return batchSize;
    }

    public void setBatchSize(int batchSize) {
        this.batchSize = batchSize;
    }
    
    private long delay = 1000;
    
    public long getDelay() {
        return delay;
    }

    public void setDelay(long delay) {
        this.delay = delay;
    }
    
    private long interval = 5000;
    
    public long getInterval() {
        return interval;
    }

    public void setInterval(long interval) {
        this.interval = interval;
    }

    public void run() {
        if (isBatchMode() && batchSize > 0) {
            for (int i = 0; i < batchSize; i++) {
                printLog();
            }
        } else {
            printLog();
        }
    }

    protected abstract void printLog();

}

这样具体的log生成器只需要实现其printLog()和 getRandomQosLog()方法就可以了。

6. Maven assembly plugin,这个plugin非常方便生成直接可以运行的包,在pom.xml设置如下:
          <plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-assembly-plugin</artifactId>
				<configuration>
					<archive>
						<manifest>
						    <!-- 这里指定主程序入口 -->
							<mainClass>cn.lettoo.test.Launcher</mainClass>
						</manifest>
					</archive>
					<descriptors>
					    <!-- 这里指定装配文件 -->
						<descriptor>src/main/assembly/assembly.xml</descriptor>
					</descriptors>
				</configuration>
				<executions>
					<execution>
						<id>make-assembly</id>
						<phase>package</phase>
						<goals>
							<goal>single</goal>
						</goals>
					</execution>
				</executions>
			</plugin>


assembly.xml为装配文件
<assembly>
    <id>bin</id>
    <formats>
        <!-- 指定打zip包 -->
        <format>zip</format>
    </formats>
    <dependencySets>
        <dependencySet>
            <!-- copy jar文件到lib目录 -->
            <useProjectArtifact>true</useProjectArtifact>
            <outputDirectory>lib</outputDirectory>
        </dependencySet>
    </dependencySets>
    <!-- 下面主要是copy README.txt,以及配置文件到conf目录,还有运行脚本 -->
    <fileSets>
        <fileSet>
            <outputDirectory>/</outputDirectory>
            <includes>
                <include>README.txt</include>
            </includes>
        </fileSet>
        <fileSet>
            <directory>src/main/scripts</directory>
            <outputDirectory>/</outputDirectory>
        </fileSet>
        <fileSet>
            <directory>src/main/resources</directory>
            <outputDirectory>/conf</outputDirectory>
            <includes>
                <include>*.xml</include>
                <include>*.properties</include>
            </includes>
        </fileSet>
    </fileSets>
</assembly>


7. Windows下写一个bat文件直接运行,和linux shell一样,主要是对lib目录进行遍历拿到所有的*.jar文件,动态生成classpath,这样不需要以后增加jar后还要修改bat
set CLASSPATH=.;conf
setlocal enabledelayedexpansion
    for %%j in (lib/*.jar) do (
        set CLASSPATH=!CLASSPATH!;lib\%%j
    ) 
endlocal 

这里通过一个for循环来读取lib目录下所有的*.jar文件,并且加到classpath中去,linux shell是这样写的:
CLASSPATH=.:conf
for file in lib/*.jar;
do
   CLASSPATH=${CLASSPATH}:$file;
done
分享到:
评论

相关推荐

    log4j示例项目

    在Log4j项目中,通常会有一个`log4j.properties`或`log4j.xml`配置文件,用于定义日志行为。例如: ```properties # log4j.properties 示例 log4j.rootLogger=DEBUG, stdout, FILE log4j.appender.stdout=org....

    tomcat下用Log4j 按文件大小,生成catalina.out日志文件

    Log4j是Apache的一个开源项目,提供了一种灵活且强大的日志记录解决方案。在Tomcat中配置Log4j,可以实现按照文件大小生成日志文件,如`catalina.out`,从而避免单个日志文件过大导致的管理不便。 首先,我们需要...

    log4qtVS项目文件和源码和生成的静态库

    《log4qt在Visual Studio中的应用与源码解析》 log4qt是Qt平台上的一款日志记录框架,它是Apache log4j的Qt版本,适用于C++...总之,log4qt为VS中的C++开发提供了强大的日志管理工具,值得每个开发者深入了解和掌握。

    log4net 配置 根据日期生成 文件 根据 分类 (INFO、ERROR) 生成文件

    1. **根据日期生成文件**:每个日期生成一个独立的日志文件。 2. **按日志级别(INFO、ERROR)分别记录**:INFO级别的日志记录在一个文件中,ERROR级别的日志记录在另一个文件中。 #### 三、具体配置分析 ##### 1. ...

    log4j生成文件及文件夹

    因此,通过设置一个包含目录结构的`File`路径,可以实现动态生成文件夹。例如: ```xml &lt;appender name="RollingFileAppender" class="org.apache.log4j.RollingFileAppender"&gt; ...

    Wpf log4net 日志

    这段配置中,我们定义了一个名为"RollingFileAppender"的滚动文件追加器,设置日志文件存储路径为"logs"目录下的"log.txt",并按照日期(年-月-日)滚动生成新的日志文件。`datePattern`属性指定了文件名格式,`...

    Node.js-koa项目生成器

    Koa项目生成器,通常是一个Yeoman生成器(generator),它能够自定义配置并自动化创建项目文件结构,包括但不限于以下内容: - 初始化package.json文件,包含项目依赖、脚本等信息。 - 创建基本的目录结构,如src、...

    g3log 日志管理

    总结来说,g3log是一个强大且可靠的日志管理系统,尤其适合需要高性能和稳定性的C++项目。尽管其接口可能需要适应,但通过适当的封装和配置,可以将其转化为非常适合项目需求的解决方案。无论是开发还是维护阶段,g3...

    c++使用spdlog整合读取配置文件使用

    本文将详细介绍如何在C++项目中整合`spdlog`,创建一个`message`类来包装日志功能,并读取外部配置文件以实现灵活的日志管理。 首先,`spdlog`库提供了多种日志级别(如`trace`, `debug`, `info`, `warn`, `error`,...

    Log4cpp 在程序中生成日志文件

    Log4cpp 是一个流行的开源日志库,尤其适用于 C++ 开发者,它提供了丰富的功能,使开发者能够方便地在程序中生成和管理日志文件。本文将详细介绍如何在 Windows 和 Linux 系统中使用 Log4cpp 库来实现日志功能。 **...

    log4j.zip 项目日志

    解压“log4j.zip”后,我们通常会找到一个名为“log4j.properties”或“log4j.xml”的配置文件,这是Log4j的核心配置文件。例如,以下是一个简单的配置示例: ```properties # log4j.properties log4j.rootLogger=...

    Tomcat下使用Log4j接管生成日志文件

    还有,为了性能考虑,可以考虑使用异步日志器,这可以通过引入`log4j2`的异步组件实现。 总的来说,Log4j提供了一种灵活、强大的日志解决方案,它可以帮助开发者在Tomcat环境中方便地管理和调试应用程序。通过适当...

    Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等

    Log4j是Apache软件基金会开发的一个开源项目,主要用于日志记录。它为Java应用程序提供了一种灵活的日志系统,能够方便地控制日志信息的输出级别、格式以及目的地。Log4j的核心价值在于其可配置性,使得开发者可以...

    Web项目中使用Log4j实例

    2. **日志记录器**:在Java代码中,我们通过`Logger`类创建一个特定的记录器对象,用于记录不同模块的日志。例如: ```java import org.apache.log4j.Logger; public class MyClass { private static final ...

    springboot+swagger3+mybatis-plus3.5.1代码生成+druid+log4j2【最完美】的一次配置

    Swagger3是一个强大的API文档生成工具,它可以自动生成RESTful API接口的文档,便于开发者理解和使用。在SpringBoot项目中集成Swagger3,我们可以使用`springfox-swagger2`和`springfox-swagger-ui`库,通过注解来...

    c#log日志类和日志分析器(源码)

    在"Log4Sql"这个项目中,很可能提供了一个轻量级的日志记录类库,它可以与SQL数据库配合,方便地将日志信息存储并分析。对于初学者来说,这个源码可以帮助理解如何在C#项目中实现日志记录和分析的基本流程,同时也...

    weblogic中使用log4j生成日志文件实例

    本文将通过一个具体的实例,详细解释如何在WebLogic环境中集成并使用Log4j生成日志文件。 首先,我们需要理解Log4j的基本组件。Log4j主要由三个部分组成:配置器(Configuration)、日志器(Logger)和布局器...

    log4net使用代码配置,实现动态文件打印

    **log4net 使用代码配置详解...在提供的`Log4NetTest2010`压缩包中,可能包含了一个简单的示例项目,展示了如何在实际应用中使用上述代码配置方法。通过研究这个项目,你可以更深入地理解`log4net`的代码配置工作原理。

    AndroidStudio 使用log4j记录日志,按照大小定期滚动日志Demo

    由于log4j本身并不直接支持Android,我们可以使用log4android,这是一个专门为Android平台设计的log4j实现。在`build.gradle`文件中,添加以下依赖: ```groovy dependencies { implementation '...

    卡片生成器

    在这个“卡片生成器”项目中,我们聚焦于使用ASP.NET来创建一个功能,该功能能够生成具有特定格式和信息的卡片式展示。卡片在Web设计中广泛应用,它们通常用来呈现信息,如用户简介、产品展示或新闻摘要等,以一种...

Global site tag (gtag.js) - Google Analytics