zoukankan      html  css  js  c++  java
  • Sentinel-Log(JUL)

    在sentinel中日志的处理都是通过RecordLog来进行,那么sentinel是如何日志实现呢?

    如果业务代码中引入了sentinel-logging的话,那么会具体依赖logback等。如果没有,则使用java自带的日志框架JUL实现。对JUL的了解可以查看文章

        static {
            try {
                // Load user-defined logger implementation first.
                // 具体可以参考sentinel-logging中的代码
                logger = LoggerSpiProvider.getLogger(LOGGER_NAME);
                if (logger == null) {
                    // If no customized loggers are provided, we use the default logger based on JUL.
                    logger = new JavaLoggingAdapter(LOGGER_NAME, DEFAULT_LOG_FILENAME);
                }
            } catch (Throwable t) {
                System.err.println("Error: failed to initialize Sentinel RecordLog");
                t.printStackTrace();
            }
        }

    接下来具体介绍sentinel是如何实现JUL的。

    在logger初始化的时候定义了logHander,具体的handler都是自定义的,主要是输出文件DataFileLogHandler和控制台ConsoleHandler

    public class JavaLoggingAdapter extends BaseJulLogger implements Logger {
    
        private final String loggerName;
        private final String fileNamePattern;
    
        private final java.util.logging.Logger julLogger;
        private final Handler logHandler;
    
        public JavaLoggingAdapter(String loggerName, String fileNamePattern) {
            AssertUtil.assertNotBlank(loggerName, "loggerName cannot be blank");
            AssertUtil.assertNotBlank(fileNamePattern, "fileNamePattern cannot be blank");
            this.loggerName = loggerName;
            this.fileNamePattern = fileNamePattern;
    
            this.julLogger = java.util.logging.Logger.getLogger(loggerName);
            this.logHandler = makeLoggingHandler(fileNamePattern, julLogger);
        }

    以及打印格式CspFormatter,并设置默认的日志级别为INFO ,具体读者可以查看源代码makeLoggingHandler,这里就不阐述了  。

    当打印Info日志的时候,执行   log(julLogger, logHandler, Level.INFO, msg, e)

    protected void log(Logger logger, Handler handler, Level level, String detail, Throwable throwable) {
            if (detail == null) {
                return;
            }
            /**
             * 移除非handler的其他handler,并添加handler
             */
            disableOtherHandlers(logger, handler);
            logger.log(level, detail, throwable);
        }
  • 相关阅读:
    《ASP.NET1200例》实现投票的用户控件
    《转》这些年这些感悟
    《转》不要过打折的生活,当你发现这些你有了,说明你开始成熟了
    HTML控件ID和NAME属性及在CS页面获得.ASPX页面中HTML控件的值
    逻辑回归(1)
    MySQL笔记5-----索引(覆盖索引等)
    MySQL笔记4------面试问题
    MySQL-----笔记3:存储引擎
    Python可视化数据------seaborn
    树(2)-----leetcode(层、深度、节点)
  • 原文地址:https://www.cnblogs.com/gaojy/p/15291357.html
Copyright © 2011-2022 走看看