重新登录:重新登录

嗨,我再次回到日志中来,这是任何应用程序设计和开发的固有部分。 我是坚强的基础知识的忠实拥护者,在我的拙见中,日志记录是任何企业级应用程序中经常被忽略但基本的关键要素之一。

我已经写在此之前这里 。 为了理解当前文章,阅读本书并不是强制性的,但可以粗略地看一下它,以设置本文的上下文。

在第一篇文章中,我介绍了日志记录作为无所不在的System.out.println()的一种高收益,低成本的替代方法,所有Java人士都非常喜欢它。 我在那篇文章中使用过log4j 。 Log4j是一个可靠的框架,并兑现了承诺。 在使用它的所有年份中,它从未让我失望。 我可以全心全意地推荐它。 但是,话虽如此,也很少有替代品,这些替代品在市场上已经存在了一段时间。我很高兴地说,其中至少有一个似乎在挑战自己的地盘log4j。 我说的是Logback
当然,这并不是一个新手,这就是我建议您从企业级应用程序开始考虑的原因之一。 快速浏览一下Maven Central ,发现第一版发布于2006年。在2006年至2012年6月8日之间,也就是最新版本推向Maven Central时,已经有46个版本。 将此与log4j进行比较。 第一个版本于2005年在Maven Central推出,最后一个版本于2012年5月26日发布,在这些版本之间共有14个不同的版本。 我并不是要使用这些数据来比较这两个框架。 唯一的目的是向读者保证Logback已经存在了很长时间,并且已经足够引起人们的重视。
在身边是一回事,留下自己的印记是不同的。 就雄心和意图而言,Logback清楚地表明它打算成为log4j的后继者-并在其主页上明确表示。 当然,Logback声称它比Log4j具有详尽的功能/优点列表。 您可以在此链接上阅读有关它们的信息。 就是这样。 本文的重点是,我建议在设计和开发基于企业级Java的应用程序时,应更加仔细地记录日志,并考虑使用Logback
我希望现在有一些观众愿意大声疾呼,激发他们最喜欢的编辑器,并选择Logback试一试。 如果您是其中之一,那么您和我有一些共同点。 您可能想继续阅读。
Logback承诺的第一件事就是更快的实现(在此链接处 )。 真? 我想核实这一说法。
我首先使用Maven创建一个香草Java应用程序。

档案:MavenCommands.bat

call mvn archetype:create ^
 -DarchetypeGroupId=org.apache.maven.archetypes ^
 -DgroupId=org.academy ^
 -DartifactId=logger

不幸的是,它已经预装了JUnit3。我设置了JUnit 4,还添加了Contiperf,这样我可以多次运行测试-如果要检查性能,这将很方便。

文件:/logger/pom.xml

[...]


                                                                              
 
                     
                      UTF-8
                     
        
                     
                      4.10
                              
        
                     
                      2.2.0
                     
 [...]                           

                                                                       

[...]
                         
                    

                                               
 
                     
                      junit
                                
 
                     
                      junit
                          
 
                     
                      ${junit.version}
                     
 
                     
                      test
                                     

                                                                             
     

                                                    
 
                     
                      org.databene
                              
 
                     
                      contiperf
                           
 
                     
                      ${contiperf.version}
                      
 
                     
                      test

另外,我想显式控制用于编译和执行代码的Java版本。

文件:/logger/pom.xml

[...]


                    
                     2.0.2
                    

                    
                     1.7
                                                        

[...]

 

                                                                            
 
                     
                      org.apache.maven.plugins
                                      
 
                     
                      maven-compiler-plugin
                                   
 
                     
                      ${maven-compiler-plugin.version}
                              
 
                                                                  
  
                      ${java.version}                        
  
                      
                       ${java.version}

最后配置–暂时。 随心所欲地运行单元测试。

文件:/logger/pom.xml

[...]


                    
                     2.12
                                                    

[...]

                         

                                                                            
 
                     
                      org.apache.maven.plugins
                                      
 
                     
                      maven-surefire-plugin
                                   
 
                     
                      ${maven-surefire-plugin.version}
                              
 
                                                                   
  
                                                                  
   
                       
                        org.apache.maven.surefire
                               
   
                       
                        surefire-junit47
                                  
   
                       
                        ${maven-surefire-plugin.version}
                        
  
                                                                 
 
                                                                  
 
                                                                  
  
                      
                       -XX:-UseSplitVerifier

请注意,我竭尽全力将所有这些依赖项及其版本添加到本文中,只是为了确保您自己尝试一下,您确切知道测试的软件配置是什么。

现在,让我们最后添加单元测试。

文件:/logger/src/test/java/org/academy/AppTest.java

public class AppTest {                                 
 private final static Logger logger = LoggerFactory 
   .getLogger(AppTest.class);                 
                                                       
 @Rule                                              
 public ContiPerfRule i = new ContiPerfRule();      
                                                       
 @Test                                              
 @PerfTest(invocations = 10, threads = 1)           
 @Required(max = 1200, average = 1000)              
 public void test() {                         
  for(int i = 0; i<10000 ; i++){          
   logger.debug("Hello {}", "world.");        
  }                                              
 }                                                  
}

因此,我们在单元测试中使用了logger,但未添加logger的实现。 我打算做的是一个接一个地添加log4j(带有slf4j)和logback(带有slf4j的固有支持),并多次运行此简单测试以比较性能。

要添加log4j,我使用了此设置。

文件:/logger/pom.xml

org.slf4j
                                 
 
                     
                      slf4j-api
                           
 
                     
                      ${slf4j.version}
                          

                                                   

                                                    
 
                     
                      org.slf4j
                                 
 
                     
                      jcl-over-slf4j
                      
 
                     
                      ${slf4j.version}
                          
 
                     
                      runtime
                                       

                                                   

                                                    
 
                     
                      org.slf4j
                                 
 
                     
                      slf4j-log4j12
                       
 
                     
                      ${slf4j.version}
                          
 
                     
                      runtime

对于登录,我使用了此设置。

文件:/logger/pom.xml

ch.qos.logback
                            
 
                     
                      logback-classic
                     
 
                     
                      ${logback.version}

具有以下版本。

文件:/logger/pom.xml

1.6.1
                        

                    
                     1.0.6

为了使这两个记录器框架中的任何一个实际记录任何内容,您必须添加一个文件,告诉记录器要记录什么以及在何处。

文件:src / main / resources / log4j.properties

# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1

# configure A1 to spit out data in console
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout 
log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
最后,是关键时刻。 我对每个框架(即logback和log4j)进行了三次测试。 本质上,我在每次测试中将字符串log.debug()进行1000,000次并计时。 这就是最终数字出来的方式。
构架 第一轮 第二次 第三轮
退回 0.375秒 0.375秒 0.406秒
Log4j 0.454秒 0.453秒 0.454秒
就这个小实验而言,Logback的执行速度显然比Log4j快。 当然,这是过于简单的实验,并且尚未考虑许多有效方案。 例如,我们还没有真正使用vanilla log4j。 我们已经将log4j与slf4j API结合使用,这不是完全一样的。 同样,更快不是唯一的考虑因素。 Log4j异步工作( 在此处此处阅读),而据我所知,Logback并非如此。 Logback具有Log4j没有的许多漂亮功能。
因此,孤立地看这小小的代码并不能真正证明任何东西。 如果有的话,它使我回到了我提出的第一点–如果您正在设计/编码基于Java的企业级应用程序,则Logback具有很大的潜力,值得一看。
这就是本文的全部内容。 快乐的编码。
想继续读吗? 我可以建议...

参考:Tech for Enterprise博客上,从我们的JCG合作伙伴 Partho 重新获得了日志记录


翻译自: https://www.javacodegeeks.com/2012/07/logback-logging-revisited.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值