Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java log4j的优势_Java_Logging_Log4j - Fatal编程技术网

Java log4j的优势

Java log4j的优势,java,logging,log4j,Java,Logging,Log4j,log4j比设置System.out和System.err输出到日志文件有什么好处?我的收藏夹(不是全部) 能够设置登录配置的参数,无需重新编译 能够设置日志的写入方式(从文本文件到SMTP发件人) 按严重性筛选的能力 级别、格式、记录到多个文件。。。日志框架(即使是java.util.logging)在代码运行时可能出现任何问题时都非常有用。从较高的层次上讲,Log4j胜过手动日志记录,这是因为您可以将日志记录代码与实际要记录的内容、记录的位置和方式分离。有关日志详细信息/过滤、格式、日志位

log4j
比设置
System.out
System.err
输出到日志文件有什么好处?

我的收藏夹(不是全部)

  • 能够设置登录配置的参数,无需重新编译
  • 能够设置日志的写入方式(从文本文件到SMTP发件人)
  • 按严重性筛选的能力

级别、格式、记录到多个文件。。。日志框架(即使是java.util.logging)在代码运行时可能出现任何问题时都非常有用。

从较高的层次上讲,Log4j胜过手动日志记录,这是因为您可以将日志记录代码与实际要记录的内容、记录的位置和方式分离。有关日志详细信息/过滤、格式、日志位置,甚至日志类型(文件、网络等)的详细信息都是通过配置以声明方式处理的,也可以通过扩展方式处理,而您必须自己编写这种灵活性

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

从开发人员的角度来看,Log4j使您不必为了支持日志记录而进行代码更改,也使您不必被想要日志记录更改的人纠缠。它使管理您的代码的人能够自己解决问题,而不是打扰您

此外,由于Log4j是Java日志记录的事实标准,因此有很多工具可以使用Log4j做一些很酷的事情——而且阻止您和您的操作团队重新发明轮子


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

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


此外,Log4j也很受欢迎,并为许多开发人员所理解。我工作过的最后三家公司在大多数项目中都使用了Log4j。

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

实际上,您现在应该研究一下slf4j facade,因为它允许您使用{}-占位符来获得最简洁的语句。然后,您可以使用slf4j背后的适当日志框架来处理日志语句的实际处理。这可能是log4j或slf4j simple,它只打印出所有信息、警告和错误,并丢弃其余信息

您需要进行的关键观察是,日志语句的编写是在编写代码时完成的,而所需内容的决定是在部署代码时完成的,这可能是在编写和测试代码之后的几年。System.out.println要求您实际更改代码以摆脱它们,这在严格的写测试部署周期中是不可接受的。如果代码更改,则必须重新测试。使用slf4j,您只需启用您想要查看的内容

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


你可能会发现我写的这篇文章很有趣。目标受众是Java程序员,我打算从一开始就让他们养成良好的习惯

看一看,你就会明白log4j的威力:

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.
  • 日志记录(记录发生的历史业务事件,您可以检查旧日志)
  • 跟踪应用程序(项目流程)
  • 调试应用程序(详细信息在粒度级别的方法中发生了什么//数据、值和所有内部方法)
  • 错误处理(有关发生的特定错误的信息)

Log4j实际上是一个标准,但对于java.util.logging、Commons logging以及它支持的许多其他日志框架,我不确定这是否仍然成立。我最近看到的许多开源项目不再使用log4j了。log4j可能不再是Java日志记录的宠儿,但它仍然远远优于System.out/.error。Commons日志记录也被取代,JDK日志记录始终是一个“未发明于此”综合症的案例。这是一个重复的问题,还是一个基本的问题可能还没有被提出?我很怀疑,但我愿意感到惊讶。我的快速搜索没有发现明显的dup,但也不是彻底的搜索。我自己认为log4j引入了太多不必要的复杂性。它也非常具有侵入性。看看这种使用枚举类作为日志记录工具的替代方法:
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 );