log4j的优点

log4j优于设置System.outSystem.err输出到日志文件的优势是什么?

从较高的层面来说,Log4j在手动记录方面的胜利是,您可以将日志记录代码与实际要记录的内容以及记录位置和方式进行分离。 有关记录详细程度/过滤,格式化,日志位置甚至日志类型(文件,网络等)的详细信息都是使用配置以可扩展方式通过自定义appender以声明方式处理的,而您必须自己编写这种灵活性。

这非常重要,因为开发人员通常很难预测一旦软件投入生产后日志记录需求将如何变化。 管理该软件的运营团队可能需要更少的详细日志,可能需要多个日志,可能需要将这些日志发送到多个服务器,有时可能需要获得非常详细的数据以进行故障排除等。如果需要,运营团队通常不可能改变日志记录的工作方式,说服开发人员进行大的代码更改。 这通常会导致生产停工,运营和开发之间的摩擦,以及浪费时间。

从开发人员的角度来看,Log4j使您无需进行代码更改以支持日志记录,并使您不会被希望记录更改的人所困扰。 它使管理代码的人能够抓住自己的痒而不是烦扰你!

此外,由于Log4j是Java日志记录的事实标准,因此有很多工具可以使用Log4j做很酷的事情 – 此外还会阻止您和您的运营团队重新发明轮子。

我最喜欢的function是能够轻松编写appender将数据发送到非文件源,如SYSLOG , Splunk等,这使您的应用程序可以轻松地自定义登录到您的IT部门已经使用的操作管理工具。

实际上,这些天您应该查看slf4j的外观,因为它允许您使用{} -placeholders来获得最简洁的语句。 然后,您可以使用slf4j后面的相应日志记录框架来处理日志语句的实际处理。 这可能是log4j或slf4j-simple,它只打印出所有的INFO,WARN和ERROR,并丢弃其余部分。

您需要做的关键观察是,在编写代码时完成日志语句的写入,并且在部署代码时完成所需内容的决策,这可能是代码编写和测试后的几年。 System.out.println要求您在物理上更改代码以摆脱它们,这在严格的write-test-deploy循环中是不可接受的。 如果代码发生变化,则必须重新测试。 使用slf4j,您只需启用想要查看的内容即可。

我们在测试阶段进行了完整的日志记录,而在生产部署的初始阶段进行了详细的日志记录,之后我们只进入了信息。 这为我们提供了完整的信息,在这种情况下很少可能调试案例。

您可能会发现我写的这篇文章很有趣。 目标受众正在开始Java程序员,我打算从一开始就给他们良好的习惯。 http://runjva.appspot.com/logging101/index.html

我的最爱(不是全部)

  • 能够设置登录配置的参数,无需重新编译
  • 能够设置日志的写入方式(从文本文件到SMTP发送方)
  • 能够按严重程度过滤

级别,格式化,记录到多个文件……如果在代码运行时可能出现任何问题,那么日志框架(即使它是java.util.logging)确实很有用。

log4j允许您登录各种资源,例如事件日志,电子邮件,文件系统等,同时允许您的应用程序与所有这些资源保持分离。 此外,您可以使用通用接口登录所有各种资源,而无需学习或集成相应的API。

Log4j提供了根据大小旋转日志文件并根据数量(logrotate)删除它们的function,因此您的服务器不会填满其磁盘。 我个人认为这是Log4j中更有价值的function之一。

Log4j也受到许多开发人员的欢迎和理解。 我工作过的最后三家公司都在大多数项目中都使用过Log4j。

看看你会明白log4j的强大function:

log4j.properties我曾经用过一次项目:

 # ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF # No appenders for rootLogger log4j.rootLogger=OFF folder=.. prefix= fileExtension=.log htmlExtension=${fileExtension}.html datestamp=yyyy-MM-dd/HH:mm:ss.SSS/zzz layout=%d{${datestamp}} ms=%-4r [%t] %-5p %l %n%m %n%n # myLogger logger log4j.logger.myLogger=ALL, stdout, infoFile, infoHtml, errorFile # stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=${layout} # infoFile log4j.appender.infoFile=org.apache.log4j.FileAppender log4j.appender.infoFile.File=${folder}/${prefix}_info${fileExtension} log4j.appender.infoFile.layout=org.apache.log4j.PatternLayout log4j.appender.infoFile.layout.ConversionPattern=${layout} # infoHtml log4j.appender.infoHtml=org.apache.log4j.FileAppender log4j.appender.infoHtml.File=${folder}/${prefix}_info${htmlExtension} log4j.appender.infoHtml.layout=org.apache.log4j.HTMLLayout log4j.appender.infoHtml.layout.Title=Logs log4j.appender.infoHtml.layout.LocationInfo=true # errorFile log4j.appender.errorFile=org.apache.log4j.FileAppender log4j.appender.errorFile.File=${folder}/${prefix}_error${fileExtension} log4j.appender.errorFile.layout=org.apache.log4j.PatternLayout log4j.appender.errorFile.layout.ConversionPattern=${layout} # APPENDERS SETTINGS log4j.appender.stdout.Threshold = ALL log4j.appender.infoFile.Threshold = INFO log4j.appender.infoHtml.Threshold = INFO log4j.appender.errorFile.Threshold = WARN. 

要更改java代码中的变量,您可以执行以下操作:

加载配置

如果配置存储在名为“log4j.properties”的文件中并且存在于“”下的类路径中(例如WEB-INF / classes / log4j.properties),Log4j将自动加载配置。

我不喜欢这种方法,并且更喜欢通过调用以下方式显式加载配置:

PropertyConfigurator.configure(Config.ETC +“/ log4j.properties”); 这样,只要我的应用程序仍在运行,我就可以随时重新加载配置。 我想在管理jsp中添加一个按钮,“Reload Log4J”。

动态日志文件位置

许多人抱怨Log4j强迫您硬编码保存日志的位置。 实际上,可以动态选择日志文件位置,特别是如果您使用上面的$ {log.dir}属性替换技术。 这是如何做:

 String dynamicLog = // log directory somehow chosen... Properties p = new Properties( Config.ETC + "/log4j.properties" ); p.put( "log.dir", dynamicLog ); // overwrite "log.dir" PropertyConfigurator.configure( p ); 
  • 记录(记录发生的历史业务事件,您可以检查旧日志)
  • 跟踪应用程序(项目流程)
  • 调试应用程序(详细信息在粒度级别的方法中发生的事情//数据,值和所有内部方法)
  • error handling(有关发生的特定错误的信息)