精华内容
下载资源
问答
  • level级别 log4j2
    2021-09-07 13:15:16

    @SpringBootApplication
    public class Log4jTestApplication {

            //在info和warn中间定义新的日志级别
        final static Level MIRINFO = Level.forName("MIRINFO", 310);
        final static Level URINFO = Level.forName("URINFO", 320);
        private static final Logger logger = LogManager.getLogger(Log4jTestApplication.class);  
        public static void main(String[] args) {
            SpringApplication.run(Log4jTestApplication.class, args);
            logger.info("info");
            logger.warn("warn");
            logger.error("error");
            logger.log(MIRINFO, "MIRINFO");
            logger.log(URINFO,"URINFO");
        }

    }

    更多相关内容
  • log4j2 自定义日志级别

    千次阅读 2018-11-16 15:15:38
    注意 : intLevel 值越小,级别越高 (log4j2 官方文档)   自定义日志级别 第一步 :声明自定义级别 intLevel参考上面的值 <CustomLevels> <CustomLevel name="INITLEVEL&...

    log4j内置日志级别

    注意 : intLevel 值越小,级别越高 (log4j2 官方文档)

     

    自定义日志级别

    第一步 :声明自定义级别 intLevel参考上面的值

    <CustomLevels>
        <CustomLevel name="INITLEVEL" intLevel="240" />
    </CustomLevels>

    第二步 : 配置自定义级别输出 

     

    <loggers>
    		 <root level="warn">
    			<appender-ref ref="Console"/>
    		</root> 
    		<logger name="initLog" level="INITLEVEL" additivity="false">
    			<appender-ref ref="Console" />
    			
    		</logger>
    </loggers>

    注意 : root的级别一定要比自定义级别高,要不然不能输出。例如warn 的级别是300 ,自定义级别是350 ,那么自定义级别的日志就不能输出了。

    第三步:使用自定义级别:

    private Logger log = LogManager.getLogger(ScheduleJobServiceImpl.class.getName());
    
    
    
    log.log(Level.getLevel("INITLEVEL"), "初始化日志输出测试");

    注:官方网站还给出了另一种自定义级别的使用方式。

    private static final ExtLogger logger = ExtLogger.create(MyService.class);
    
    
    //自定义级别
    logger.diag("another message");

    看起来代码更简介,更易用,

    但是需要自己写个日志的扩展对象。有机会的话日后补充。

     

     

    展开全文
  • log4j2自定义级别日志

    2020-08-19 17:43:21
    实际开发项目中有时候需要将某些信息单独输出到一个文件以做分析,为了让日志信息更清晰,这时就可以用到log4j2的自定义日志级别输出到独立的文件中。 log4j2依赖包导入什么的这里就不说了,直接上配置和代码。 ...

    实际开发项目中有时候需要将某些信息单独输出到一个文件以做分析,为了让日志信息更清晰,这时就可以用到log4j2的自定义日志级别输出到独立的文件中。

    log4j2依赖包导入什么的这里就不说了,直接上配置和代码。

    因为项目在线上使用的是apollo自动化配置,而线上apollo配置文件用的是properties格式,所以这里我没有用xml格式配置。xml方式的配置百度一下有很多,也是官方推荐的配置方式,我这里就不写了。

    1、配置属性文件 log4j2.properties

    # 根记录器,所有记录器的父辈
    rootLogger.level = info
    rootLogger.type = AsyncRoot
    
    #文件路径
    property.filePath = /Users/apple/ane/logs/${appName}
    property.filePattern = %d{yyyy-MM-dd}_%i
    property.appName = app1
    #输出格式
    property.layoutPattern = %level|${appName}|%d{yyyy-MM-dd HH:mm:ss}|%t|%logger{36}|%m%n
    property.layoutPatternC = %level|${appName}|%d{yyyy-MM-dd HH:mm:ss}|%t|%logger{36}|%m%n
    # 级别过滤(过滤日志记录)
    #filters = threshold
    filter.threshold.type = ThresholdFilter
    # 只记录debug级别以上的日志,大小写无关:(ALL<)TRACE<DEBUG<INFO<WARN<ERROR<FATAL(<OFF)
    filter.threshold.level = trace
    
    appender.console.type = Console
    appender.console.name = STDOUT
    appender.console.target = SYSTEM_OUT
    appender.console.layout.type = PatternLayout
    appender.console.layout.pattern = ${layoutPatternC}
    rootLogger.appenderRef.stdout.ref = STDOUT
    
    #自定义日志配置CUSTOM
    #level值
    customLevel.CUSTOM = 50
    rootLogger.appenderRef.CUSTOM.ref = CustomRollingFile
    appender.CUSTOM.fileName = ${filePath}/custom/custom.log
    appender.CUSTOM.filePattern = ${filePath}/custom/custom_${filePattern}.log
    #日志文件类型:文件大小滚动到设定大小自动生成一个指定格式名称的文件
    appender.CUSTOM.type = RollingFile
    appender.CUSTOM.name = CustomRollingFile
    appender.CUSTOM.layout.type = PatternLayout
    #日志输出格式
    appender.CUSTOM.layout.pattern = %m%n
    appender.CUSTOM.policies.type = Policies
    appender.CUSTOM.policies.time.type = TimeBasedTriggeringPolicy
    appender.CUSTOM.policies.time.interval = 1
    appender.CUSTOM.policies.time.modulate = true
    #日志文件大小限制10M
    appender.CUSTOM.policies.size.type = SizeBasedTriggeringPolicy
    appender.CUSTOM.policies.size.size = 10M
    appender.CUSTOM.policies.start.type = OnStartupTriggeringPolicy
    appender.CUSTOM.strategy.type = DefaultRolloverStrategy
    appender.CUSTOM.strategy.fileIndex = nomax
    #删除规则设置,超过一天的文件会被删除
    appender.CUSTOM.strategy.delete.type = Delete
    appender.CUSTOM.strategy.delete.basePath = ${filePath}/custom/
    appender.CUSTOM.strategy.delete.maxDepth = 1
    appender.CUSTOM.strategy.delete.iffilename.type = IfFileName
    appender.CUSTOM.strategy.delete.iffilename.glob = custom_*.log
    appender.CUSTOM.strategy.delete.iffilename.iflastmodified.type = IfLastModified
    appender.CUSTOM.strategy.delete.iffilename.iflastmodified.age = 1d
    #日志级别匹配,只有CUSTOM级别的日志信息才会写入到文件
    appender.CUSTOM.filter.levelRange.type = LevelRangeFilter
    appender.CUSTOM.filter.levelRange.minLevel = CUSTOM
    appender.CUSTOM.filter.levelRange.maxLevel = CUSTOM
    appender.CUSTOM.filter.levelRange.onMatch = ACCEPT
    appender.CUSTOM.filter.levelRange.onMismatch = DENY

    这里还只是一个自定义级别的,如果我要配置多个自定义级别怎么办了?

    不慌,喝口水,来,看配置

    # 根记录器,所有记录器的父辈
    rootLogger.level = info
    rootLogger.type = AsyncRoot
    
    #文件路径
    property.filePath = /Users/apple/ane/logs/${appName}
    property.filePattern = %d{yyyy-MM-dd}_%i
    property.appName = app2
    #输出格式
    property.layoutPattern = %level|${appName}|%d{yyyy-MM-dd HH:mm:ss}|%t|%logger{36}|%m%n
    property.layoutPatternC = %level|${appName}|%d{yyyy-MM-dd HH:mm:ss}|%t|%logger{36}|%m%n
    # 级别过滤(过滤日志记录)
    #filters = threshold
    filter.threshold.type = ThresholdFilter
    # 只记录debug级别以上的日志,大小写无关:(ALL<)TRACE<DEBUG<INFO<WARN<ERROR<FATAL(<OFF)
    filter.threshold.level = trace
    
    appender.console.type = Console
    appender.console.name = STDOUT
    appender.console.target = SYSTEM_OUT
    appender.console.layout.type = PatternLayout
    appender.console.layout.pattern = ${layoutPatternC}
    rootLogger.appenderRef.stdout.ref = STDOUT
    
    #自定义日志配置CUSTOM_ADD
    customLevel.CUSTOM_ADD = 70
    rootLogger.appenderRef.CUSTOM_ADD.ref = CustomAddRollingFile
    appender.CUSTOM_ADD.fileName = ${filePath}/custom/custom_add.log
    appender.CUSTOM_ADD.filePattern = ${filePath}/custom/custom_add_${filePattern}.log
    appender.CUSTOM_ADD.type = RollingFile
    appender.CUSTOM_ADD.name = CustomAddRollingFile
    appender.CUSTOM_ADD.layout.type = PatternLayout
    appender.CUSTOM_ADD.layout.pattern = %m%n
    appender.CUSTOM_ADD.policies.type = Policies
    appender.CUSTOM_ADD.policies.time.type = TimeBasedTriggeringPolicy
    appender.CUSTOM_ADD.policies.time.interval = 1
    appender.CUSTOM_ADD.policies.time.modulate = true
    appender.CUSTOM_ADD.policies.size.type = SizeBasedTriggeringPolicy
    appender.CUSTOM_ADD.policies.size.size = 10M
    appender.CUSTOM_ADD.policies.start.type = OnStartupTriggeringPolicy
    appender.CUSTOM_ADD.strategy.type = DefaultRolloverStrategy
    appender.CUSTOM_ADD.strategy.fileIndex = nomax
    appender.CUSTOM_ADD.strategy.delete.type = Delete
    appender.CUSTOM_ADD.strategy.delete.basePath = ${filePath}/custom/
    appender.CUSTOM_ADD.strategy.delete.maxDepth = 1
    appender.CUSTOM_ADD.strategy.delete.iffilename.type = IfFileName
    appender.CUSTOM_ADD.strategy.delete.iffilename.glob = custom_add_*.log
    appender.CUSTOM_ADD.strategy.delete.iffilename.iflastmodified.type = IfLastModified
    appender.CUSTOM_ADD.strategy.delete.iffilename.iflastmodified.age = 1d
    appender.CUSTOM_ADD.filter.levelRange.type = LevelRangeFilter
    appender.CUSTOM_ADD.filter.levelRange.minLevel = CUSTOM_ADD
    appender.CUSTOM_ADD.filter.levelRange.maxLevel = CUSTOM_ADD
    appender.CUSTOM_ADD.filter.levelRange.onMatch = ACCEPT
    appender.CUSTOM_ADD.filter.levelRange.onMismatch = DENY
    #自定义日志配置CUSTOM_UPT
    customLevel.CUSTOM_UPT = 60
    rootLogger.appenderRef.CUSTOM_UPT.ref = CustomUptRollingFile
    appender.CUSTOM_UPT.fileName = ${filePath}/custom/custom_upt.log
    appender.CUSTOM_UPT.filePattern = ${filePath}/custom/custom_upt_${filePattern}.log
    appender.CUSTOM_UPT.type = RollingFile
    appender.CUSTOM_UPT.name = CustomUptRollingFile
    appender.CUSTOM_UPT.layout.type = PatternLayout
    appender.CUSTOM_UPT.layout.pattern = %m%n
    appender.CUSTOM_UPT.policies.type = Policies
    appender.CUSTOM_UPT.policies.time.type = TimeBasedTriggeringPolicy
    appender.CUSTOM_UPT.policies.time.interval = 1
    appender.CUSTOM_UPT.policies.time.modulate = true
    appender.CUSTOM_UPT.policies.size.type = SizeBasedTriggeringPolicy
    appender.CUSTOM_UPT.policies.size.size = 10M
    appender.CUSTOM_UPT.strategy.type = DefaultRolloverStrategy
    appender.CUSTOM_UPT.strategy.fileIndex = nomax
    appender.CUSTOM_UPT.strategy.delete.type = Delete
    appender.CUSTOM_UPT.strategy.delete.basePath = ${filePath}/custom/
    appender.CUSTOM_UPT.strategy.delete.maxDepth = 1
    appender.CUSTOM_UPT.strategy.delete.iffilename.type = IfFileName
    appender.CUSTOM_UPT.strategy.delete.iffilename.glob = custom_upt_*.log
    appender.CUSTOM_UPT.strategy.delete.iffilename.iflastmodified.type = IfLastModified
    appender.CUSTOM_UPT.strategy.delete.iffilename.iflastmodified.age = 1d
    appender.CUSTOM_UPT.filter.levelRange.type = LevelRangeFilter
    appender.CUSTOM_UPT.filter.levelRange.minLevel = CUSTOM_UPT
    appender.CUSTOM_UPT.filter.levelRange.maxLevel = CUSTOM_UPT
    appender.CUSTOM_UPT.filter.levelRange.onMatch = ACCEPT
    appender.CUSTOM_UPT.filter.levelRange.onMismatch = DENY
    #自定义日志配置CUSTOM_DEL
    customLevel.CUSTOM_DEL = 50
    rootLogger.appenderRef.CUSTOM_DEL.ref = CustomDelRollingFile
    appender.CUSTOM_DEL.fileName = ${filePath}/custom/custom_del.log
    appender.CUSTOM_DEL.filePattern = ${filePath}/custom/custom_del_${filePattern}.log
    appender.CUSTOM_DEL.type = RollingFile
    appender.CUSTOM_DEL.name = CustomDelRollingFile
    appender.CUSTOM_DEL.layout.type = PatternLayout
    appender.CUSTOM_DEL.layout.pattern = %m%n
    appender.CUSTOM_DEL.policies.type = Policies
    appender.CUSTOM_DEL.policies.time.type = TimeBasedTriggeringPolicy
    appender.CUSTOM_DEL.policies.time.interval = 1
    appender.CUSTOM_DEL.policies.time.modulate = true
    appender.CUSTOM_DEL.policies.size.type = SizeBasedTriggeringPolicy
    appender.CUSTOM_DEL.policies.size.size = 10M
    appender.CUSTOM_DEL.strategy.type = DefaultRolloverStrategy
    appender.CUSTOM_DEL.strategy.fileIndex = nomax
    appender.CUSTOM_DEL.strategy.delete.type = Delete
    appender.CUSTOM_DEL.strategy.delete.basePath = ${filePath}/custom/
    appender.CUSTOM_DEL.strategy.delete.maxDepth = 1
    appender.CUSTOM_DEL.strategy.delete.iffilename.type = IfFileName
    appender.CUSTOM_DEL.strategy.delete.iffilename.glob = custom_del_*.log
    appender.CUSTOM_DEL.strategy.delete.iffilename.iflastmodified.type = IfLastModified
    appender.CUSTOM_DEL.strategy.delete.iffilename.iflastmodified.age = 1d
    appender.CUSTOM_DEL.filter.levelRange.type = LevelRangeFilter
    appender.CUSTOM_DEL.filter.levelRange.minLevel = CUSTOM_DEL
    appender.CUSTOM_DEL.filter.levelRange.maxLevel = CUSTOM_DEL
    appender.CUSTOM_DEL.filter.levelRange.onMatch = ACCEPT
    appender.CUSTOM_DEL.filter.levelRange.onMismatch = DENY

    多个自定义级别的配置我也是研究了很久才成功,不管是log4j2官网还是百度都没有找到相应的properties配置,只能自己一个一个属性去试,还好最终成功配置好了。

    2、创建一个日志工具类 CustomLogUtil

    import org.apache.logging.log4j.Level;
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    
    import java.util.List;
    
    public class CustomLogUtil {
    
        private static Logger logger = LogManager.getLogger(CustomLogUtil.class);
        public final static Level CUSTOM_LEVEL  = Level.forName("CUSTOM",50);
    
        /**
         * 自定义级别日志打印
         * @param logs
         */
        public static void printCustomLog(String logs){
            logger.log(CUSTOM_LEVEL, logs);
        }
    
        public static void printCustomLog(Object obj){
            logger.log(CUSTOM_LEVEL, JacksonUtil.writeValueWithSplitString(obj, c));
        }
    }
    

    JacksonUtil.writeValueSplitString()方法是我自定义的方法,用来把对象转成我要的json格式。你们直接用alibaba的json工具包就行了。

    有多个自定义级别的话就创建多个Level对象,注意级别名和级别值不要一样

    public final static Level CUSTOM_ADD_LEVEL  = Level.forName("CUSTOM_ADD",70);
    public final static Level CUSTOM_UPT_LEVEL  = Level.forName("CUSTOM_UPT",60);
    public final static Level CUSTOM_DEL_LEVEL  = Level.forName("CUSTOM_DEL",50);

    3、使用

    在要输出日志的地方直接通过下面的方式调用就行了 

    CustomLogUtil.printCustomLog("我是自定义级别日志");

     

    展开全文
  • Log4j自定义日志级别

    2020-07-12 17:51:12
    Log4j 1.2.8 自定义日志级别目的实现自定义日志级别log4j.xml配置文件执行结果结构分析流程综述主要代码 目的 由于要实现需求:将特定的跟踪日志写入单独的日志文件,且其他的日志输出不受影响。故需要实现一个...

    目的

    由于要实现需求:将特定的跟踪日志写入单独的日志文件,且其他的日志输出不受影响。故需要实现一个自定义的日志级别并指定配置文件,将特定的日志信息输入特定文件。

    实现

    本代码基于log4j 1.2.8,并调试成功。配置文件基于log4j.xml

    自定义日志级别类

    package com.example.log4j.level;
    
    import org.apache.log4j.Level;
    
    public class MyLevel extends Level {
    
        public final static int TRACE_INT = 9000;
    
        /**
         * The <code>TRACE</code> Level designates fine-grained
         * informational events that are most useful to trace an
         * application.
         */
        final static public Level TRACE = new MyLevel(TRACE_INT, "TRACE", 7);
    
        /**
         * Instantiate a level object.
         *
         * @param level
         * @param levelStr
         * @param syslogEquivalent
         */
        protected MyLevel(int level, String levelStr, int syslogEquivalent) {
            super(level, levelStr, syslogEquivalent);
        }
    
        /**
         * Convert the string passed as argument to a level. If the
         * conversion fails, then this method returns {@link #DEBUG}.
         */
        public
        static Level toLevel(String sArg) {
            return (Level) toLevel(sArg, Level.DEBUG);
        }
    
        /**
         * Convert an integer passed as argument to a level. If the
         * conversion fails, then this method returns {@link #DEBUG}.
         */
        public
        static Level toLevel(int val) {
            return (Level) toLevel(val, Level.DEBUG);
        }
    
        /**
         * Convert an integer passed as argument to a level. If the
         * conversion fails, then this method returns the specified default.
         */
        public
        static Level toLevel(int val, Level defaultLevel) {
            switch (val) {
                case ALL_INT:
                    return ALL;
                case TRACE_INT:
                    return MyLevel.TRACE;
                case DEBUG_INT:
                    return Level.DEBUG;
                case INFO_INT:
                    return Level.INFO;
                case WARN_INT:
                    return Level.WARN;
                case ERROR_INT:
                    return Level.ERROR;
                case FATAL_INT:
                    return Level.FATAL;
                case OFF_INT:
                    return OFF;
                default:
                    return defaultLevel;
            }
        }
    
        /**
         * Convert the string passed as argument to a level. If the
         * conversion fails, then this method returns the value of
         * <code>defaultLevel</code>.
         */
        public
        static Level toLevel(String sArg, Level defaultLevel) {
            if (sArg == null)
                return defaultLevel;
    
            String s = sArg.toUpperCase();
    
            if (s.equals("ALL")) return Level.ALL;
            if (s.equals("TRACE")) return MyLevel.TRACE;
            if (s.equals("DEBUG")) return Level.DEBUG;
            //if(s.equals("FINE")) return Level.FINE;
            if (s.equals("INFO")) return Level.INFO;
            if (s.equals("WARN")) return Level.WARN;
            if (s.equals("ERROR")) return Level.ERROR;
            if (s.equals("FATAL")) return Level.FATAL;
            if (s.equals("OFF")) return Level.OFF;
            return defaultLevel;
        }
    }
    
    

    log4j.xml配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "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] - %m%n" />
            </layout>
            <!--过滤器设置输出的级别-->
            <filter  class="org.apache.log4j.varia.LevelRangeFilter">
                <!-- 设置日志输出的最小级别 -->
                <param name="levelMin" value="TRACE#com.example.log4j.level.MyLevel" />
                <!-- 设置日志输出的最大级别 -->
                <param name="levelMax" value="TRACE#com.example.log4j.level.MyLevel" />
                <!-- 设置日志输出的标志,true则直接输出,false则继续执行下一个过滤器。默认是false -->
                <param name="AcceptOnMatch" value="true" />
    
            </filter>
        </appender>
    
        <root>
            <level value="TRACE" class="com.example.log4j.level.MyLevel" />
            <appender-ref ref="ConsoleAppender"/>
    
        </root>
    </log4j:configuration>
    

    执行结果

    测试类

    package com.example.log4j;
    
    import com.example.log4j.level.MyLevel;
    import org.apache.log4j.Level;
    import org.apache.log4j.Logger;
    import org.junit.jupiter.api.Test;
    import org.springframework.boot.test.context.SpringBootTest;
    
    @SpringBootTest
    class Log4jApplicationTests {
    
        private static Logger logger = Logger.getLogger(Log4jApplicationTests.class);
        @Test
        void contextLoads() {
        }
    
        @Test
        void testLog(){
    
            logger.log(MyLevel.TRACE, "logger TRACE!");
            logger.log(Level.DEBUG,"logger DEBUG!");
            logger.log(Level.INFO,"logger INFO!");
            logger.log(Level.WARN,"logger WARN!");
            logger.log(Level.ERROR,"logger ERROR!");
        }
    }
    

    控制台

    [2020-07-12 15:08:16:089] [TRACE] [method:com.example.log4j.Log4jApplicationTests.testLog(Log4jApplicationTests.java:20)] - logger TRACE!
    

    结构分析

    流程综述

    Logger LogManager OptionConverter DOMConfigurator PropertySetter getLogger() 静态代码块加载配置 读取配置文件 优先log4j.xml,没有则 log4j.properties selectAndConfigure() log4j.xml时调用 doConfigure()读取xml配置信息解析为DOM parse() parseCategory parseCategory() findAppenderByReference() findAppenderByName() parseAppender() parseFilters() setProperty() convertArg() toLevel() 返回日志级别Level对象 完成配置 完成配置 完成配置 静态代码块完成配置处理 返回Logger对象 Logger LogManager OptionConverter DOMConfigurator PropertySetter

    主要代码

    OptionConverter类为过滤器LevelRangeFilter注入过滤日志最大、最小等级。配置中使用#分割,#前为自定义日志级别,#后为自定日志级别类。

    <filter  class="org.apache.log4j.varia.LevelRangeFilter">
       <!-- 设置日志输出的最小级别 -->
        <param name="levelMin" value="TRACE#com.example.log4j.level.MyLevel" />
        <!-- 设置日志输出的最大级别 -->
        <param name="levelMax" value="TRACE#com.example.log4j.level.MyLevel" />
        <!-- 设置日志输出的标志,true则直接输出,false则继续执行下一个过滤器。默认是false -->
        <param name="AcceptOnMatch" value="true" />
    
    </filter>
    

    根据配置生成自定义Level对象。

    /**
         Converts a standard or custom priority level to a Level
         object.  <p> If <code>value</code> is of form
         "level#classname", then the specified class' toLevel method
         is called to process the specified level string; if no '#'
         character is present, then the default {@link org.apache.log4j.Level}
         class is used to process the level value.
    
         <p>As a special case, if the <code>value</code> parameter is
         equal to the string "NULL", then the value <code>null</code> will
         be returned.
    
         <p> If any error occurs while converting the value to a level,
         the <code>defaultValue</code> parameter, which may be
         <code>null</code>, is returned.
    
         <p> Case of <code>value</code> is insignificant for the level level, but is
         significant for the class name part, if present.
    
         @since 1.1 */
      public
      static
      Level toLevel(String value, Level defaultValue) {
        if(value == null)
          return defaultValue;
    
        int hashIndex = value.indexOf('#');
        if (hashIndex == -1) {
          if("NULL".equalsIgnoreCase(value)) {
    	return null;
          } else {
    	// no class name specified : use standard Level class
    	return(Level) Level.toLevel(value, defaultValue);
          }
        }
    
        Level result = defaultValue;
    
        String clazz = value.substring(hashIndex+1);
        String levelName = value.substring(0, hashIndex);
    
        // This is degenerate case but you never know.
        if("NULL".equalsIgnoreCase(levelName)) {
    	return null;
        }
    
        LogLog.debug("toLevel" + ":class=[" + clazz + "]"
    		 + ":pri=[" + levelName + "]");
    
        try {
          Class customLevel = Loader.loadClass(clazz);
    
          // get a ref to the specified class' static method
          // toLevel(String, org.apache.log4j.Level)
          Class[] paramTypes = new Class[] { String.class,
    					 org.apache.log4j.Level.class
                                           };
          java.lang.reflect.Method toLevelMethod =
                          customLevel.getMethod("toLevel", paramTypes);
    
          // now call the toLevel method, passing level string + default
          Object[] params = new Object[] {levelName, defaultValue};
          Object o = toLevelMethod.invoke(null, params);
    
          result = (Level) o;
        } catch(ClassNotFoundException e) {
          LogLog.warn("custom level class [" + clazz + "] not found.");
        } catch(NoSuchMethodException e) {
          LogLog.warn("custom level class [" + clazz + "]"
            + " does not have a constructor which takes one string parameter", e);
        } catch(java.lang.reflect.InvocationTargetException e) {
          LogLog.warn("custom level class [" + clazz + "]"
    		   + " could not be instantiated", e);
        } catch(ClassCastException e) {
          LogLog.warn("class [" + clazz
            + "] is not a subclass of org.apache.log4j.Level", e);
        } catch(IllegalAccessException e) {
          LogLog.warn("class ["+clazz+
    		   "] cannot be instantiated due to access restrictions", e);
        } catch(Exception e) {
          LogLog.warn("class ["+clazz+"], level ["+levelName+
    		   "] conversion failed.", e);
        }
        return result;
       }
    
    展开全文
  • 阿里云java源码Log4j2 附加程序 阿里云日志 Log4j2 Appender Apache Log4j2 是对 Log4j 的升级,与其前身 Log4j 1.x 相比提供了重大改进。 可以通过Log4j2控制日志的目的地。 它可以是控制台、文件、GUI 组件、套接...
  • log4j2自定义日志级别

    千次阅读 2018-12-26 22:24:51
    项目中需要打印一些特定信息到日志中,因为不想掺杂一些其他的日志,所以自定义一个日志级别 日志级别以及优先级排序: OFF &gt; FATAL &gt; ERROR &...intLevel 值越小,级别越高 具体代码如下...
  • Log4j:专门为我们的javat程序记录日志使用的;就是jar包+配置文件 那么没有使用log4j的时候,...配置文件log4j2.xml <?xml version="1.0" encoding="UTF-8"?> <!-- status=debug 可以查看log4j的装配过程 --&g
  • 只输出单一级别,而不是本级及以上的级别日志。 直接上代码 eg: 只输出WARN级别 <!--经测试,console标签里面也可以用,RollingFile没有测试,应该也可以--> <File name="FileWarn" fileName="${FILE_PATH}...
  • 这篇来说下 log4j2 日志框架结合 SpringBoot 动态设置日志级别。因为 log4j2 日志框架也有非常多的公司采用,毕竟 logback 和 log4j2 是现在用的最多的两个日志框架。都不能落对吧。 0x01:pom.xml 引入依赖 <...
  • log4j2.xml 的标签 loggers 中 root 的属性 level 指的是什么   log4j2.xml 是 log4j2 中的其中一种配置文件。log4j2.xml 中往往有如下配置: <configuration ...> <appenders/...> <loggers>...
  • log4j 级别(level)

    千次阅读 2018-05-16 17:30:17
    所有的log4j级别,这些级别都相当于一层层的过滤器Log4J LevelsTRACE LevelDEBUG LevelINFO LevelWARN LevelERROR LevelFATAL LevelTRACE LevelYYYYYYDEBUG LevelNYYYYYINFO LevelNNYYYYWARN LevelNNNYYYERROR ...
  • log4j2配置appender级别的过滤器,这是log4j2日志打印中,顺序执行的最后一条过滤器,过滤器执行后,将进入appender,完成日志打印 源码分析 以输出一条debug日志为例 log.debug("this is a debug log."); 程序将...
  • log4j2指定不同包的输出级别

    千次阅读 2019-10-29 16:10:54
    首先引入这几个包 <!-- 通用日志接口 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <vers...
  • log4j2 动态修改日志级别

    千次阅读 2019-04-11 15:19:38
    Configurator.setAllLevels(String, Level) Configurator.setLevel(Map<String, Level>) Configurator.setLevel(String, Level) Configurator.setRootLevel(Level) 参考 链接:...
  • Log4j Appender 阿里云Log Log4j Appender Apache log4j是一个Apache软件基础项目。 您可以通过Log4j控制日志的目的地。 它可以是控制台,文件,GUI组件,套接字,NT事件日志,系统日志。 您也可以控制每个日志的...
  • Log4j2日志级别

    千次阅读 2020-09-10 17:17:11
    Log4j2日志级别 级别log4j2中,共有8个级别,按照从低到高为:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF。 All:最低等级的,用于打开所有日志记录.  Trace:是追踪,...
  • Log4j是我们最长使用的Java日志组件之一,通常我们将项目...因此我们就需要Log4j按照日志级别将日志输出到不同的目录中。我们先看看log4j的配置文件,如下:log4j.rootLogger=info,console,huangx,bug315#console...
  • 原文网址: 简介 本文用示例介绍log4j2log4j的用法。同时也会介绍相关知识:它们的区别等。 log4j2log4j的区别 1、配置文件类型 ... log4j:是通过一个....log4j2log4j-api-2.13.0.jar 和 log4j-core...
  • Log4jLog4j2的区别

    千次阅读 2021-12-12 15:23:08
    log4j是通过一个.properties的文件作为主配置文件的,而现在的log4j 2则已经弃用了这种方式,采用的是.xml,.json或者.jsn这种方式来做,可能这也是技术发展的一个必然性,毕竟properties文件的可阅读性真的是有点差...
  • Log4j日志级别详解

    2021-03-14 11:31:40
    Log4j日志级别从高到低分别为:8:OFF(Integer.MAX_VALUE),用户关闭所有日志记录7:FATAL(50000),导致应用程序退出的严重错误6:ERROR(40000),虽然发生了错误但不影响系统的继续运行5:WARN(30000),会出现潜在的...
  • 设置log4j日志级别

    2021-07-16 23:01:14
    I'm currently working on a project that uses log4j.I'm running a testcase (junit) and would like to set the log level to trace so that I can see if all the values are correct. Classes that use logging...
  • 默认情况下,大多数答案都假定日志记录必须是附加的。... 这是我用来使它工作的代码public class LogConfigManager {public void setLogLevel(String loggerName, String level) {Level newLevel = Level.valueOf(le...
  • log4j2 自定义级别

    千次阅读 2017-04-20 16:00:37
    log4j2还支持在代码中定义level,如果是在代码中定义,又使用了xml,则必须在xml加载之前定义好,否则在记录自定义级别日志时,找不到该级别,从而记录失败。 log4j2.xml里的properties配置必须放在xml...
  • 文章目录一、为什么要用log4j21、性能大幅提升2、自动重载配置(热加载)3、无垃圾机制二、如何从0接入log4j21、maven配置1.1 方法一(适合spring)方法二(适合springBoot)2log4j2.xml配置2.1 log4j2.xml 示例2.2 ...
  • log4jlog4j2性能对比及log4j升级至log4j2方案

    万次阅读 多人点赞 2019-06-16 11:03:53
    1.前言 之前某个服务在压测环境中出现了问题,分析之后得知是log4jLogger对象争用厉害,很多线程阻塞在此。...关于log4jlog4j2的性能对比文章有很多,本文不过多描述,给出几张结论图及原文链接,作为参考...
  • 在Spring的框架下,我们可以使用log4j来进行日志的设置,高版本的SpringBoot会使用log4j2。 介绍 log4j2概述   截取官网的原话:Apache Log4j 2 is an upgrade to Log4j that provides significant impr.
  • log4j的日志级别以及配置

    千次阅读 2020-09-02 16:11:40
    log4j定义了8个级别log(除去OFF和ALL,可以说分为6个级别),优先级从高到低依次为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL。 ALL最低等级的,用于打开所有日志记录。 TRACEdesignates finer-...
  • springboot中动态修改log4j2日志级别

    千次阅读 2019-08-05 23:41:21
    转载 来源:博客园 作者:何其有静 地址:...在spring boot中使用log4j2日志时,项目运行中,想要修改日志级别。 1.pom.xml依赖: <dependency> <groupId>org.apache.logging.log4j&l...
  • 本文要解决的是如何将 mybatis 的 sql 日志打印到特定文件问题。... log-impl: org.apache.ibatis.logging.stdout.StdOutImpl 看起来确实没问题,但是。日志仅仅只能打印到控制台,而在项目上线初期,我

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 49,301
精华内容 19,720
关键字:

level级别 log4j2