【发布时间】:2015-03-21 07:19:02
【问题描述】:
我使用 log4j 创建了一个应用程序,用于将所有基于级别的日志存储在单个文件中,但在当前情况下,单个文件将保存所有级别日志,例如 ALL、INFO、ERROR、FATAL、WARN、DEBUG等等...因为在我的应用程序中我有一个选项说一个选择框,当我选择错误时,它应该只显示错误日志,如果我选择信息那么它应该只显示信息日志。
我正在解析日志文件以根据特定级别获取适当的日志,但在这种情况下,如果日志文件非常大,则需要更多时间。
我想到的一个解决方案是为每个级别维护单独的日志文件,这样我们就可以避免解析
想知道大家对此的看法。尽管如此,如果这很好,我们如何将基于级别的日志重定向到单独的日志文件,例如 ERROR 日志到 appError.log,INFO 日志到 appInfo.log,以及一个通用日志文件来保存所有基于级别的日志。
我的 log4j.properties 如下所示
# LOG4J configuration
log4j.rootLogger=DEBUG, Appender1, Appender2
log4j.appender.Appender1=org.apache.log4j.ConsoleAppender
log4j.appender.Appender1.layout=org.apache.log4j.PatternLayout
log4j.appender.Appender1.layout.ConversionPattern=%d [%t] %-7p %10c{1} - %m%n
log4j.appender.Appender2=org.apache.log4j.FileAppender
log4j.appender.Appender2.File=${appRootPath}/WEB-INF/logs/LogDemos.log
log4j.appender.Appender2.layout=org.apache.log4j.PatternLayout
log4j.appender.Appender2.layout.ConversionPattern=%d [%t] %-7p %10c{1} - %m%n
解析方法如下图
Scanner scanner = new Scanner(new File(ctx.getRealPath("/")+"/WEB-INF/logs/LogDemos.log"));
while(scanner.hasNext())
{
String level = request.getParameter("level");
String logs = scanner.nextLine();
String regex = "(\\d{4}-\\d{2}-\\d{2}) (\\d{2}:\\d{2}:\\d{2},\\d{3}) \\[(.*)\\] ([^ ]*) +([^ ]*) - (.*)$";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(logs);
if (m.matches() && m.groupCount() == 6) {
String date = m.group(1);
String time = m.group(2);
String threadId = m.group(3);
String priority = m.group(4);
String category = m.group(5);
String message = m.group(6);
if(priority.trim().equalsIgnoreCase(level.trim()))
{
logsList.add(logs);
System.out.println("date: " + date);
System.out.println("time: " + time);
System.out.println("threadId: " + threadId);
System.out.println("priority: " + priority);
System.out.println("category: " + category);
System.out.println("message: " + message);
}
else
{
logsList.add(logs);
}
}
}
session.setAttribute("logs", logsList);
scanner.close();
【问题讨论】:
-
您是否尝试过使用 Splunk 或 Apache Spark 来解析和分析日志?
-
@BorisPavlović no...我正在使用带有正则表达式的简单 java 来解析日志文件,...我已经用该代码更新了我的问题
-
@AlexMan 是的,你是对的,但也许其他一些已经存在的工具会给你一些更好的结果......