美文网首页
org.testng.log4testng.Logger

org.testng.log4testng.Logger

作者: __Andy__ | 来源:发表于2018-12-21 15:23 被阅读7次

使用方法:
private static final Logger LOGGER = Logger.getLogger(TestNG.class);
方法详解:
1.首先定义静态变量,static静态代码块,构造方法

2.1 getLogger-> initialize-> checkProperties

源码如下:

package TestNGlog;


import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.Map.Entry;
import org.testng.Assert;
import org.testng.collections.Maps;

public class Logger1 {

    private static int i = 0;
    private static final int TRACE;
    private static final int DEBUG;
    private static final int INFO;
    private static final int WARN;
    private static final int ERROR;
    private static final int FATAL;
    private static final int LEVEL_COUNT;
    private static final String PREFIX = "log4testng.";
    private static final String LOGGER_PREFIX = "log4testng.logger.";
    private static final String ROOT_LOGGER = "log4testng.rootLogger";
    private static final String DEBUG_PROPERTY = "log4testng.debug";
    private static PrintStream err;
    private static PrintStream out;
    private static final String[] levelNames;
    private static final Map<String, Integer> levelMap;
    private static boolean initialized;
    private static final Map<String, Integer> loggerLevels;
    private static final Map <Class, Logger1> loggers;
    private static int rootLoggerLevel;
    private static boolean debug;
    private final int level;
    private final Class klass;
    private final String m_className;

    //构造方法,初始化类和日志级别
    private Logger1(Class pClass, int pLevel) {
        this.level = pLevel;
        this.klass = pClass;
        this.m_className = pClass.getName().substring(pClass.getName().lastIndexOf(46) + 1);
    }

    static {
        TRACE = i++;
        DEBUG = i++;
        INFO = i++;
        WARN = i++;
        ERROR = i++;
        FATAL = i++;
        LEVEL_COUNT = i;
        //默认为NULL
        err = System.err;
        //默认为NULL
        out = System.out;
        levelNames = new String[LEVEL_COUNT];
        levelNames[TRACE] = "TRACE";
        levelNames[DEBUG] = "DEBUG";
        levelNames[INFO] = "INFO";
        levelNames[WARN] = "WARN";
        levelNames[ERROR] = "ERROR";
        levelNames[FATAL] = "FATAL";
        //初始化级别Map,<级别,级别ID>
        levelMap = Maps.newHashMap();
        for(i = 0; i < LEVEL_COUNT; ++i) {
            levelMap.put(levelNames[i], i);
        }
        //<空的>
        loggerLevels = Maps.newHashMap();
        //定义一个空的MAP
        loggers = Maps.newHashMap();
        //默认的日志级别
        rootLoggerLevel = WARN;
        //debug是否开启
        debug = false;
    }



    public static synchronized Logger1 getLogger(Class pClass) {
        initialize();
        Logger1 logger = loggers.get(pClass);
        if (logger != null) {
            return logger;
        } else {
            int level = getLevel(pClass);
            logger = new Logger1(pClass, level);
            loggers.put(pClass, logger);
            return logger;
        }
    }

    public boolean isTraceEnabled() {
        return this.isLevelEnabled(TRACE);
    }

    public void trace(Object message) {
        this.log(TRACE, message, (Throwable)null);
    }

    public void trace(Object message, Throwable t) {
        this.log(TRACE, message, t);
    }

    public boolean isDebugEnabled() {
        return this.isLevelEnabled(DEBUG);
    }

    public void debug(Object message) {
        this.log(DEBUG, message, (Throwable)null);
    }

    public void debug(Object message, Throwable t) {
        this.log(DEBUG, message, t);
    }

    public boolean isInfoEnabled() {
        return this.isLevelEnabled(INFO);
    }

    public void info(Object message) {
        this.log(INFO, message, (Throwable)null);
    }

    public void info(Object message, Throwable t) {
        this.log(INFO, message, t);
    }

    public void warn(Object message) {
        this.log(WARN, message, (Throwable)null);
    }

    public void warn(Object message, Throwable t) {
        this.log(WARN, message, t);
    }

    public void error(Object message) {
        this.log(ERROR, message, (Throwable)null);
    }

    public void error(Object message, Throwable t) {
        this.log(ERROR, message, t);
    }

    public void fatal(Object message) {
        this.log(FATAL, message, (Throwable)null);
    }

    public void fatal(Object message, Throwable t) {
        this.log(FATAL, message, t);
    }


    private static synchronized void initialize() {
        //initialized默认为false
        if (!initialized) {
            initialized = true;
            //读取ClassPath路径下的配置文件log4testng.properties
            InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("log4testng.properties");
            //如果文件存在
            if (is != null) {
                Properties properties = new Properties();

                try {
                    properties.load(is);
                } catch (IOException var3) {
                    throw new RuntimeException(var3);
                }

                checkProperties(properties);
            }
        }
    }

    private static void checkProperties(Properties pProperties) {
        //从配置文件里读key:log4testng.debug
        String rootLevelStr = pProperties.getProperty("log4testng.debug");
        //如有key:log4testng.debug
        if (rootLevelStr != null) {
            //判断如果值=true
            if (rootLevelStr.equalsIgnoreCase("true")) {
                //给debug赋值
                debug = true;
            } else {
                //如果不等于true&&不等于false
                if (!rootLevelStr.equalsIgnoreCase("false")) {
                    //抛出异常
                    throw new IllegalArgumentException("Unknown log4testng.debug value " + rootLevelStr);
                }
                //给debug赋值
                debug = false;
            }
        }

        //打印debug日志,前提是debug=true;
        loglog4testng("log4testng.debug set to " + debug);
        //获取log4testng.rootLogger配置的日志级别
        rootLevelStr = pProperties.getProperty("log4testng.rootLogger");
        //不等于空
        if (rootLevelStr != null) {
            //  取出来赋值给ilevel
            Integer ilevel = (Integer)levelMap.get(rootLevelStr.toUpperCase());
            //赋值失败
            if (ilevel == null) {
                throw new IllegalArgumentException("Unknown level for log4testng.rootLogger " + rootLevelStr + " in log4testng.properties");
            }
            //如果有值将值赋给rootLoggerLevel,默认WARN
            rootLoggerLevel = ilevel;
            loglog4testng("Root level logger set to " + rootLevelStr + " level.");
        }

        //定义了一个集合,将配置文件里的值放到集合里
        Iterator it = pProperties.entrySet().iterator();

        while(it.hasNext()) {
            Entry entry = (Entry)it.next();
            String logger = (String)entry.getKey();
            String level = (String)entry.getValue();
            if (!logger.startsWith("log4testng.")) {
                throw new IllegalArgumentException("Illegal property value: " + logger);
            }
            //如果没有debug和root相关的配置信息,抛出异常
            if (!logger.equals("log4testng.debug") && !logger.equals("log4testng.rootLogger")) {
                if (!logger.startsWith("log4testng.logger.")) {
                    throw new IllegalArgumentException("Illegal property value: " + logger);
                }

                Integer ilevel = (Integer)levelMap.get(level.toUpperCase());
                if (ilevel == null) {
                    throw new IllegalArgumentException("Unknown level " + level + " for logger " + logger + " in log4testng.properties");
                }

                //配置日志级别默认为WARN,如果配置文件有配置,配置优先
                loggerLevels.put(logger.substring("log4testng.logger.".length()), ilevel);
                loglog4testng("logger " + logger + " set to " + ilevel + " level.");
            }
        }

    }

    private static int getLevel(Class pClass) {
        //获取类名
        String name = pClass.getName();
        loglog4testng("Getting level for logger " + name);

        while(true) {
            //根据类名取日志级别
            Integer level = (Integer)loggerLevels.get(name);
            //如果级别不为null
            if (level != null) {
                loglog4testng("Found level " + level + " for logger " + name);
                return level;
            }

            // 返回指定字符在此字符串中最后一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
            int dot = name.lastIndexOf(46);
            //没找到,返回默认配置的日志级别:WARN
            if (dot == -1) {
                loglog4testng("Found level " + rootLoggerLevel + " for root logger");
                return rootLoggerLevel;
            }
            //截取正确的名字
            name = name.substring(0, dot);
        }
    }

    private boolean isLevelEnabled(int pLevel) {
        return this.level <= pLevel;
    }

    private void log(int pLevel, Object pMessage, Throwable pT) {
        if (this.isLevelEnabled(pLevel)) {
            PrintStream ps = pLevel >= ERROR ? err : out;
            if (null != pT) {
                synchronized(ps) {
                    ps.println("[" + this.m_className + "] [" + levelNames[pLevel] + "] " + pMessage);
                    pT.printStackTrace(ps);
                }
            } else {
                ps.println("[" + this.m_className + "] [" + levelNames[pLevel] + "] " + pMessage);
            }
        }

    }

    private static void loglog4testng(String pmessage) {
        if (debug) {
            out.println("[log4testng] [debug] " + pmessage);
        }

    }

    private static synchronized void testInitialize(Properties pProperties, PrintStream pOut, PrintStream pErr) {
        initialized = true;
        loggers.clear();
        rootLoggerLevel = WARN;
        debug = false;
        out = pOut;
        err = pErr;
        checkProperties(pProperties);
    }

    private static void testDebugDefault() {
        Properties props = new Properties();
        ByteArrayOutputStream out1 = new ByteArrayOutputStream();
        ByteArrayOutputStream err1 = new ByteArrayOutputStream();
        PrintStream out2 = new PrintStream(out1);
        PrintStream err2 = new PrintStream(err1);
        props.put("log4testng.rootLogger", "WARN");
        testInitialize(props, out2, err2);
        Assert.assertEquals(out1.toString(), "");
        Assert.assertEquals(err1.toString(), "");
    }

    private static void testDebugOn() {
        Properties props = new Properties();
        ByteArrayOutputStream out1 = new ByteArrayOutputStream();
        ByteArrayOutputStream err1 = new ByteArrayOutputStream();
        PrintStream out2 = new PrintStream(out1);
        PrintStream err2 = new PrintStream(err1);
        props.put("log4testng.debug", "true");
        props.put("log4testng.rootLogger", "WARN");
        testInitialize(props, out2, err2);
        System.out.println(out1.toString());
        Assert.assertTrue(out1.toString().startsWith("[log4testng] [debug]"));

        Assert.assertEquals(err1.toString(), "");
    }

    private static void testDebugOff() {
        Properties props = new Properties();
        ByteArrayOutputStream out1 = new ByteArrayOutputStream();
        ByteArrayOutputStream err1 = new ByteArrayOutputStream();
        PrintStream out2 = new PrintStream(out1);
        PrintStream err2 = new PrintStream(err1);
        props.put("log4testng.debug", "false");
        props.put("log4testng.rootLogger", "WARN");
        testInitialize(props, out2, err2);
        Assert.assertEquals(out1.toString(), "");
        Assert.assertEquals(err1.toString(), "");
    }

    private static void testDebugError() {
        Properties props = new Properties();
        ByteArrayOutputStream out1 = new ByteArrayOutputStream();
        ByteArrayOutputStream err1 = new ByteArrayOutputStream();
        PrintStream out2 = new PrintStream(out1);
        PrintStream err2 = new PrintStream(err1);
        props.put("log4testng.debug", "unknown");
        props.put("log4testng.rootLogger", "WARN");

        try {
            testInitialize(props, out2, err2);
            throw new RuntimeException("failure");
        } catch (IllegalArgumentException var6) {
            Assert.assertEquals(out1.toString(), "");
            Assert.assertEquals(err1.toString(), "");
        }
    }

    private static void testRootLoggerDefault() {
        Properties props = new Properties();
        ByteArrayOutputStream out1 = new ByteArrayOutputStream();
        ByteArrayOutputStream err1 = new ByteArrayOutputStream();
        PrintStream out2 = new PrintStream(out1);
        PrintStream err2 = new PrintStream(err1);
        testInitialize(props, out2, err2);
        Logger1 strLogger = getLogger(String.class);
        strLogger.trace("trace should not appear");
        Assert.assertEquals(out1.toString(), "");
        Assert.assertEquals(err1.toString(), "");
        strLogger.debug("debug should not appear");
        Assert.assertEquals(out1.toString(), "");
        Assert.assertEquals(err1.toString(), "");
        strLogger.info("info should not appear");
        Assert.assertEquals(out1.toString(), "");
        Assert.assertEquals(err1.toString(), "");
        strLogger.warn("warn should appear");
        int outlength = out1.toString().length();
        System.out.println(out1);
        Assert.assertTrue(out1.toString().indexOf("String] [WARN] warn should appear")!=-1);
        Assert.assertEquals(err1.toString(), "");
        strLogger.error("error should appear");
        Assert.assertEquals(out1.toString().length(), outlength);
        Assert.assertTrue(err1.toString().startsWith("[String] [ERROR] error should appear"));
        strLogger.fatal("fatal should appear");
        Assert.assertEquals(out1.toString().length(), outlength);
        Assert.assertTrue(err1.toString().contains("[String] [FATAL] fatal should appear"));
    }

    private static void testRootLoggerSet() {
        Properties props = new Properties();
        ByteArrayOutputStream out1 = new ByteArrayOutputStream();
        ByteArrayOutputStream err1 = new ByteArrayOutputStream();
        PrintStream out2 = new PrintStream(out1);
        PrintStream err2 = new PrintStream(err1);
        props.put("log4testng.rootLogger", "DEBUG");
        testInitialize(props, out2, err2);
        Logger1 strLogger = getLogger(String.class);
        strLogger.trace("trace should appear");
        Assert.assertEquals(out1.toString(), "");
        Assert.assertEquals(err1.toString(), "");
        strLogger.debug("debug should appear");
        Assert.assertTrue(out1.toString().startsWith("[String] [DEBUG] debug should appear"));
        Assert.assertEquals(err1.toString(), "");
    }

    private static void testRootLoggerSetError() {
        Properties props = new Properties();
        ByteArrayOutputStream out1 = new ByteArrayOutputStream();
        ByteArrayOutputStream err1 = new ByteArrayOutputStream();
        PrintStream out2 = new PrintStream(out1);
        PrintStream err2 = new PrintStream(err1);
        props.put("log4testng.rootLogger", "unknown");

        try {
            testInitialize(props, out2, err2);
            throw new RuntimeException("failure");
        } catch (IllegalArgumentException var6) {
            Assert.assertEquals(out1.toString(), "");
            Assert.assertEquals(err1.toString(), "");
        }
    }

    private static void testUserLoggerSet() {
        Properties props = new Properties();
        ByteArrayOutputStream out1 = new ByteArrayOutputStream();
        ByteArrayOutputStream err1 = new ByteArrayOutputStream();
        PrintStream out2 = new PrintStream(out1);
        PrintStream err2 = new PrintStream(err1);
        props.put("log4testng.logger.java.lang.String", "DEBUG");
        testInitialize(props, out2, err2);
        Logger1 strLogger = getLogger(String.class);
        strLogger.trace("trace should not appear");
        Assert.assertEquals(out1.toString(), "");
        Assert.assertEquals(err1.toString(), "");
        strLogger.debug("debug should appear");
        int outLength = out1.toString().length();
        Assert.assertTrue(out1.toString().startsWith("[String] [DEBUG] debug should appear"));
        Assert.assertEquals(err1.toString(), "");
        Logger1 classLogger = getLogger(Class.class);
        classLogger.debug("debug should not appear");
        Assert.assertEquals(out1.toString().length(), outLength);
        Assert.assertEquals(err1.toString(), "");
        classLogger.warn("warn should appear");
        System.out.println(out1);
        Assert.assertTrue(out1.toString().contains("[Class] [WARN] warn should appear"));
        Assert.assertEquals(err1.toString(), "");
    }

    private static void testUserLoggerSetError() {
        Properties props = new Properties();
        ByteArrayOutputStream out1 = new ByteArrayOutputStream();
        ByteArrayOutputStream err1 = new ByteArrayOutputStream();
        PrintStream out2 = new PrintStream(out1);
        PrintStream err2 = new PrintStream(err1);
        props.put("log4testng.logger.java.lang.String", "unknown");

        try {
            testInitialize(props, out2, err2);
            throw new RuntimeException("failure");
        } catch (IllegalArgumentException var6) {
            Assert.assertEquals(out1.toString(), "");
            Assert.assertEquals(err1.toString(), "");
        }
    }

    private static void testUserLoggerSetHierarchy() {
        Properties props = new Properties();
        ByteArrayOutputStream out1 = new ByteArrayOutputStream();
        ByteArrayOutputStream err1 = new ByteArrayOutputStream();
        PrintStream out2 = new PrintStream(out1);
        PrintStream err2 = new PrintStream(err1);
        props.put("log4testng.logger.java.lang", "DEBUG");
        testInitialize(props, out2, err2);
        Logger1 strLogger = getLogger(String.class);
        strLogger.trace("trace should not appear");
        Assert.assertEquals(out1.toString(), "");
        Assert.assertEquals(err1.toString(), "");
        strLogger.debug("debug should appear");
        Assert.assertTrue(out1.toString().startsWith("[String] [DEBUG] debug should appear"));
        Assert.assertEquals(err1.toString(), "");
    }

    public static void main(String[] pArgs) {
//        testDebugDefault();
//        testDebugOn();
//        testDebugOff();
//        testDebugError();
//        testRootLoggerDefault();
//        testRootLoggerSet();
//        testRootLoggerSetError();
//        testUserLoggerSet();
//        testUserLoggerSetError();
//        testUserLoggerSetHierarchy();
        Logger1 logger=Logger1.getLogger(Logger1.class);
        System.out.println(logger);
    }

}

相关文章

网友评论

      本文标题:org.testng.log4testng.Logger

      本文链接:https://www.haomeiwen.com/subject/axaykqtx.html