




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
如果对于commons-loging 、log4j 、slf4j 、LogBack 等都已经非常清楚了,可以忽略本文。几次解决日志冲突问题时对这几个概念的简单总结,希望对这块基础没有理解透的同学能有所帮助,当然如果对这块有更深刻理解的同学,也贡献出自己的知识和见解。一、 概念Commons-logging: apache最早提供的日志的门面接口。避免和具体的日志方案直接耦合。类似于JDBC 的api 接口,具体的的JDBC driver 实现由各数据库提供商实现。通过统一接口解耦,不过其内部也实现了一些简单日志方案。Log4j: 经典的一种日志解决方案。内部把日志系统抽象封装成Logger 、appender 、pattern 等实现。我们可以通过配置文件轻松的实现日志系统的管理和多样化配置。Slf4j: 全称为Simple Logging Facade for JAVA:java简单日志门面。 是对不同日志框架提供的一个门面封装。可以在部署的时候不修改任何配置即可接入一种日志实现方案。和commons-loging 应该有一样的初衷。个人感觉设从计上更好一些,没有commons 那么多潜规则。同时有两个额外特点:1. 能支持多个参数,并通过 占位符进行替换,避免老写logger.isXXXEnabled 这种无奈的判断,带来性能提升见:/faq.html#logging_performance 。2.OSGI 机制更好兼容支持一图胜千言,官网上的一个图:从上图可以发现,选择还是很多的。Logback: LOGBack 作为一个通用可靠、快速灵活的日志框架,将作为Log4j 的替代和SLF4J 组成新的日志系统的完整实现。官网上称具有极佳的性能,在关键路径上执行速度是log4j 的10 倍,且内存消耗更少。具体优势见:http:/logback.qos.ch/reasonsToSwitch.html二、 常见日志方案和注意事项1.Commons-logging+log4j: 经典的一个日志实现方案。出现在各种框架里。如spring 、webx 、ibatis 等等。直接使用log4j 即可满足我们的日志方案。但是一般为了避免直接依赖具体的日志实现,一般都是结合commons-logging 来实现。常见代码如下:import mons.logging.Log;import mons.logging.LogFactory;private static Log logger = LogFactory.getLog(CommonsLoggingTest.class);代码上,没有依赖任何的log4j 内部的类。那么log4j 是如何被装载的?Log 是一个接口声明。LogFactory 的内部会去装载具体的日志系统,并获得实现该Log 接口的实现类。而内部有一个Log4JLogger 实现类对Log 接口同时内部提供了对log4j logger 的代理。LogFactory 内部装载日志系统流程:1. 首先,寻找mons.logging.LogFactory 属性配置2. 否则,利用JDK1.3 开始提供的service 发现机制,会扫描classpah 下的META-INF/services/mons.logging.LogFactory 文件,若找到则装载里面的配置,使用里面的配置。3. 否则,从Classpath 里寻找perties ,找到则根据里面的配置加载。4. 否则,使用默认的配置:如果能找到Log4j 则默认使用log4j 实现,如果没有则使用JDK14Logger 实现,再没有则使用commons-logging 内部提供的SimpleLog 实现。从上述加载流程来看,如果没有做任何配置,只要引入了log4j 并在classpath 配置了log4j.xml ,则commons-logging 就会使log4j 使用正常,而代码里不需要依赖任何log4j 的代码。2.Commons-logging+log4j+slf4j如果在原有commons-logging 系统里,如果要迁移到slf4j, 使用slf4j 替换commons-logging ,也是可以做到的。原理使用到了上述commons-logging 加载的第二点。需要引入Org.slf4j.jcl-over-slf4j-1.5.6.jar 。这个jar 包提供了一个桥接,让底层实现是基于slf4j 。原理是在该jar 包里存放了配置META-INF/services/mons.logging.LogFactory =mons.logging.impl.SLF4JLogFactory ,而commons-logging 在初始化的时候会找到这个serviceId ,并把它作为LogFactory 。完成桥接后,那么那么简单日志门面SLF4J 内部又是如何来装载合适的log 呢?原理是SLF4J 会在编译时会绑定import org.slf4j.impl.StaticLoggerBinder; 该类里面实现对具体日志方案的绑定接入。任何一种基于slf4j 的实现都要有一个这个类。如:org.slf4j.slf4j-log4j12-1.5.6: 提供对 log4j 的一种适配实现。Org.slf4j.slf4j-simple-1.5.6: 是一种 simple 实现,会将 log 直接打到控制台。那么这个地方就要注意了:如果有任意两个实现slf4j 的包同时出现,那就有可能酿就悲剧,你可能会发现日志不见了、或都打到控制台了。原因是这两个jar 包里都有各自的org.slf4j.impl.StaticLoggerBinder ,编译时候绑定的是哪个是不确定的。这个地方要特别注意!出现过几次因为这个导致日志错乱的问题。3.Slf4j+logbackSlf4j 和log4j 作者都是同一个人。Logback 号称在性能各方面有很多优势,也很诱人。直接使用SLf4j 也很简单:import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class HelloWorld public static void main(String args) Logger logger = LoggerFactory.getLogger(HelloWorld.class); (Hello World); 代码里也看不到任何具体日志实现方案的痕迹。Logback 没用过,看到过一些诱人介绍。具体大家可以去研究。logback 。注意事项使用日志配置的时候一定要明白需求,同时避免冲突。如使用SLF4j 的时候为了避免冲突,一定要保障只有一种实现类jar 包在里面。当遇到日志错乱等问题时,可以从这几个方面来排查一. Log4j+commons-logging JAR包lcommons-logging-1.1.jarlog4j-1.2.15.jar 配置文件pertieslog4j.xml commons-logging.jar包读取perties中指定的log,自动加载日志配置l在commons-logging+log4j组合中perties指定的日志为:mons.logging.Log=mons.logging.impl.Log4JLogger log4j指定具体日志输出配置l 如果未选用commons-logging,可以在启动项目中,主动加载log4j的配置文件l二. Logback+slf4j JAR包lslf4j-api-1.5.2.jarlogback-classic-0.9.9.jarlogback-core-0.9.9.jar 配置文件lLogback.xml logback的加载采用编码加载lJava代码1. StringlogbackCfg=/config/logback.xml; 2. URLlogURL=newClassPathResource(logbackCfg).getURL(); 3. ILoggerFactoryloggerFactory=LoggerFactory.getILoggerFactory(); 4. LoggerContextloggerContext=(LoggerContext)loggerFactory; 5. loggerContext.shutdownAndReset(); 6. JoranConfiguratorconfigurator=newJoranConfigurator(); 7. configurator.setContext(loggerContext); 8. configurator.doConfigure(logURL);javaview plaincopy1. StringlogbackCfg=/config/logback.xml;2. URLlogURL=newClassPathResource(logbackCfg).getURL();3. ILoggerFactoryloggerFactory=LoggerFactory.getILoggerFactory();4. LoggerContextloggerContext=(LoggerContext)loggerFactory;5. loggerContext.shutdownAndReset();6. JoranConfiguratorconfigurator=newJoranConfigurator();7. configurator.setContext(loggerContext);8. configurator.doConfigure(logURL);三. Slf4j+log4j JAR包lslf4j-api-1.5.2.jarslf4j-log4j12-1.5.2.jarlog4j-1.2.15.jar 配置文件lLogback.xml四. Slf4j+logback+logback注:这种情况下是项目中有log4j输出的日志以及logback数据的日志.老项目改造,log4j和logback共存的情况下.(当选用spring+slf4j+logback的时候,spring的日志输出是log4j的,这个时候采用这种配置.) JARbaollog4j-over-slf4j-1.5.2.jarlogback-classic-0.9.9.jarlogback-core-0.9.9.jarslf4j-api-1.5.2.jar 配置文件lLogback.xml 配置加载lJava代码1. StringlogbackCfg=/config/logback.xml; 2. URLlogURL=newClassPathResource(logbackCfg).getURL(); 3. ILoggerFactoryloggerFactory=LoggerFactory.getILoggerFactory(); 4. LoggerContextloggerContext=(LoggerContext)loggerFactory; 5. loggerContext.shutdownAndReset(); 6. JoranConfiguratorconfigurator=newJoranConfigurator(); 7. configurator.setContext(loggerContext); 8. configurator.doConfigure(logURL);javaview plaincopy1. StringlogbackCfg=/config/logback.xml;2. URLlogURL=newClassPathResource(logbackCfg).getURL();3. ILoggerFactoryloggerFactory=LoggerFactory.getILoggerFactory();4. LoggerContextloggerContext=(LoggerContext)loggerFactory;5. loggerContext.shutdownAndReset();6. JoranConfiguratorconfigurator=newJoranConfigurator();7. configurator.setContext(loggerContext);8. configurator.doConfigure(logURL);五. Log4j配置文件示例Java代码1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. javaview plaincopy1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 六. Logback配置文件示例Java代码1. 2. 3. 4. 5. 6. 7. 8. 9. 10. %dyyyy-MM-ddHH:mm:ss.SSS%thread%-5level%logger36-%msg%n 11. 12. 13. 14. 15. 16. xxxx.log 17. 18. xxxx.log.%i.bak 19. 1 20. 12 21. 22. 23. 25. 100MB 26. 27. 28. %dyyyy-MM-ddHH:mm:ss.SSS%thread%-5level%logger36-%msg%n 29. 30. 31. 32. 33. 34. ERROR 35. DENY 36. ACCEPT 37. 38. 39. xxxx-err.log 40. 41. xxxx-err.log.%i.bak 42. 1 43. 3 44. 45. 46. 100MB 47. 48. 49. %dyyyy-MM-ddHH:mm:ss.SSS%thread%-5level%logger36-%msg%n 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. javaview plaincopy1. 2. 3. 4. 5. 6. 7. 8. 9. 10. %dyyyy-MM-ddHH:mm:ss.SSS%thread%-5level%logger36-%msg%n11. 12. 13. 14. 15. 16. xxxx.log17. 18. xxxx.log.%i.bak19. 120. 1221. 22. 23. 25. 100MB26. 27. 28. %dyyyy-MM-ddHH:mm:ss.SSS%thread%-5level%logger36-%msg%n29. 30. 31. 32. 33. 34. ERROR35. DENY36. ACCEPT37. 38. 39. xxxx-err.log40. 41. xxxx-err.log.%i.bak42. 143. 344. 45. 46. 100MB47. 48. 49. %dyyyy-MM-ddHH:mm:ss.SSS%
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 课件春望教学课件
- 课件昆虫教学课件
- 山东省日照市2025-2026学年高二上学期开学考试数学试题
- 押题宝典教师招聘之《小学教师招聘》模考模拟试题附答案详解(综合卷)
- 课件时空穿越
- 铸管制芯工专业技能考核试卷及答案
- 卡车漂移考试题及答案
- 爵位继承考试题及答案
- 酒厂应聘考试题及答案
- 印染助剂复配工质量追溯知识考核试卷及答案
- 《陕西省分布的国家重点保护野生植物名录》
- 2025年国网数科控股公司招聘高校毕业生37人(第一批)高频重点提升(共500题)附带答案详解
- 食管肿瘤护理查房
- 2024公路水运工程工地建设标准化指南
- 统编版2024-2025学年道德与法治三年级上册全册教案
- 四川省选调笔试真题
- 保险核保岗位招聘笔试题与参考答案2025年
- (高级)数据安全管理员实操题考试题库(含答案)
- 购置体育器材申请书模板
- 新版加油站全员安全生产责任制
- 数字人课程设计培训
评论
0/150
提交评论