我们可以使用log4j来创build基于级别的日志文件

我创build了一个应用程序,使用log4j将所有基于级别的日志存储在单个文件中,但在当前情况下,单个文件将保存所有级别的日志,如ALL,INFO,ERROR,FATAL,WARN,DEBUG等。 。因为在我的应用程序中,我有一个选项说一个select框,当我select错误,那么它应该只显示错误日志,如果我select信息,那么它应该只有INFO日志。

我正在parsing日志文件以获取基于特定级别的相应日志,但在这种情况下,如果日志文件非常大,则需要更多时间。

我想到的一个解决scheme是为每个级别维护单独的日志文件,以便我们可以避免分析

想知道大家对此的想法。 如果这是好的,我们如何重新定向基于级别的日志来分隔日志文件,如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 

parsing方法如下所示

 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(); 

如果你使用org.apache.log4j.varia.LevelRangeFilter ,你可以按如下操作(对于INFOERROR ):

 # 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 

连接到Log4J的默认假设是,只要您关心某个级别的消息(例如INFO),那么您也会关心更重要的消息(例如ERROR)。 您可以在appenders上设置记录器和阈值级别,以过滤掉低于某个重要级别的消息,但是如果要将INFO消息发送(例如)INFO消息到特定的appender,而不是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>