log4j
优于set System.out
和System.err
输出到日志文件的优势是什么?
答案 0 :(得分:13)
从较高的层面来说,Log4j对手动记录的胜利是,您可以将日志记录代码与实际要记录的内容以及记录位置和方式进行分离。有关记录详细程度/过滤,格式化,日志位置甚至日志类型(文件,网络等)的详细信息都是使用配置以及通过custom appenders可扩展地进行声明性处理,而您必须自己编写这种灵活性的代码。
这一点至关重要,因为开发人员通常很难预测一旦软件投入生产后日志记录需求将如何变化。管理该软件的运营团队可能需要更少的详细日志,可能需要多个日志,可能需要将这些日志发送到多个服务器,有时可能需要获得真正详细的数据以进行故障排除等。如果需要,运营团队通常不可能改变日志记录的工作方式,说服开发人员进行大的代码更改。这通常会导致生产停工,操作和开发之间的摩擦,以及浪费时间。
从开发人员的角度来看,Log4j使您无需更改代码以支持日志记录,并使您不会被希望记录更改的人所困扰。它使管理代码的人能够抓住自己的痒而不是惹恼你!
此外,由于Log4j是Java日志记录的事实标准,因此有许多工具可以使用Log4j做很酷的事情 - 此外还会阻止您和您的运营团队重新发明轮子。
我最喜欢的功能是能够轻松编写appender发送数据到非文件来源,如SYSLOG,Splunk等,这使您的应用程序可以轻松自定义登录到操作管理工具IT部门已经在使用。
答案 1 :(得分:7)
实际上,这些天你应该查看slf4j的外观,因为它允许你使用{} -placeholder来获得最简洁的语句。然后,您可以使用slf4j后面的相应日志记录框架来处理日志语句的实际处理。这可能是log4j或slf4j-simple,它只打印出所有的INFO,WARN和ERROR,并丢弃其余部分。
您需要做的关键观察是,在编写代码时完成日志语句的写入,并且在部署代码时完成所需内容的决策,这可能是代码编写后的年份和测试。 System.out.println要求您在物理上更改代码以摆脱它们,这在严格的write-test-deploy循环中是不可接受的。如果代码发生变化,则必须重新测试。使用slf4j,您只需启用想要查看的内容。
我们在测试阶段进行了完整的日志记录,而在生产部署的初始阶段进行了详细的日志记录,之后我们仅查看信息。这为我们提供了完整的信息,在这种情况下很少可能调试案例。
你可能会发现我写的这篇文章很有意思。目标受众正在开始Java程序员,我打算从一开始就给他们良好的习惯。 http://runjva.appspot.com/logging101/index.html
答案 2 :(得分:1)
我的最爱(不是全部)
答案 3 :(得分:1)
级别,格式化,记录到多个文件......如果在代码运行时可能出现任何问题,则日志框架(即使它是java.util.logging)非常有用。
答案 4 :(得分:1)
Log4j提供了根据大小旋转日志文件并根据数量(logrotate)删除它们的功能,因此您的服务器不会填满其磁盘。我个人认为这是Log4j中更有价值的功能之一。
Log4j也受到许多开发人员的欢迎和理解。我工作过的最后三家公司都在大多数项目中都使用过Log4j。
答案 5 :(得分:1)
log4j允许您登录各种资源,例如事件日志,电子邮件,文件系统等,同时允许您的应用程序与所有这些资源保持分离。此外,您可以使用通用接口登录所有各种资源,而无需学习或集成相应的API。
答案 6 :(得分:1)
看看你会理解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.
要更改java代码中的变量,您可以执行以下操作:
加载配置
如果存储在a中,Log4j将自动加载配置 文件名为“log4j.properties”并存在于类路径下 “”(例如WEB-INF / classes / log4j.properties)。
我不喜欢这种方法,而是喜欢加载配置 明确地通过调用:
PropertyConfigurator.configure(Config.ETC +“/ log4j.properties”); 这样我就可以随时重新加载配置 应用程序仍在运行。我想添加一个按钮 管理jsp,“重新加载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 );
答案 7 :(得分:0)