• 怎样打印日志


    以Slf4j+logbak为例:

      代码如下:

    @Slf4j
    public class TestThrowable {
        public static void main(String args[]){
            try{
                returnNum(new int[]{1});
            }catch (Exception e){
                log.error("错误信息" + e.toString());
                log.info("----------");
                log.error("错误信息" + e.getMessage());
                log.info("----------");
                log.error("错误信息:{}", e.toString());
                log.info("----------");
                log.error("错误信息:{}", e);
                log.info("----------");
                log.error("错误信息:", e);
                log.info("----------");
              log.error("错误码:{} 错误信息:", "0001", e);
            }
        }
        private static int returnNum (int [] arr) {
            if (arr[0] == 1) {
                return returnA(arr);
            }
            return -1;
        }
        private static int returnA (int [] arr) {
            return arr[10];
        }
    }

      运行结果如下:

    16:11:39.307 [main] ERROR com.test.TestThrowable - 错误信息java.lang.ArrayIndexOutOfBoundsException: 10
    16:11:39.314 [main] INFO com.test.TestThrowable - ----------
    16:11:39.314 [main] ERROR com.test.TestThrowable - 错误信息10
    16:11:39.314 [main] INFO com.test.TestThrowable - ----------
    16:11:39.314 [main] ERROR com.test.TestThrowable - 错误信息:java.lang.ArrayIndexOutOfBoundsException: 10
    16:11:39.317 [main] INFO com.test.TestThrowable - ----------
    16:11:39.323 [main] ERROR com.test.TestThrowable - 错误信息:{}
    java.lang.ArrayIndexOutOfBoundsException: 10
        at com.test.TestThrowable.returnA(TestThrowable.java:45)
        at com.test.TestThrowable.returnNum(TestThrowable.java:38)
        at com.test.TestThrowable.main(TestThrowable.java:20)
    16:11:39.324 [main] INFO com.test.TestThrowable - ----------
    16:11:39.324 [main] ERROR com.test.TestThrowable - 错误信息:
    java.lang.ArrayIndexOutOfBoundsException: 10
        at com.test.TestThrowable.returnA(TestThrowable.java:45)
        at com.test.TestThrowable.returnNum(TestThrowable.java:38)
        at com.test.TestThrowable.main(TestThrowable.java:20)
    16:11:39.324 [main] INFO com.test.TestThrowable - ----------
    16:43:54.855 [main] ERROR com.test.TestThrowable - 错误码:0001 错误信息:
    java.lang.ArrayIndexOutOfBoundsException: 10
        at com.test.TestThrowable.returnA(TestThrowable.java:46)
        at com.test.TestThrowable.returnNum(TestThrowable.java:39)
        at com.test.TestThrowable.main(TestThrowable.java:20)

      得到结果:

      1、e.toString()返回异常类型和错误信息描述(堆栈信息不完整,不会显示错误的具体方法,发生在哪行代码)

      2、e.getMessage()返回错误信息描述(堆栈信息不完整,不会显示错误的具体方法,发生在哪行代码)

      3、log.error("xxx"+e.toString()) 打印堆栈信息不完整,不会显示错误的具体方法,发生在哪行代码

      4、log.error("xxx"+e.getMessage()) 打印堆栈信息不完整,不会显示错误的具体方法,发生在哪行代码

      5、log.error("xxx", e) 打印完整的堆栈信息,可以查看到错误发生在哪行代码

      6、log.error("错误码:{} 错误信息:", "0001", e); 这个打印格式是最好的

    ========================================================================================

      Throwable的toString()源码

    /**
         * Returns a short description of this throwable.
         * The result is the concatenation of:
         * <ul>
         * <li> the {@linkplain Class#getName() name} of the class of this object
         * <li> ": " (a colon and a space)
         * <li> the result of invoking this object's {@link #getLocalizedMessage}
         *      method
         * </ul>
         * If {@code getLocalizedMessage} returns {@code null}, then just
         * the class name is returned.
         *
         * @return a string representation of this throwable.
         */
        public String toString() {
            String s = getClass().getName();
            String message = getLocalizedMessage();
            return (message != null) ? (s + ": " + message) : s;
        }

      Throwable的getLocalizedMessage()源码

    /**
         * Creates a localized description of this throwable.
         * Subclasses may override this method in order to produce a
         * locale-specific message.  For subclasses that do not override this
         * method, the default implementation returns the same result as
         * {@code getMessage()}.
         *
         * @return  The localized description of this throwable.
         * @since   JDK1.1
         */
        public String getLocalizedMessage() {
            return getMessage();
        }

      Throwable的getMessage()源码

    /**
         * Returns the detail message string of this throwable.
         *
         * @return  the detail message string of this {@code Throwable} instance
         *          (which may be {@code null}).
         */
        public String getMessage() {
            return detailMessage;
        }

      

      log源码未分析,未完、待续。

  • 相关阅读:
    64位windows 7下配置TortoiseGit(转)
    linux中fork函数详解(转)
    Socket通信的Python实现
    Socket
    浅谈CSRF攻击方式(转)
    Burpsuite常用模块详解以及渗透测试上的运用
    大佬内网渗透技巧的独白(思路篇)
    CTFcrackTools-V3
    厂商要知道的漏洞防护措施
    如何运用kali-xplico网络取证分析?点开看看吧
  • 原文地址:https://www.cnblogs.com/Jin1000x/p/11889040.html
Copyright © 2020-2023  润新知