背景:
最近做服务化拆分过程中,因为要把公共的拦截器如登录相关的封装到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性能高很多。
相关推荐
采用一种算法,将中英文本中的字符拆分开来,形成词汇,以待用户输入关健字后搜索 流程 步一:按分词器拆分出词汇 步二:去除停用词和禁用词 步三:如果有英文,把英文字母转为小写,即搜索不分大小写 ...
项目Maven构建,真实大型互联网架构,做到高并发,大数据处理,整个项目使用定制化服务思想,提供模块化、服务化、原子化的方案,将功能模块进行拆分,可以公用到所有的项目中。架构采用分布式部署架构,所有模块...
采用微内核实现Autoscan、AOP、IoC、Event等,涵盖SSH框架中绝大部分核心功能;统一配置体系结构,感受不一样的文件资源配置及管理模式;整合多种日志系统(log4j、jcl、slf4j)、日志文件可分离存储;轻量级持久化...
典型用户群体使用毫秒服务引擎,用户可以快速拥有一套具备监控、名字发现服务、负载均衡、灰度发布、配置管理、日志、kv存储等功能的系统化的开发与运营框架,特别适合互联网初创公司。10年的海量服务开发运营经验和...
rpc服务化,支持hprose、yar等, 支持xhprof性能调试。requirementphp 5.3 ...
包括服务拆分、服务间通信、服务治理等方面的实践经验。 部署和运维:讨论了微服务架构的部署和运维问题,包括容器化部署、持续集成和持续交付、监控和日志管理等方面。 微服务架构的最佳实践:总结了一些微服务...
Alita是一套基于Umi的移动端框架,是面向场景化的开发提效方案。通过整合业务流程、简化技术开发,使得开发者能够更专注于业务能力的提升。 最刚开始只是作为一个umi的配置简化的脚手架,后来经过吸收社区的需求,...
器化技术、自动化部署、服务网格、无服务器计算、应用 程序编程接口(Application Programming Interface, API)管理、数据一致性解决方案、分布式缓存、负载均衡、 复杂事件处理和分布式事务管理等方面[1]。Java...
技术实现事务管理、服务日志、统一异常处理,在远程服务调用中使用RPC Context实现上下文管理,持久化框架采用Hibernate、Mybatis双框架兼容设计,使用数据访问代理服务,实现分库分表环境下的透明数据访问。...
平常开发游戏逻辑也得开启一大堆进程,不仅启动慢,而且查找问题及其不方便,要在一堆堆日志里面查问题,这感觉非常糟糕,这么多年也没人解决这个问题。ET框架使用了类似守望先锋的组件设计,所有服务端内容都拆成了...
在Java语言中重要的两个以SOAP技术开始的网络服务框架XFire和Axis也把REST作为自己的另一种选择。它们的新的项目分别是ApacheCXF和Axis2.Java语言也制定关于REST网络服务规范:JAX-RS:JavaAPIforRESTfulWebServices...
创建一个单文件页模型,在【文件】按钮中选择【新建文件】选项,在弹出对话框中选择【Web窗体】或在右击当前项目,在下拉菜单中选择【添加新建项】选项即可创建一个.aspx页面,如图4-2所示。 图4-2 创建单文件页...
可视化器中的静音通知(非常适合自动音频文件拆分) Google Speech API 识别服务 修复了一些可视化器错误 ###Okt 14。 移除 PocketSphinx HTTP Web 服务识别器实现框架(即将推出: Recognition Service) 录
- `unicorn-sys-api` Sys Module基础实体及API,方便服务拆分 - `unicorn-security` 系统权限模块,包含权限配置管理等。 - `unicorn-logging` 系统的日志模块,其他模块如果需要记录日志需要引入该模块,亦可自行...
实例020 Dreamweaver中编码格式的选择 35 实例021 Dreamweaver中创建表格 36 实例022 在表格中插入宠物照片 38 实例023 Dreamweaver创建表单 40 实例024 Dreamweaver中创建和附加CSS样式 42 实例025 Dreamweaver控制...
实例020 Dreamweaver中编码格式的选择 35 实例021 Dreamweaver中创建表格 36 实例022 在表格中插入宠物照片 38 实例023 Dreamweaver创建表单 40 实例024 Dreamweaver中创建和附加CSS样式 42 实例025 Dreamweaver控制...
于是我将自己对分布式的理解融入到这个框架中,考虑到底层实现技术的相似性,我将Hadoop,Zookeeper,MQ,分布式缓存四大主要的分布式计算功能合为一个框架内,对复杂的分布式计算应用进行了大量简化和归纳。...
数据采集模块会将采集到的各种类型的 数据传送到Hadoop的并行处理系统架构中,然后信息数据被保存到HDFS中,传送的数据 会被Hadoop体系中的MapReduce并行计算编程模型作为框架来进行系统化处理,MapRedu ce分布式的...
73 <br>0106 如何获得一个字符串中数字的长度 74 <br>0107 如何获得字符串中数字或字母的长度 74 <br>0108 如何获得字符串中某个数字的位置 75 <br>0109 获得字符串中汉字的个数 76 <br>0110...
MVC模式架构 √ 全站采用mvc架构,APP使用主流框架 商城可视化编辑 √ 商城专题及商家店铺均可采取可视化编辑,应用更灵活 安装环境 支持PHP5.3以上环境 √ 高性能PHP版本 安全防护加固 数据备份 √ 支持数据备份...