当前位置: 首页 > news >正文

vps正常网站打不开linux网站建设

vps正常网站打不开,linux网站建设,手机在线设计,互动平台游戏slf4j绑定logback源码解析 Logger log LoggerFactory.getLogger(LogbackDemo.class);如上述代码所示#xff0c;在项目中通常会这样创建一个Logger对象去打印日志。 然后点进去#xff0c;会走到LoggerFactory的getILoggerFactory()方法#xff0c;如下代码所示。 public …slf4j绑定logback源码解析 Logger log LoggerFactory.getLogger(LogbackDemo.class);如上述代码所示在项目中通常会这样创建一个Logger对象去打印日志。 然后点进去会走到LoggerFactory的getILoggerFactory()方法如下代码所示。 public static ILoggerFactory getILoggerFactory() {if (INITIALIZATION_STATE UNINITIALIZED) {synchronized (LoggerFactory.class) {if (INITIALIZATION_STATE UNINITIALIZED) {INITIALIZATION_STATE ONGOING_INITIALIZATION;performInitialization();}}}switch (INITIALIZATION_STATE) {case SUCCESSFUL_INITIALIZATION:return StaticLoggerBinder.getSingleton().getLoggerFactory();case NOP_FALLBACK_INITIALIZATION:return NOP_FALLBACK_FACTORY;case FAILED_INITIALIZATION:throw new IllegalStateException(UNSUCCESSFUL_INIT_MSG);case ONGOING_INITIALIZATION:// support re-entrant behavior.// See also http://jira.qos.ch/browse/SLF4J-97return SUBST_FACTORY;}throw new IllegalStateException(Unreachable code);}performInitialization()方法表示执行初始化点进去会调用到LoggerFactory的bind()方法如下代码所示。 SetURL staticLoggerBinderPathSet null;if (!isAndroid()) {// 查找org/slf4j/impl/StaticLoggerBinder.class这个类的路径staticLoggerBinderPathSet findPossibleStaticLoggerBinderPathSet();// 如果有多个则打印Class path contains multiple SLF4J bindingsreportMultipleBindingAmbiguity(staticLoggerBinderPathSet);}// StaticLoggerBinder类是各个日志框架提供的比如logback如下图所示StaticLoggerBinder.getSingleton();INITIALIZATION_STATE SUCCESSFUL_INITIALIZATION;reportActualBinding(staticLoggerBinderPathSet);fixSubstituteLoggers();replayEvents();// release all resources in SUBST_FACTORYSUBST_FACTORY.clear();StaticLoggerBinder类加载时会执行初始化如下代码所示。 static {SINGLETON.init();}void init() {try {try {// 这里会完成logback的自动配置new ContextInitializer(defaultLoggerContext).autoConfig();} catch (JoranException je) {Util.report(Failed to auto configure default logger context, je);}// logback-292if (!StatusUtil.contextHasStatusListener(defaultLoggerContext)) {StatusPrinter.printInCaseOfErrorsOrWarnings(defaultLoggerContext);}contextSelectorBinder.init(defaultLoggerContext, KEY);initialized true;} catch (Exception t) { // see LOGBACK-1159Util.report(Failed to instantiate [ LoggerContext.class.getName() ], t);}}logback源码解析 ContextInitializer.autoConfig()方法源码如下 public void autoConfig() throws JoranException {StatusListenerConfigHelper.installIfAsked(loggerContext);// 查找配置文件优先级系统属性logback.configurationFile logback-test.xml logback.xmlURL url findURLOfDefaultConfigurationFile(true);if (url ! null) {configureByResource(url);} else {// 使用java的spi机制查找Configurator的实现如果有则自动配置logbackConfigurator c EnvUtil.loadFromServiceLoader(Configurator.class);if (c ! null) {try {c.setContext(loggerContext);c.configure(loggerContext);} catch (Exception e) {throw new LogbackException(String.format(Failed to initialize Configurator: %s using ServiceLoader, c ! null ? c.getClass().getCanonicalName() : null), e);}} else {// 使用默认的BasicConfigurator来自动配置logbackBasicConfigurator basicConfigurator new BasicConfigurator();basicConfigurator.setContext(loggerContext);basicConfigurator.configure(loggerContext);}}}spring boot初始化logback流程 Spring Boot启动的时候由org.springframework.boot.context.logging.LoggingApplicationListener根据情况初始化并使用。 在spring 初始化启动的过程中会根据生命周期的不同阶段发出对应的动作。这就是Spring ApplicationListener设计基于观察者模式而其中LoggingApplicationListener类便是负责logging日志框架的初始化操作。 LoggingApplicationListener被配置在spring-boot-x.x.x.jar的spring.factories文件中spring启动的时候会去读取这个文件。 LoggingApplicationListener.onApplicationEvent()方法源码如下。 public void onApplicationEvent(ApplicationEvent event) {if (event instanceof ApplicationStartingEvent) {onApplicationStartingEvent((ApplicationStartingEvent) event);}else if (event instanceof ApplicationEnvironmentPreparedEvent) {onApplicationEnvironmentPreparedEvent((ApplicationEnvironmentPreparedEvent) event);}else if (event instanceof ApplicationPreparedEvent) {onApplicationPreparedEvent((ApplicationPreparedEvent) event);}else if (event instanceof ContextClosedEvent ((ContextClosedEvent) event).getApplicationContext().getParent() null) {onContextClosedEvent();}else if (event instanceof ApplicationFailedEvent) {onApplicationFailedEvent();}}第一个事件就是ApplicationStartingEvent了点进去到LoggingSystem.get()方法。 因此最终返回出去的是LogbackLoggingSystem对象然后执行loggingSystem.beforeInitialize()方法beforeInitialize会使用到logback的StaticLoggerBinder类因此会读取logback.xml完成logback的初始化。 第二个事件是ApplicationEnvironmentPreparedEvent会执行日志系统的初始化。 protected void initialize(ConfigurableEnvironment environment, ClassLoader classLoader) {new LoggingSystemProperties(environment).apply();this.logFile LogFile.get(environment);if (this.logFile ! null) {this.logFile.applyToSystemProperties();}this.loggerGroups new LoggerGroups(DEFAULT_GROUP_LOGGERS);initializeEarlyLoggingLevel(environment);initializeSystem(environment, this.loggingSystem, this.logFile);initializeFinalLoggingLevels(environment, this.loggingSystem);registerShutdownHookIfNecessary(environment, this.loggingSystem);}// 主要看initializeSystem方法private void initializeSystem(ConfigurableEnvironment environment, LoggingSystem system, LogFile logFile) {LoggingInitializationContext initializationContext new LoggingInitializationContext(environment);// 如果application.yml里指定了logging.config则使用指定的文件初始化否则按默认处理String logConfig environment.getProperty(CONFIG_PROPERTY);if (ignoreLogConfig(logConfig)) {system.initialize(initializationContext, null, logFile);}else {try {ResourceUtils.getURL(logConfig).openStream().close();system.initialize(initializationContext, logConfig, logFile);}catch (Exception ex) {// NOTE: We cant use the logger here to report the problemSystem.err.println(Logging system failed to initialize using configuration from logConfig );ex.printStackTrace(System.err);throw new IllegalStateException(ex);}}}// 下面会走到LogbackLoggingSystem.initialize()方法public void initialize(LoggingInitializationContext initializationContext, String configLocation, LogFile logFile) {LoggerContext loggerContext getLoggerContext();if (isAlreadyInitialized(loggerContext)) {return;}super.initialize(initializationContext, configLocation, logFile);loggerContext.getTurboFilterList().remove(FILTER);markAsInitialized(loggerContext);if (StringUtils.hasText(System.getProperty(CONFIGURATION_FILE_PROPERTY))) {getLogger(LogbackLoggingSystem.class.getName()).warn(Ignoring CONFIGURATION_FILE_PROPERTY system property. Please use logging.config instead.);}}// 再到AbstractLoggingSystem.initialize()方法public void initialize(LoggingInitializationContext initializationContext, String configLocation, LogFile logFile) {if (StringUtils.hasLength(configLocation)) {initializeWithSpecificConfig(initializationContext, configLocation, logFile);return;}initializeWithConventions(initializationContext, logFile);}// 再到initializeWithConventions方法private void initializeWithConventions(LoggingInitializationContext initializationContext, LogFile logFile) {// 查找logback自己的配置文件logback-test.xml、logback.xmlString config getSelfInitializationConfig();if (config ! null logFile null) {// logback在前面第一次使用StaticLoggerBinder时已经完成了初始化这里会重新初始化一次reinitialize(initializationContext);return;}if (config null) {// 获取logback-spring.xmlconfig getSpringInitializationConfig();}if (config ! null) {// 加载配置logback-spring.xmlloadConfiguration(initializationContext, config, logFile);return;}// 加载默认配置loadDefaults(initializationContext, logFile);}// reinitialize方法会走到LogbackLoggingSystem.configureByResourceUrl()方法这里使用了SpringBootJoranConfiguratorprivate void configureByResourceUrl(LoggingInitializationContext initializationContext, LoggerContext loggerContext,URL url) throws JoranException {if (url.toString().endsWith(xml)) {JoranConfigurator configurator new SpringBootJoranConfigurator(initializationContext);configurator.setContext(loggerContext);configurator.doConfigure(url);}else {// 否则使用logback的ContextInitializer进行初始化这就不支持springProperty标签new ContextInitializer(loggerContext).configureByResource(url);}}// SpringBootJoranConfigurator添加了额外的规则如springProperty标签class SpringBootJoranConfigurator extends JoranConfigurator {Overridepublic void addInstanceRules(RuleStore rs) {super.addInstanceRules(rs);Environment environment this.initializationContext.getEnvironment();rs.addRule(new ElementSelector(configuration/springProperty), new SpringPropertyAction(environment));rs.addRule(new ElementSelector(*/springProfile), new SpringProfileAction(environment));rs.addRule(new ElementSelector(*/springProfile/*), new NOPAction());}}
http://www.w-s-a.com/news/920385/

相关文章:

  • 福州网站快速排名在一个网站的各虚拟目录中默认文档的文件名要相同
  • 网站开发 流程图网站开发用哪个linux
  • 怎么用自己电脑做服务器发布网站吗seo门户网价格是多少钱
  • 备案网站可以做影视站网站400
  • 四川住房与城乡建设部网站注册登记
  • 网站建设第三方沈阳工程最新动态
  • 兰州做网站客户上海企业在线登记
  • 新乡公司做网站wordpress被大量注册
  • 小语种服务网站公众号平台建设网站
  • 免费做mc皮肤网站企业网站建设合同模板
  • 做网站可以申请个体户么网站的定位分析
  • jsp做的零食网站下载wordpress侧边栏折叠
  • 帝国网站单页做301南京旅游网站建设公司
  • 网站sem优化怎么做网站建设推广安徽
  • 比较好的室内设计网站潍坊网络科技
  • 南宁网站建设公设计联盟网站
  • 多个图表统计的网站怎么做百度推广费2800元每年都有吗
  • 连江县住房和城乡建设局网站企业类网站模版
  • 临沂seo整站优化厂家网站建设 大公司排名
  • 网站开发有哪些方式百度导航怎么下载
  • 网站认证免费视频直播网站建设方案
  • 瀑布流分享网站源代码下载网站构建的一般流程是什么
  • wordpress 4.9 多站wordpress邮箱解析
  • 微信网站开发企业汽车网站设计模板
  • 如何提升网站转化率遵义市公共资源交易平台
  • 网站目录管理模板企业解决方案部
  • 建设网站上申请劳务资质吗珠海哪个公司建设网站好
  • c2c商城网站建设在微信怎么开发公众号
  • 美的公司网站建设的目的做个网站要钱吗
  • 和县建设局网站孟州网站建设