背景:
最近做服务化拆分过程中,因为要把公共的拦截器如登录相关的封装到API包中,很多拦截器中都有日志的打印。按理说api包中不应该有日志的打印,但是如果去掉重要的日志,那么会很难定位线上的问题。
解决方案一:
原先我们账户提供的API包需要打印一些本地存根的信息,如初始化缓存,本地存根是否取到对象,是否走了dubbo接口。于是参照了下现有的框架的解决方案,写了下面这一段逻辑。让依赖方启动的时候初始化这个bean,然后就可以用这个LogUtil对象来打印日志了。
@Component public class LogUtil implements InitializingBean { public static final Logger accountOpt = LoggerFactory.getLogger("accountOpt"); @Override public void afterPropertiesSet() throws Exception { Properties p = new Properties(); p.setProperty("log4j.category.accountOpt", "INFO" + ",accountOpt"); p.setProperty("log4j.appender.accountOpt", "org.apache.log4j.DailyRollingFileAppender"); p.setProperty("log4j.appender.accountOpt.File", "logs/log/accountOpt.log" ); p.setProperty("log4j.appender.accountOpt.layout", "org.apache.log4j.PatternLayout"); p.setProperty("log4j.appender.accountOpt.maxFileSize ", "100MB" ); p.setProperty("log4j.appender.accountOpt.maxBackupIndex ", " 30"); p.setProperty("log4j.appender.accountOpt.DatePattern ", " '.'yyyy-MM-dd"); p.setProperty("log4j.appender.accountOpt.layout.ConversionPattern", "%d - accountOpt - %c - %p [%t] %x - %m%n"); PropertyConfigurator.configure(p); } } // 使用 LogUtil.accountOpt.info("Account userName:" + userName + " is not in cache");
缺点:
1)依赖API的服务需要依赖log4j才能打印出日志。
2)配置写死在代码里了,比较丑。
3)依赖方需要手动初始化这个bean。
解决方案二:
slf4j(Simple Logging Facade for Java ), API依赖slf4j, 依赖方只要引入相应的slf4j-adapter和相应的底层实现即可。slf4j 使用了Facade模式,为啥为叫这个模式? 看看Facade模式定义吧,为复杂的子系统定义一套简单的接口,子系统就是下面的各种log实现啊,接口就是slf4j啊。通过slf4j也顺带学习了下Facade模式了。
架构如下:
代码实现:
// 依赖方只要配置accountOpt 即可 Logger logger = LoggerFactory.getLogger("accountOpt");
优势:
1)api不关心具体的日志实现,留给依赖方实现,依赖方只要引入自己的适配器jar和底层的实现log即可。
2) 即使api里面引入了相应的log实现,依赖方依然可以exclude相应的实现,做不同的log实现,而且可以打印出API里面的日志。
3)如果api已经依赖了具体的实现,如account-api依赖了log4j。那么应用应用依赖account-api的时候直接exclude掉log4j的东西,直接引入slf4j-log4j-adapter,这个包里面定义了与log4j相同的包相同的接口。所以启动不会报错,而且也不用依赖account-api里面log4j的实现。这一点是周会分享的时候波爷补充的,所以经常发现分享的时候别人往往能够看到你的不足,经常分享吧。
最终选择:
我们的最终选择是API里面使用slf4j,实现里面使用logback,因为据说logback比log4j性能高很多。
相关推荐
"cpp-Blackhole基于属性的日志框架设计模块化和高度可定制" 指出这是一个关于C++编程的项目,名为Blackhole,它是一个日志框架,其核心特性在于属性驱动、模块化设计以及高度的可定制性。这意味着Blackhole允许...
服务化是将复杂系统拆分为一系列独立的服务,每个服务专注于特定功能,通过接口进行交互。京东服务框架强调的是解耦、模块化和高内聚,这有助于提高系统的灵活性和可维护性。 2. 微服务架构: 京东服务框架采用了...
\n\n**异构服务总线的挑战**\n\n在服务化过程中,人人网遇到了异构服务总线的问题。自建REST框架虽然灵活,但无法很好地支持跨语言服务调用。开源ICE虽然提供了一体化的解决方案,但定制和扩展性成为难题。这些挑战...
在本文档中,我们将探讨陌陌服务化架构实践的经验总结和技术要点。 服务化架构的优势 服务化架构的主要优势在于,它能够提高系统的灵活性和可维护性。通过将系统拆分成多个服务单元,每个服务单元可以独立地开发、...
【RPC与SOA:服务化的基础理解】 RPC(Remote Procedure Call)远程过程调用和SOA(Service-Oriented Architecture)...在实际项目中,还需要根据业务需求和团队能力选择合适的工具和技术栈,以实现最佳的服务化实践。
【标题】:“使用Dubbo进行规模服务化前的工程结构优化--源码.rar”涉及到的是在大型项目中采用Dubbo框架进行服务化改造的过程。这个压缩包中的源码提供了从传统非服务化工程向微服务架构转型的具体实现,旨在优化...
陌陌服务化架构实践是基于其在2011年...陌陌服务化架构的实践是一个全面而深入的过程,涵盖了服务拆分、通信协议、架构优化、监控和日志管理等多个方面,这些经验对于其他希望进行服务化转型的企业具有重要的参考价值。
在实施服务化的过程中,人人网首先尝试了自实现REST框架,基于Java和Spring MVC,这简化了开发流程并在UGC(用户生成内容)等领域得到应用。同时,他们也使用了开源的ICE框架,以构建完整的RPC(远程过程调用)架构...
在分布式服务框架中,首要的概念是服务化,即将传统的大而全的单体应用拆分成多个小型、独立的服务,每个服务专注于自身的业务功能。这种解耦使得服务可以独立开发、测试和部署,提高了迭代速度和系统的灵活性。书中...
11. **持续集成/持续部署(CI/CD)**:在分布式服务框架中,如何实现自动化测试、构建和部署,如Jenkins、GitLab CI/CD等工具的使用。 12. **实战案例**:书中可能会包含实际项目中的案例分析,帮助读者理解如何将...
在这个框架中,服务是核心组件,它们可以被多个模块复用,降低了代码的耦合度。 Java应用服务框架的设计原则包括以下几个方面: 1. **模块化**:框架允许将应用拆分为独立的功能模块,每个模块负责特定的业务逻辑...
Flask框架是Python web开发中的轻量级框架,以其简洁和灵活的设计深受开发者喜爱。本项目旨在构建一个基于Flask的通用工程结构,便于后续的复用和扩展。以下是关于"flask框架工程搭建-日志-蓝图"的详细知识点。 1. ...
PB编程框架Kodigo V4.5是一个全新的PowerBuilder应用程序开发框架,专为提升开发效率和服务化编程设计。在深入理解这个框架之前,我们先要了解PowerBuilder(简称PB)的基础知识。 PowerBuilder是一款由Sybase(现...
概述:本资源主要介绍了新浪广告系统服务化优化的实践经验,涉及到微服务架构、RPC 框架选型、服务注册与发现、流量控制、监控与日志分析等多个方面的技术细节。 知识点1:微服务架构 微服务架构是一种软件开发方法...
总的来说,日志服务数据加工通过结构化数据解析,为企业提供了一套高效、灵活且易于管理的日志分析框架,极大地提升了数据的价值挖掘和业务洞察力。无论是数据清理、信息丰富还是数据分发,都能借助其强大工具和集成...
Silky是一个专为.NET Core平台设计的高性能、轻量级的微服务框架,它致力于简化微服务的开发、管理和部署过程,使得开发者能够更高效地构建分布式系统。本项目以"基于silky微服务框架实现的快速应用级开发框架.zip...
- **服务划分**:如何合理地划分服务边界,避免过度分割或集成不足,是服务化设计中的关键挑战。 - **流程抽象**:业务流程的抽象需要深入理解业务逻辑,以及如何通过技术手段有效表达这些逻辑。 - **标准化与灵活性...
容器化部署是微服务实施的关键组成部分,Docker作为一个容器化平台,使得每个服务可以在独立的容器中运行,隔离了环境差异,确保服务在任何环境中都能一致地运行。通过Docker,开发团队可以轻松地打包和部署服务,...
微服务架构是一种现代软件开发的方法论,它提倡将单一应用程序分解为一组小的服务,每个服务都在自己的进程中运行,服务之间通过轻量级通信机制(如HTTP RESTful API)进行交互。这种架构允许团队独立地开发、部署和...
7. 安全性:在HAP框架中,安全性贯穿于整个开发和运行过程。它提供了身份验证、授权、加密等机制,确保系统的安全性和数据的隐私性。 8. 配置中心:HAP框架内置配置中心,允许集中管理和动态更新服务配置,减少了...