我们可以使用log4j拥有基于级别的日志文件

时间:2015-01-22 13:19:01

标签: java apache logging log4j

我使用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();

2 个答案:

答案 0 :(得分:3)

如果您使用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

答案 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>