java 监视日志文件的模式
java monitor log file for a pattern
Java 监视日志文件的模式
大家好,
我需要制作一个程序来监控日志文件(CSV 格式)中每一行的特定字符串。如果字符串出现在日志行中,我想解析日志行并从该行中提取一个字符串。我想使用这个字符串进行进一步的操作(查找本地 sqlite 数据库,使用 API 更新其他系统)但我已经完成了所有这些操作才能处理该部分。
我需要在 "listening" 状态下连续监控,例如 tail -f | grep -i "pattern".
我一直在寻找选项,到目前为止找到了这个。
https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/input/Tailer.html
但我不确定如何使用 java.util.regex 过滤输出。*
我正在寻找最简单的替代方法来完成这项工作。任何人都可以提供更好的替代方案或一些关于如何使用 apache commons Tailer 的指导吗?
以下示例使用 Java 的 WatchService 来注册目录侦听器。每当监视的文件发生变化时,都会读取文件,跳过任何先前读取的内容。它使用正则表达式匹配进入的新行,寻找关键字。在这种情况下 "WARN|ERROR".
包 com.example;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Pattern;
public class LogScanner
{
Path logFile = Paths.get("app.log");
private int lines = 0;
private int characters = 0;
public static void main(String[] args)
{
new LogScanner().run();
}
public void run()
{
try {
WatchService watcher = FileSystems.getDefault().newWatchService();
try (BufferedReader in = new BufferedReader(new FileReader(logFile.toFile()))) {
String line;
while ((line = in.readLine()) != null) {
lines++;
characters += line.length() + System.lineSeparator().length();
}
}
logFile.toAbsolutePath().getParent().register(watcher, StandardWatchEventKinds.ENTRY_MODIFY);
do {
WatchKey key = watcher.take();
System.out.println("Waiting...");
for (WatchEvent<?> event : key.pollEvents()) {
WatchEvent<Path> pathEvent = (WatchEvent<Path>) event;
Path path = pathEvent.context();
if (path.equals(logFile)) {
try (BufferedReader in = new BufferedReader(new FileReader(pathEvent.context().toFile()))) {
String line;
Pattern p = Pattern.compile("WARN|ERROR");
in.skip(characters);
while ((line = in.readLine()) != null) {
lines++;
characters += line.length() + System.lineSeparator().length();
if (p.matcher(line).find()) {
// Do something
System.out.println(line);
}
}
}
}
}
key.reset();
} while (true);
} catch (IOException | InterruptedException ex) {
Logger.getLogger(LogScanner.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
}
}
}
Java 监视日志文件的模式
大家好,
我需要制作一个程序来监控日志文件(CSV 格式)中每一行的特定字符串。如果字符串出现在日志行中,我想解析日志行并从该行中提取一个字符串。我想使用这个字符串进行进一步的操作(查找本地 sqlite 数据库,使用 API 更新其他系统)但我已经完成了所有这些操作才能处理该部分。
我需要在 "listening" 状态下连续监控,例如 tail -f | grep -i "pattern".
我一直在寻找选项,到目前为止找到了这个。 https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/input/Tailer.html
但我不确定如何使用 java.util.regex 过滤输出。*
我正在寻找最简单的替代方法来完成这项工作。任何人都可以提供更好的替代方案或一些关于如何使用 apache commons Tailer 的指导吗?
以下示例使用 Java 的 WatchService 来注册目录侦听器。每当监视的文件发生变化时,都会读取文件,跳过任何先前读取的内容。它使用正则表达式匹配进入的新行,寻找关键字。在这种情况下 "WARN|ERROR".
包 com.example;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Pattern;
public class LogScanner
{
Path logFile = Paths.get("app.log");
private int lines = 0;
private int characters = 0;
public static void main(String[] args)
{
new LogScanner().run();
}
public void run()
{
try {
WatchService watcher = FileSystems.getDefault().newWatchService();
try (BufferedReader in = new BufferedReader(new FileReader(logFile.toFile()))) {
String line;
while ((line = in.readLine()) != null) {
lines++;
characters += line.length() + System.lineSeparator().length();
}
}
logFile.toAbsolutePath().getParent().register(watcher, StandardWatchEventKinds.ENTRY_MODIFY);
do {
WatchKey key = watcher.take();
System.out.println("Waiting...");
for (WatchEvent<?> event : key.pollEvents()) {
WatchEvent<Path> pathEvent = (WatchEvent<Path>) event;
Path path = pathEvent.context();
if (path.equals(logFile)) {
try (BufferedReader in = new BufferedReader(new FileReader(pathEvent.context().toFile()))) {
String line;
Pattern p = Pattern.compile("WARN|ERROR");
in.skip(characters);
while ((line = in.readLine()) != null) {
lines++;
characters += line.length() + System.lineSeparator().length();
if (p.matcher(line).find()) {
// Do something
System.out.println(line);
}
}
}
}
}
key.reset();
} while (true);
} catch (IOException | InterruptedException ex) {
Logger.getLogger(LogScanner.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
}
}
}