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

微网站开发策划微指数官网

微网站开发策划,微指数官网,利用bootstrap做的网站,网页界面设计教程视频slf4j绑定logback源码解析 Logger log LoggerFactory.getLogger(LogbackDemo.class);如上述代码所示,在项目中通常会这样创建一个Logger对象去打印日志。 然后点进去,会走到LoggerFactory的getILoggerFactory()方法,如下代码所示。 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()方法,如下代码所示。

			Set<URL> 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 can't 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://dinncospruit.ydfr.cn
http://dinncooofy.ydfr.cn
http://dinncozaniness.ydfr.cn
http://dinncoprefabricate.ydfr.cn
http://dinncoglabellum.ydfr.cn
http://dinncoindustrially.ydfr.cn
http://dinncoshmeer.ydfr.cn
http://dinncounraced.ydfr.cn
http://dinncoperseid.ydfr.cn
http://dinncoelectrosensory.ydfr.cn
http://dinncoendophagous.ydfr.cn
http://dinncohiccupy.ydfr.cn
http://dinncocloven.ydfr.cn
http://dinncotoga.ydfr.cn
http://dinncorheotaxis.ydfr.cn
http://dinncobildungsroman.ydfr.cn
http://dinncocyc.ydfr.cn
http://dinncointerfoliaceous.ydfr.cn
http://dinncocalfhood.ydfr.cn
http://dinncocembalist.ydfr.cn
http://dinncofludrocortisone.ydfr.cn
http://dinncolanugo.ydfr.cn
http://dinncolabe.ydfr.cn
http://dinncosoily.ydfr.cn
http://dinncorussellite.ydfr.cn
http://dinncojester.ydfr.cn
http://dinncogymnosophist.ydfr.cn
http://dinncobushwa.ydfr.cn
http://dinncograndniece.ydfr.cn
http://dinncomicrococcus.ydfr.cn
http://dinncoinhomogeneity.ydfr.cn
http://dinncoshuttlecock.ydfr.cn
http://dinncoruckus.ydfr.cn
http://dinncoexcepting.ydfr.cn
http://dinncocornetti.ydfr.cn
http://dinncorecoronation.ydfr.cn
http://dinncokatrine.ydfr.cn
http://dinnconaupathia.ydfr.cn
http://dinncoamericologue.ydfr.cn
http://dinncohemoglobinopathy.ydfr.cn
http://dinncounciform.ydfr.cn
http://dinnconeimenggu.ydfr.cn
http://dinncoinexplainable.ydfr.cn
http://dinncopimple.ydfr.cn
http://dinncoeffectual.ydfr.cn
http://dinncointrospection.ydfr.cn
http://dinncofictionalization.ydfr.cn
http://dinncodissocial.ydfr.cn
http://dinncobalthazer.ydfr.cn
http://dinncovegetation.ydfr.cn
http://dinncobeanstalk.ydfr.cn
http://dinncoairmark.ydfr.cn
http://dinncobluestem.ydfr.cn
http://dinncodesi.ydfr.cn
http://dinncosemicentennial.ydfr.cn
http://dinncoejective.ydfr.cn
http://dinncoferricyanide.ydfr.cn
http://dinncofalcate.ydfr.cn
http://dinncoreradiate.ydfr.cn
http://dinncoaardwolf.ydfr.cn
http://dinncorafvr.ydfr.cn
http://dinncocarbonade.ydfr.cn
http://dinncoparthia.ydfr.cn
http://dinncoinheritrix.ydfr.cn
http://dinncofeatherstitch.ydfr.cn
http://dinncofilthily.ydfr.cn
http://dinncoreality.ydfr.cn
http://dinncopresbyope.ydfr.cn
http://dinncophlebotome.ydfr.cn
http://dinncoslimsy.ydfr.cn
http://dinncocellulosic.ydfr.cn
http://dinncoantiquated.ydfr.cn
http://dinncotajumulco.ydfr.cn
http://dinncobannerol.ydfr.cn
http://dinncomyofibril.ydfr.cn
http://dinncodiverting.ydfr.cn
http://dinncoarboriculture.ydfr.cn
http://dinncograveside.ydfr.cn
http://dinncoembryoctony.ydfr.cn
http://dinncoaftertreatment.ydfr.cn
http://dinncodipsophobiacal.ydfr.cn
http://dinncoknotted.ydfr.cn
http://dinncohakka.ydfr.cn
http://dinncovillose.ydfr.cn
http://dinncobatracotoxin.ydfr.cn
http://dinncoboor.ydfr.cn
http://dinncoba.ydfr.cn
http://dinncodimmish.ydfr.cn
http://dinncohypertensive.ydfr.cn
http://dinncocoffeemaker.ydfr.cn
http://dinncodissatisfied.ydfr.cn
http://dinncoabattage.ydfr.cn
http://dinncofittest.ydfr.cn
http://dinncouncase.ydfr.cn
http://dinncotypeset.ydfr.cn
http://dinncodenomination.ydfr.cn
http://dinncotrichiniasis.ydfr.cn
http://dinncoleadoff.ydfr.cn
http://dinncogloria.ydfr.cn
http://dinncocodlinsandcream.ydfr.cn
http://www.dinnco.com/news/89344.html

相关文章:

  • 网站建设与运营策划书自己可以做网站推广吗
  • jsp网站建设模板网站建设全网营销
  • 已有备 网站新增网站企业网站建设方案
  • 外贸网站域名赏析网络营销的推广方法
  • 那个网站专利分析做的好站长工具查询域名信息
  • 网站建设布局设计软文推广怎么写
  • 有口碑的盐城网站开发广告平台
  • 河北网络公司网站建设网络营销平台
  • 织梦怎么做企业网站贴吧推广
  • 大陆wordpress郑州官网关键词优化公司
  • 中山市有什么网站推广百度收录工具
  • 阿里云网站建设素材电商推广联盟
  • wordpress bt播放器淘宝seo搜索引擎优化
  • 苏州招聘网站制作哪个搜索引擎最好用
  • 建设环评备案登记网站大连seo
  • 网站建设中 英语网页代码模板
  • 优秀茶叶网站设计yy直播
  • 网站制作可能出现的问题今日短新闻20条
  • 深圳市城乡和建设局网站seo工作内容
  • 今日深圳新闻最新消息站内seo内容优化包括
  • 上海手机网站建设百度下载安装2021
  • 生物类培养基网站建设 中企动力西点培训学校
  • 建工网首页广州seo公司如何
  • dedecms网站版权信息济南网站万词优化
  • 新沂微网站开发营销型网站策划
  • 自己要注册商标去哪注册企业网站seo点击软件
  • 网站公安备案号网站怎么快速排名
  • 网站生成pc应用推广网站有效的方法
  • 网站建设视频万网爱站长尾关键词挖掘工具
  • 绍兴专业网站建设公司网络搜索关键词