这两天的主要工作是用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.properties`或`log4j.xml`配置文件,用于定义日志行为。例如: ```properties # log4j.properties 示例 log4j.rootLogger=DEBUG, stdout, FILE log4j.appender.stdout=org....
git-chglog 用 Go (Golang) 实现的 CHANGELOG 生成器。 随时随地编写您的 CHANGELOG。目录git-chglog目录特征工作原理入门安装Homebrew(适用于 macOS 用户)Scoop(适用于 Windows 用户)安省Go 用户Docker测试安装...
Log4j是Apache的一个开源项目,提供了一种灵活且强大的日志记录解决方案。在Tomcat中配置Log4j,可以实现按照文件大小生成日志文件,如`catalina.out`,从而避免单个日志文件过大导致的管理不便。 首先,我们需要...
《log4qt在Visual Studio中的应用与源码解析》 log4qt是Qt平台上的一款日志记录框架,它是Apache log4j的Qt版本,适用于C++...总之,log4qt为VS中的C++开发提供了强大的日志管理工具,值得每个开发者深入了解和掌握。
1. **根据日期生成文件**:每个日期生成一个独立的日志文件。 2. **按日志级别(INFO、ERROR)分别记录**:INFO级别的日志记录在一个文件中,ERROR级别的日志记录在另一个文件中。 #### 三、具体配置分析 ##### 1. ...
因此,通过设置一个包含目录结构的`File`路径,可以实现动态生成文件夹。例如: ```xml <appender name="RollingFileAppender" class="org.apache.log4j.RollingFileAppender"> ...
这段配置中,我们定义了一个名为"RollingFileAppender"的滚动文件追加器,设置日志文件存储路径为"logs"目录下的"log.txt",并按照日期(年-月-日)滚动生成新的日志文件。`datePattern`属性指定了文件名格式,`...
Koa项目生成器,通常是一个Yeoman生成器(generator),它能够自定义配置并自动化创建项目文件结构,包括但不限于以下内容: - 初始化package.json文件,包含项目依赖、脚本等信息。 - 创建基本的目录结构,如src、...
总结来说,g3log是一个强大且可靠的日志管理系统,尤其适合需要高性能和稳定性的C++项目。尽管其接口可能需要适应,但通过适当的封装和配置,可以将其转化为非常适合项目需求的解决方案。无论是开发还是维护阶段,g3...
本文将详细介绍如何在C++项目中整合`spdlog`,创建一个`message`类来包装日志功能,并读取外部配置文件以实现灵活的日志管理。 首先,`spdlog`库提供了多种日志级别(如`trace`, `debug`, `info`, `warn`, `error`,...
Log4cpp 是一个流行的开源日志库,尤其适用于 C++ 开发者,它提供了丰富的功能,使开发者能够方便地在程序中生成和管理日志文件。本文将详细介绍如何在 Windows 和 Linux 系统中使用 Log4cpp 库来实现日志功能。 **...
解压“log4j.zip”后,我们通常会找到一个名为“log4j.properties”或“log4j.xml”的配置文件,这是Log4j的核心配置文件。例如,以下是一个简单的配置示例: ```properties # log4j.properties log4j.rootLogger=...
还有,为了性能考虑,可以考虑使用异步日志器,这可以通过引入`log4j2`的异步组件实现。 总的来说,Log4j提供了一种灵活、强大的日志解决方案,它可以帮助开发者在Tomcat环境中方便地管理和调试应用程序。通过适当...
Log4j是Apache软件基金会开发的一个开源项目,主要用于日志记录。它为Java应用程序提供了一种灵活的日志系统,能够方便地控制日志信息的输出级别、格式以及目的地。Log4j的核心价值在于其可配置性,使得开发者可以...
2. **日志记录器**:在Java代码中,我们通过`Logger`类创建一个特定的记录器对象,用于记录不同模块的日志。例如: ```java import org.apache.log4j.Logger; public class MyClass { private static final ...
Swagger3是一个强大的API文档生成工具,它可以自动生成RESTful API接口的文档,便于开发者理解和使用。在SpringBoot项目中集成Swagger3,我们可以使用`springfox-swagger2`和`springfox-swagger-ui`库,通过注解来...
在"Log4Sql"这个项目中,很可能提供了一个轻量级的日志记录类库,它可以与SQL数据库配合,方便地将日志信息存储并分析。对于初学者来说,这个源码可以帮助理解如何在C#项目中实现日志记录和分析的基本流程,同时也...
本文将通过一个具体的实例,详细解释如何在WebLogic环境中集成并使用Log4j生成日志文件。 首先,我们需要理解Log4j的基本组件。Log4j主要由三个部分组成:配置器(Configuration)、日志器(Logger)和布局器...
**log4net 使用代码配置详解...在提供的`Log4NetTest2010`压缩包中,可能包含了一个简单的示例项目,展示了如何在实际应用中使用上述代码配置方法。通过研究这个项目,你可以更深入地理解`log4net`的代码配置工作原理。
由于log4j本身并不直接支持Android,我们可以使用log4android,这是一个专门为Android平台设计的log4j实现。在`build.gradle`文件中,添加以下依赖: ```groovy dependencies { implementation '...