我使用log4j创建了一个应用程序,用于将所有基于级别的日志存储在单个文件中,但在当前情况下,单个文件将保存所有级别日志,例如ALL,INFO,ERROR,FATAL,WARN,DEBUG等...因为在我的应用程序中我有一个选项说一个选择框,当我选择ERROR时,它应该只显示错误日志,如果我选择INFO那么它应该只有INFO日志。
我正在解析日志文件以根据特定级别获取相应的日志,但在这种情况下,如果日志文件非常大,则需要更多时间。
我想到的一个解决方案是为每个级别维护单独的日志文件,以便我们可以避免解析
想知道大家对此的看法。如果这很好,我们怎样才能将基于级别的日志重定向到单独的日志文件,如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();
答案 0 :(得分:3)
如果您使用org.apache.log4j.varia.LevelRangeFilter
,则可以执行以下操作(适用于INFO
和ERROR
):
# LOG4J configuration
log4j.rootLogger=DEBUG, OnlyInfo, OnlyError
# Only INFO
log4j.appender.OnlyInfo=org.apache.log4j.FileAppender
log4j.appender.OnlyInfo.File=${appRootPath}/WEB-INF/logs/info.log
log4j.appender.OnlyInfo.File=logs/info.log
log4j.appender.OnlyInfo.layout=org.apache.log4j.PatternLayout
log4j.appender.OnlyInfo.layout.ConversionPattern=%d [%t] %-7p %10c{1} - %m%n
log4j.appender.OnlyInfo.filter.A=org.apache.log4j.varia.LevelRangeFilter
log4j.appender.OnlyInfo.filter.A.LevelMin=INFO
log4j.appender.OnlyInfo.filter.A.LevelMax=INFO
log4j.appender.OnlyInfo.filter.A.AcceptOnMatch=true
# Only ERROR
log4j.appender.OnlyError=org.apache.log4j.FileAppender
log4j.appender.OnlyError.File=${appRootPath}/WEB-INF/logs/error.log
log4j.appender.OnlyError.layout=org.apache.log4j.PatternLayout
log4j.appender.OnlyError.layout.ConversionPattern=%d [%t] %-7p %10c{1} - %m%n
log4j.appender.OnlyError.filter.A=org.apache.log4j.varia.LevelRangeFilter
log4j.appender.OnlyError.filter.A.LevelMin=ERROR
log4j.appender.OnlyError.filter.A.LevelMax=ERROR
log4j.appender.OnlyError.filter.A.AcceptOnMatch=true
答案 1 :(得分:1)
连接到Log4J的默认假设是,只要您关心某个级别的消息(例如INFO),您也会关注更重要的消息(例如ERROR)。您可以在追加器上设置记录器和阈值的级别,以过滤低于某个重要级别的消息,但是如果您想将INFO消息发送到特定的追加者而不是WARN,ERROR和FATAL,那么唯一的方法就是这是通过应用过滤器。
属性配置机制不支持过滤器,因此您必须切换到log4j.xml
配置样式。以下配置示例取自Log4J wiki:
<appender name="info-out" class="org.apache.log4j.FileAppender">
<param name="File" value="info.log"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%m%n"/>
</layout>
<filter class="org.apache.log4j.varia.LevelMatchFilter">
<param name="LevelToMatch" value="info" />
<param name="AcceptOnMatch" value="true"/>
</filter>
<filter class="org.apache.log4j.varia.DenyAllFilter" />
</appender>