在我一直在努力的每个项目中,一直存在日志文件变得太大的问题。
快速现成的解决方案是使用Log4j RollingFileAppender
并设置允许的最大大小。
然而,有些情况下,在某人手动干预之前,相同的异常会反复达到最大尺寸。在这种情况下,由于滚动策略,您最终会丢失在异常之前发生的重要事件的信息。
有人可以建议解决这个问题吗?
P.S。我能想到的是保持到目前为止发生的Exceptions
缓存,这样当重新发生相同的异常时,我不会记录大量的堆栈跟踪行。我认为这仍然是一个众所周知的问题,我不想重新发明轮子。
答案 0 :(得分:3)
使用Log4J功能在使用“Rolling File Appender”达到指定大小后压缩日志文件。 1MB文件的拉链大约为85KB。 为此,请根据大小指定要压缩的触发器策略,并在滚动策略中指定zip文件 如果您需要信息,请告诉我。
答案 1 :(得分:3)
有两个方向可以解决这个问题:系统方面和开发方面。从系统方面(即在部署和运行应用程序之后)处理这个问题已有几个答案。但是,我想谈谈发展方面。
我看到的一个非常常见的模式是在每个级别记录的异常。我看到UI组件,EJB,连接器,线程,帮助器类,pojos等等,记录发生的任何和所有异常。在许多情况下,无需费心检查日志级别。这具有您遇到的确切结果以及使调试和故障排除花费的时间超过必要时间,因为必须筛选所有重复的错误。
我的建议是在代码中执行以下操作:
THINK。并非所有异常都是致命的,并且在很多情况下实际上都是无关紧要的(例如IOException
来自流close()
的操作。)我不知道我想说,“不要记录异常”,因为你当然不想错过任何问题,所以在最坏的情况下,将日志语句放在调试级别的条件检查中
if(logger.isDebugEnabled()){
// log exception
}
仅在顶层登录。我确信这会遇到一些消极情绪,但我的感觉是,除非该类是应用程序或组件的顶级接口,或异常不再被传递,然后异常应该不被记录。换句话说,如果重新抛出异常,包装,抛出或声明从方法抛出异常,请不要将其记录在该级别。
例如,第一种情况导致了太多日志语句的问题,因为它可能是调用者,而且调用的任何内容也会记录异常或有关错误的声明。
public void something() throws IllegalStateException{
try{
// stuff that throws some exception
}catch(SomeException e){
logger.error(e); // <- NO because we're throwing one
throw new IllegalStateException("Can't do stuff.",e);
}
}
因为我们扔了它,所以不要记录它。
public void something() throws IllegalStateException{
try{
// stuff that throws some exception
}catch(SomeException e){
// Whoever called Something should make the decision to log
throw new IllegalStateException("Can't do stuff.",e);
}
}
但是,如果something
停止了异常的传播,它应该记录它。
public void something(){
try{
// stuff that throws some exception
}catch(SomeException e){
if(logger.isLogLevelEnabled(Log.INFO)){
logger.error(e); // DEFINITELY LOG!
}
}
}
答案 2 :(得分:2)
根据我的经验,日志记录可以替代正确的代码测试和调试。程序员对自己说:“我不能确定这段代码是否有效,所以我会在其中添加日志消息,因此当它失败时我可以使用日志消息来找出问题所在。”
不要只是不加考虑地记录日志消息,而应将每条日志消息视为软件用户界面的一部分。 DBA,网站管理员或系统管理员的用户界面,但仍然是用户界面的一部分。每条消息都应该做有用的事情。该消息应该是行动的刺激,或提供他们可以使用的信息。如果消息无效,请不要记录它。
为每封邮件提供适当的日志记录级别。如果消息未描述实际问题,并且未提供通常有用的状态信息,则该消息可能仅用于调试,因此将其标记为DEBUG或TRACING消息。您通常的Log4J配置根本不应该写这些消息。更改配置以仅在调试问题时写入它们。
您提到消息是由于经常发生的异常引起的。并非所有异常都表明程序中存在错误,甚至是程序操作中的问题。您应该记录所有异常,指出程序中的错误,并记录它们的堆栈跟踪。在许多情况下,几乎所有你需要解决bug的原因。如果你担心的例外是由于一个错误,你就会关注错误的问题:你应该修复bug。如果异常未指示程序中的错误,则不应为其记录堆栈跟踪。堆栈跟踪仅对尝试调试问题的程序员有用。如果异常根本不表示存在问题,则根本不需要记录它。
答案 3 :(得分:1)
购买更大的硬盘并设置批处理以定期自动压缩旧日志。
(Zip将检测重复的异常模式并非常有效地压缩它。)
答案 4 :(得分:0)
如果达到最大大小,则使用该策略,附加到新日志文件。并像每天一样运行调度程序来擦除旧的日志文件