我们可以使用log4j的级别根据日志文件 [英] can we have level based log files using log4j

查看:130
本文介绍了我们可以使用log4j的级别根据日志文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经创建使用log4j的存储在一个文件中的所有级别基于日志的应用程序,但在目前的情况下,单一的文件将容纳所有级别的日志,如ALL,INFO,ERROR,FATAL,WARN,DEBUG等...因为在我的应用我有一个选项说一个选择框赖以当我选择错误,那么它应该只显示错误日志,如果我选择信息,然后只宜INFO日志。

我解析日志文件,以获取基于特定级别相应的日志,但在这种情况下说,如果日志文件是非常大的,然后它会花费更多的时间。

我已经想到这个问题的一个解决方案是维护单独的日志文件各个层面,使我们能够避免parsings

想知道大家对这个想法。如果仍然是这样细,我们如何可以重定向基于级别日志,以单独的日志,例如错误日志appError.log,INFO日志appInfo.log,和共同的日志文件,文件保存所有基于级别的日志。

我的 log4j.properties 为如下

给出

 #log4j配置
log4j.rootLogger = DEBUG,Appender1,Appender2log4j.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%Nlog4j.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

解析方法类似于如下图

 扫描仪扫描=新的扫描仪(新File(ctx.getRealPath(/)+/ WEB-INF /日志/ LogDemos.log));
        而(scanner.hasNext())
        {
            串级=的request.getParameter(级别);
            串日志= scanner.nextLine();            串的regex ​​=(\\\\ð{4} - \\\\ð{2} - \\\\ð{2})(\\\\ð{2}:\\\\ð{2}:\\\\ð{2},\\\\ ð{3})\\\\ [(*)\\\\]([^] *)+([^] *) - (*)$。            模式P = Pattern.compile(正则表达式);            匹配M = p.matcher(日志);            如果(m.matches()及&放大器; m.groupCount()== 6){                字符串日期= m.group(1);
                字符串时间= m.group(2);
                字符串的threadId = m.group(3);
                串优先= m.group(4);
                字符串类别= m.group(5);
                字符串消息= m.group(6);
                如果(priority.trim()。equalsIgnoreCase(level.trim()))
                {
                    logsList.add(日志);
                    的System.out.println(日期:+日期);
                    的System.out.println(时间:+时间);
                    的System.out.println(主题ID:+的threadId);
                    的System.out.println(优先级:+优先);
                    的System.out.println(类别:+类);
                    的System.out.println(消息:+消息);
                }
                其他
                {
                    logsList.add(日志);
                }
            }        }
        session.setAttribute(日志,logsList);
        scanner.close();


解决方案

如果您使用的 org.apache.log4j.varia.LevelRangeFilter ,你可以做如下(为信息错误

 #log4j配置
log4j.rootLogger = DEBUG,OnlyInfo,OnlyError#只INFO
log4j.appender.OnlyInfo = org.apache.log4j.FileAppender
log4j.appender.OnlyInfo.File = $ {} appRootPath /WEB-INF/logs/info.log
log4j.appender.OnlyInfo.File =日志/ 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 =真#唯一的错误
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 =错误
log4j.appender.OnlyError.filter.A.LevelMax =错误
log4j.appender.OnlyError.filter.A.AcceptOnMatch =真

I have created an application using log4j for storing all the level based logs in a single file, but in the current case the single file will hold all the level logs, such as ALL, INFO, ERROR, FATAL, WARN, DEBUG etc... since in my application i am having an option say a select box upon which when i select ERROR, then it should show only error logs, if i select INFO then it should only INFO logs.

I am parsing the logs file to get the appropriate logs based on a particular level, but in this case say if the log file is very big then it will take more time.

One solution which i have thought for this is to maintain separate log files for each levels, so that we can avoid parsings

Like to know everyone's thought on this. Still if this is fine how can we redirect level based logs to separate log file like ERROR logs to appError.log, INFO logs to appInfo.log, and a common log file to hold all the level based logs.

My log4j.properties is as given below

# 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

The parsing method is like as shown below

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

解决方案

If you use org.apache.log4j.varia.LevelRangeFilter, you can do as follows (for INFO and 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

这篇关于我们可以使用log4j的级别根据日志文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆