zoukankan      html  css  js  c++  java
  • log4j.xml配置,包含自定义log4j日志级别及输出日志到不同文件

     

    一、配置

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
    
    <log4j:configuration>
    
        <!-- 将日志信息输出到控制台 -->
        <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
            <!-- 设置日志输出的样式 -->
            <layout class="org.apache.log4j.PatternLayout">
                <!-- 设置日志输出的格式 -->
                <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
            </layout>
            <!--过滤器设置输出的级别-->
            <filter class="org.apache.log4j.varia.LevelRangeFilter">
                <!-- 设置日志输出的最小级别 -->
                <param name="levelMin" value="WARN" />
                <!-- 设置日志输出的最大级别 -->
                <param name="levelMax" value="ERROR" />
                <!-- 设置日志输出的xxx,默认是false -->
                <param name="AcceptOnMatch" value="true" />
            </filter>
        </appender>
    
        <!-- 将日志信息输出到文件,但是当文件的大小达到某个阈值的时候,日志文件会自动回滚 -->
        <appender name="RollingFileAppender" class="org.apache.log4j.RollingFileAppender">
            <!-- 设置日志信息输出文件全路径名 -->
            <param name="File" value="D:/log4j/RollingFileAppender.log" />
            <!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->
            <param name="Append" value="true" />
            <!-- 设置保存备份回滚日志的最大个数 -->
            <param name="MaxBackupIndex" value="10" />
            <!-- 设置当日志文件达到此阈值的时候自动回滚,单位可以是KB,MB,GB,默认单位是KB -->
            <param name="MaxFileSize" value="10KB" />
            <!-- 设置日志输出的样式 -->
            <layout class="org.apache.log4j.PatternLayout">
                <!-- 设置日志输出的格式 -->
                <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
            </layout>
        </appender>
    
        <!-- 将日志信息输出到文件,可以配置多久产生一个新的日志信息文件 -->
        <appender name="DailyRollingFileAppender" class="org.apache.log4j.DailyRollingFileAppender">
            <!-- 设置日志信息输出文件全路径名 -->
            <param name="File" value="D:/log4j/DailyRollingFileAppender.log" />
            <!-- 设置日志每分钟回滚一次,即产生一个新的日志文件 -->
            <param name="DatePattern" value="'.'yyyy-MM-dd-HH-mm'.log'" />
            <!-- 设置日志输出的样式 -->
            <layout class="org.apache.log4j.PatternLayout">
                <!-- 设置日志输出的格式 -->
                <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
            </layout>
        </appender>
    
    
        <!--
         注意:
         1:当additivity="false"时,root中的配置就失灵了,不遵循缺省的继承机制
         2:logger中的name非常重要,它代表记录器的包的形式,有一定的包含关系,试验表明
            2-1:当定义的logger的name同名时,只有最后的那一个才能正确的打印日志
            2-2:当对应的logger含有包含关系时,比如:name=test.log4j.test8 和 name=test.log4j.test8.UseLog4j,则2-1的情况是一样的
            2-3:logger的name表示所有的包含在此名的所有记录器都遵循同样的配置,name的值中的包含关系是指记录器的名称哟!注意啦!
         3:logger中定义的level和appender中的filter定义的level的区间取交集
         4:如果appender中的filter定义的 levelMin > levelMax ,则打印不出日志信息
         -->
    
        <!-- 指定logger的设置,additivity指示是否遵循缺省的继承机制-->
        <logger name="test.log4j.test8.UseLog4j" additivity="false">
            <level value ="WARN"/>
            <appender-ref ref="DailyRollingFileAppender"/>
        </logger>
    
        <!--指定logger的设置,additivity指示是否遵循缺省的继承机制 -->
        <logger name="test.log4j.test8.UseLog4j_" additivity="false">
            <level value ="ERROR"/>
            <appender-ref ref="RollingFileAppender"/>
        </logger>
    
        <!-- 根logger的设置-->
        <root>
            <level value ="INFO"/>
            <appender-ref ref="ConsoleAppender"/>
            <!--<appender-ref ref="DailyRollingFileAppender"/>-->
        </root>
    
    </log4j:configuration>

    若想配置打印mybatis sql语句,加入:

        <logger name="java.sql.Connection" additivity="true">  
            <level value="INFO" />  
        </logger>  
      
        <logger name="java.sql.Statement" additivity="true">  
            <level value="INFO" />  
        </logger>  
      
        <logger name="java.sql.PreparedStatement" additivity="true">  
            <level value="INFO" />  
        </logger>  
      
        <logger name="java.sql.ResultSet" additivity="true">  
            <level value="INFO" />  
        </logger> 

    二、以自己项目为例:

    自定义log4j日志级别及输出日志到不同文件.

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
    
    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    
        <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="%d{HH:mm:ss,SSS} [%t] %-5p %C{1} : %m%n" />
            </layout>
        </appender>
        
        <appender name="log" class="org.apache.log4j.RollingFileAppender">
            <param name="File" value="/route/route-trace-${log.name}.log" />
            <param name="MaxFileSize" value="200000KB" />
            <param name="MaxBackupIndex" value="100" />
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss,SSS}[%t][%c][%p]-%m%n" />
            </layout>
        </appender>
        
        <appender name="customAppend1" class="org.apache.log4j.RollingFileAppender">
            <param name="File" value="/route/test-${log.nuw.name}.log" />
            <param name="Append" value="true"/>   
            <param name="MaxFileSize" value="500KB" />
            <param name="MaxBackupIndex" value="2" />
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss,SSS}[%t][%c][%p]-%m%n" />
            </layout>
            <!--过滤器设置输出的级别 -->  
            <filter class="com.bankht.cis.tps.apps.support.log.CustomLogFilter">
                 <param name="levelMin" value="CUSTOMLEVEL1" />  
                <param name="levelMax" value="CUSTOMLEVEL1" />  
            </filter>
        </appender>
        
        <appender name="customAppend2" class="org.apache.log4j.RollingFileAppender">
            <param name="File" value="/route/test-${log.mcis.name}.log" />
            <param name="Append" value="true"/>   
            <param name="MaxFileSize" value="500KB" />
            <param name="MaxBackupIndex" value="2" />
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss,SSS}[%t][%c][%p]-%m%n" />
            </layout>
            <!--过滤器设置输出的级别 -->  
            <filter class="com.bankht.cis.tps.apps.support.log.CustomLogFilter">
                 <param name="levelMin" value="CUSTOMLEVEL2" />  
                <param name="levelMax" value="CUSTOMLEVEL2" />  
            </filter>
        </appender>
    
        <!-- 指定logger的设置,additivity指示是否遵循缺省的继承机制-->
        <logger name="java.sql.Connection" additivity="true">  
            <level value="INFO" />  
        </logger>  
      
        <logger name="java.sql.Statement" additivity="true">  
            <level value="INFO" />  
        </logger>  
      
        <logger name="java.sql.PreparedStatement" additivity="true">  
            <level value="INFO" />  
        </logger>  
      
        <logger name="java.sql.ResultSet" additivity="true">  
            <level value="INFO" />  
        </logger> 
        
        <!--
            root的作用(相当于全局的意思):
            1.[priority ]:指定默认的全局输出级别
            2.[appender-ref ]:指定一些默认的append(没有指出特殊包或者类,即那些没有指定<logger>元素的append)的输出;
        -->
        <root>
            <priority value="INFO" />
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="log" />
            <appender-ref ref="customAppend1" />
            <appender-ref ref="customAppend2" />
        </root>
    
        
    </log4j:configuration>
    CustomLog.java
    package com.bankht.cis.tps.apps.support.log;
    
    import org.apache.log4j.Level;
    import org.apache.log4j.Logger;
    import org.apache.log4j.net.SyslogAppender;
    
    /** 
     * 名称: CustomLog<br> 
     * 描述: name<br> 
     * 批次:name<br> 
     * 创建时间: 2018-2-9<br> 
     * 修改时间:<br> 
     * 编写人员:xxx<br> 
     * 版本号:1.0 
     */
    public class CustomLog {
        
        private static Logger logger = Logger.getLogger(CustomLog.class);
    
        /** 
         * 继承Level 
         * @author Sevencm 
         * 
         */  
        private static class CustomLogLevel1 extends Level{  
            public CustomLogLevel1(int level, String levelStr, int syslogEquivalent) {  
                super(level, levelStr, syslogEquivalent);  
            }         
        }  
        private static class CustomLogLevel2 extends Level{  
            public CustomLogLevel2(int level, String levelStr, int syslogEquivalent) {  
                super(level, levelStr, syslogEquivalent);  
            }         
        }  
          
        /** 
         * 自定义级别名称,以及级别范围 
         */  
        private static final Level CUSTOMLEVEL1 = new CustomLogLevel1(20050,"CUSTOMLEVEL1",SyslogAppender.LOG_LOCAL0);  
        private static final Level CUSTOMLEVEL2 = new CustomLogLevel2(20051,"CUSTOMLEVEL2",SyslogAppender.LOG_LOCAL0);  
          
        /** 
         * 使用日志打印logger中的log方法 
         *  
         * @param logger 
         * @param objLogInfo 
         */  
        public static void customLog1(Logger logger,Object objLogInfo){  
            logger.log(CUSTOMLEVEL1, objLogInfo);  
        }  
        public static void customLog1(Object objLogInfo){  
            logger.log(CUSTOMLEVEL1, objLogInfo);  
        }  
        
        public static void customLog2(Logger logger,Object objLogInfo){  
            logger.log(CUSTOMLEVEL2, objLogInfo);  
        }  
        public static void customLog2(Object objLogInfo){  
            logger.log(CUSTOMLEVEL2,objLogInfo);  
        }  
    }
    CustomerLogFilter.java
    package com.bankht.cis.tps.apps.support.log;
    
    import org.apache.log4j.spi.Filter;
    import org.apache.log4j.spi.LoggingEvent;
    
    /** 
     * 名称: CustomerLogFilter.java<br> 
     * 描述: name<br> 
     * 批次:name<br> 
     * 创建时间: 2018-2-9<br> 
     * 修改时间:<br> 
     * 编写人员:xxx<br> 
     * 版本号:1.0 
     */
    public class CustomLogFilter extends Filter{
        boolean acceptOnMatch = false;  
        private String levelMin;  
        private String levelMax;  
          
        public String getLevelMin() {  
            return levelMin;  
        }  
      
      
      
        public void setLevelMin(String levelMin) {  
            this.levelMin = levelMin;  
        }  
      
      
      
        public String getLevelMax() {  
            return levelMax;  
        }  
      
      
      
        public void setLevelMax(String levelMax) {  
            this.levelMax = levelMax;  
        }  
      
      
      
        public boolean isAcceptOnMatch() {  
            return acceptOnMatch;  
        }  
      
      
      
        public void setAcceptOnMatch(boolean acceptOnMatch) {  
            this.acceptOnMatch = acceptOnMatch;  
        }  
      
      
        @Override  
        public int decide(LoggingEvent lgEvent) {  
            int inputLevel = lgEvent.getLevel().toInt();  
              
            if(inputLevel>=getLevel(levelMin) && inputLevel <= getLevel(levelMax)){  
                return 0;  
            }         
              
            return -1;  
        }  
          
        private int getLevel(String level){  
            level = level.toUpperCase();  
            if(level.equals("CUSTOMLEVEL1")){  
                return LevelType.CUSTOMLEVEL1.getType();  
            }  
            if(level.equals("CUSTOMLEVEL2")){  
                return LevelType.CUSTOMLEVEL2.getType();  
            }  
            if(level.equals("OFF")){  
                return LevelType.OFF.getType();  
            }  
            if(level.equals("FATAL")){  
                return LevelType.FATAL.getType();  
            }  
            if(level.equals("ERROR")){  
                return LevelType.ERROR.getType();  
            }  
            if(level.equals("INFO")){  
                return LevelType.INFO.getType();  
            }  
            if(level.equals("WARN")){  
                return LevelType.WARN.getType();  
            }  
            if(level.equals("DEBUG")){  
                return LevelType.DEBUG.getType();  
            }  
            if(level.equals("ALL")){  
                return LevelType.ALL.getType();  
            }  
            return LevelType.OFF.getType();  
        }  
          
        private static enum LevelType{  
              
            OFF(2147483647),  
              
            FATAL(50000),  
              
            ERROR(40000),  
              
            WARN(30000),  
              
            INFO(20000),  
              
            DEBUG(10000),  
              
            ALL(-2147483648),  
              
            CUSTOMLEVEL1(20050), 
            CUSTOMLEVEL2(20051);  
              
            int type;  
              
            public int getType() {  
                return type;  
            }  
      
            private LevelType(int type) {  
                this.type = type;  
            }  
        }  
    }

     测试类:

    package com.bankht.cis.tps.apps.support.log;
    
    /**
     * 名称: LogTest.java<br> 
     * 描述: name<br> 
     * 批次:name<br> 
     * 创建时间: 2018-2-1<br> 
     * 修改时间:<br> 
     * 编写人员:xxx <br> 
     * 版本号:1.0 
    
     */
    public class LogTest {
        
            public static void main(String[] args) {  
                System.setProperty("log.nuw.name", "xxx");//自定义文件名
                System.setProperty("log.mcis.name", "gagaga");//自定义文件名
                CustomLog log = new CustomLog();
                log.customLog1("------------------20180211---nuwGAGAGA");
                log.customLog2("------------------20180211---mcisYAYAYYAYA");
            }  
        
    }
  • 相关阅读:
    优化SQL查询:如何写出高性能SQL语句
    提高SQL执行效率的16种方法
    Spring Ioc DI 原理
    java内存泄漏
    转:js闭包
    LeetCode Best Time to Buy and Sell Stock III
    LeetCode Best Time to Buy and Sell Stock with Cooldown
    LeetCode Length of Longest Fibonacci Subsequence
    LeetCode Divisor Game
    LeetCode Sum of Even Numbers After Queries
  • 原文地址:https://www.cnblogs.com/amunamuna/p/8440558.html
Copyright © 2011-2022 走看看