`

服务化拆分过程中的日志框架选择

 
阅读更多

 

    背景:

      最近做服务化拆分过程中,因为要把公共的拦截器如登录相关的封装到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性能高很多。

    

     

 

 

  • 大小: 12.9 KB
分享到:
评论

相关推荐

    Java EE常用框架.xmind

    采用一种算法,将中英文本中的字符拆分开来,形成词汇,以待用户输入关健字后搜索 流程 步一:按分词器拆分出词汇 步二:去除停用词和禁用词 步三:如果有英文,把英文字母转为小写,即搜索不分大小写 ...

    Java源码 SpringMVC Mybatis Shiro Bootstrap Rest Webservice

    项目Maven构建,真实大型互联网架构,做到高并发,大数据处理,整个项目使用定制化服务思想,提供模块化、服务化、原子化的方案,将功能模块进行拆分,可以公用到所有的项目中。架构采用分布式部署架构,所有模块...

    YMP轻量级Java应用开发框架 v2.0.6

    采用微内核实现Autoscan、AOP、IoC、Event等,涵盖SSH框架中绝大部分核心功能;统一配置体系结构,感受不一样的文件资源配置及管理模式;整合多种日志系统(log4j、jcl、slf4j)、日志文件可分离存储;轻量级持久化...

    腾讯开源的分布式毫秒服务引擎 msec.zip

    典型用户群体使用毫秒服务引擎,用户可以快速拥有一套具备监控、名字发现服务、负载均衡、灰度发布、配置管理、日志、kv存储等功能的系统化的开发与运营框架,特别适合互联网初创公司。10年的海量服务开发运营经验和...

    PHP应用开发框架yaf-lib.zip

    rpc服务化,支持hprose、yar等, 支持xhprof性能调试。requirementphp 5.3 ...

    这本书介绍了如何使用 Spring Boot 和 Spring Cloud 构建微服务架构,是一个很好的学习资源

    包括服务拆分、服务间通信、服务治理等方面的实践经验。 部署和运维:讨论了微服务架构的部署和运维问题,包括容器化部署、持续集成和持续交付、监控和日志管理等方面。 微服务架构的最佳实践:总结了一些微服务...

    Alita基于Umi的场景化框架-其他

    Alita是一套基于Umi的移动端框架,是面向场景化的开发提效方案。通过整合业务流程、简化技术开发,使得开发者能够更专注于业务能力的提升。 最刚开始只是作为一个umi的配置简化的脚手架,后来经过吸收社区的需求,...

    分布式系统中Java后端开发技术及其应用实践.pdf

    器化技术、自动化部署、服务网格、无服务器计算、应用 程序编程接口(Application Programming Interface, API)管理、数据一致性解决方案、分布式缓存、负载均衡、 复杂事件处理和分布式事务管理等方面[1]。Java...

    计算机软件项目设计方案(2020).docx

    技术实现事务管理、服务日志、统一异常处理,在远程服务调用中使用RPC Context实现上下文管理,持久化框架采用Hibernate、Mybatis双框架兼容设计,使用数据访问代理服务,实现分库分表环境下的透明数据访问。...

    java版斗地主源码-Card_All:ET框架棋牌演示

    平常开发游戏逻辑也得开启一大堆进程,不仅启动慢,而且查找问题及其不方便,要在一堆堆日志里面查问题,这感觉非常糟糕,这么多年也没人解决这个问题。ET框架使用了类似守望先锋的组件设计,所有服务端内容都拆成了...

    ASP EXCEL导入SQL

    在Java语言中重要的两个以SOAP技术开始的网络服务框架XFire和Axis也把REST作为自己的另一种选择。它们的新的项目分别是ApacheCXF和Axis2.Java语言也制定关于REST网络服务规范:JAX-RS:JavaAPIforRESTfulWebServices...

    ASP.NET的网页代码模型及生命周期

    创建一个单文件页模型,在【文件】按钮中选择【新建文件】选项,在弹出对话框中选择【Web窗体】或在右击当前项目,在下拉菜单中选择【添加新建项】选项即可创建一个.aspx页面,如图4-2所示。 图4-2 创建单文件页...

    android-continuous-voice:我的硕士论文的一部分 2014

    可视化器中的静音通知(非常适合自动音频文件拆分) Google Speech API 识别服务 修复了一些可视化器错误 ###Okt 14。 移除 PocketSphinx HTTP Web 服务识别器实现框架(即将推出: Recognition Service) 录

    基于最新的Java 21和SpringBoot 3.2 根据eladmin项目进行改造+源代码+文档说明

    - `unicorn-sys-api` Sys Module基础实体及API,方便服务拆分 - `unicorn-security` 系统权限模块,包含权限配置管理等。 - `unicorn-logging` 系统的日志模块,其他模块如果需要记录日志需要引入该模块,亦可自行...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例020 Dreamweaver中编码格式的选择 35 实例021 Dreamweaver中创建表格 36 实例022 在表格中插入宠物照片 38 实例023 Dreamweaver创建表单 40 实例024 Dreamweaver中创建和附加CSS样式 42 实例025 Dreamweaver控制...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例020 Dreamweaver中编码格式的选择 35 实例021 Dreamweaver中创建表格 36 实例022 在表格中插入宠物照片 38 实例023 Dreamweaver创建表单 40 实例024 Dreamweaver中创建和附加CSS样式 42 实例025 Dreamweaver控制...

    fourinone-3.04.25

    于是我将自己对分布式的理解融入到这个框架中,考虑到底层实现技术的相似性,我将Hadoop,Zookeeper,MQ,分布式缓存四大主要的分布式计算功能合为一个框架内,对复杂的分布式计算应用进行了大量简化和归纳。...

    基于大数据的数据分析系统架构.doc

    数据采集模块会将采集到的各种类型的 数据传送到Hadoop的并行处理系统架构中,然后信息数据被保存到HDFS中,传送的数据 会被Hadoop体系中的MapReduce并行计算编程模型作为框架来进行系统化处理,MapRedu ce分布式的...

    C#编程经验技巧宝典

    73 <br>0106 如何获得一个字符串中数字的长度 74 <br>0107 如何获得字符串中数字或字母的长度 74 <br>0108 如何获得字符串中某个数字的位置 75 <br>0109 获得字符串中汉字的个数 76 <br>0110...

    Shopnc b2b2c 好商城V5 33hao-V5完整源码.zip

    MVC模式架构 √ 全站采用mvc架构,APP使用主流框架 商城可视化编辑 √ 商城专题及商家店铺均可采取可视化编辑,应用更灵活 安装环境 支持PHP5.3以上环境 √ 高性能PHP版本 安全防护加固 数据备份 √ 支持数据备份...

Global site tag (gtag.js) - Google Analytics