如何使用抛出的参数记录日志?

发布于 2021-01-29 19:37:45

使用java.util.logging.Logger,如何记录参数并抛出异常?

final Object[] params;
final Throwable thrown;

我找不到任何方法log(Level, String, Object[], Throwable)

我应该使用log(Level, String.format(...), Throwable)还是log(Level, Throwable, () -> String.format(...))

关注者
0
被浏览
333
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    有没有办法把两者String并Object[]java.util.logging.Logger中。

    我会转换String[]String并使用:

    public void log(Level level,
                    String msg,
                    Throwable thrown)
    

    您还可以创建log指向的自己的方法,java.util.logging.Logger.log例如:

    public void log(Level level,
                        String msg,
                        Object[] obj,
                        Throwable thrown)
    {
       //StringBuilder buff = ...
       // some string manipulation with 'msg' and 'obj'
       // ...
       log(level, buff.toString(), thrown);
    }
    


  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    总体看来,JUL正在向迈进log(Level, Throwable, () -> String.format(msg, params))。但是,这不使用日志记录参数数组,该数组具有一些带有过滤器的实用程序。

    另一种选择是创建一个辅助方法来构造日志记录,并让调用者对其进行记录:

    public class ThrownWithParams {
    
        private static final Logger logger = Logger.getLogger("test");
    
        public static final void main(String[] args) {
            logger.log(of(logger, Level.SEVERE, new Exception("Fake"),
                    "Test {0}, {1}", "FOO", "BAR"));
        }
    
        private static LogRecord of(Logger l, Level v, Throwable t, String m, Object... p) {
            //Let the caller invoke get/setSourceClassName or get/setSourceMethodName.
            LogRecord r = new LogRecord(v, m);
            r.setLoggerName(l.getName());
            r.setResourceBundleName(l.getResourceBundleName());
            r.setResourceBundle(l.getResourceBundle());
            r.setParameters(p);
            r.setThrown(t);
            return r;
        }
    }
    

    这是理想的,因为调用者记录了该记录,这意味着推断出的源方法和源类名称将是正确的。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看