记录规则和建议?


13

在我的组织中,我们整理了一些有关日志记录的规则/准则,我想知道您是否可以添加或评论。

我们使用Java,但您可能会对Loggin进行一般性评论-规则和建议

  1. 使用正确的日志记录级别

    • 错误:出了点问题,需要立即修复
    • 警告:此过程可以继续进行而不进行修复。应用程序应容忍此级别,但警告应始终得到调查。
    • INFO:重要过程完成的信息
    • 调试。仅在开发期间使用
  2. 确保您知道要记录的内容。

  3. 避免日志记录影响应用程序的行为

日志记录的功能应该是在日志中写入消息。

  1. 日志消息应具有描述性,清晰,简短和简洁。

故障排除时,废话消息的使用很少。

  1. 将正确的属性放入log4j

输入正确的方法和类是自动编写的。

例:

日期文件-web

log4j.rootLogger=ERROR, DATEDFILE
log4j.logger.org.springframework=INFO
log4j.logger.waffle=ERROR
log4j.logger.se.prv=INFO
log4j.logger.se.prv.common.mvc=INFO
log4j.logger.se.prv.omklassning=DEBUG

log4j.appender.DATEDFILE=biz.minaret.log4j.DatedFileAppender
log4j.appender.DATEDFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATEDFILE.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%C{1}.%M] - %m%n

log4j.appender.DATEDFILE.Prefix=omklassning.
log4j.appender.DATEDFILE.Suffix=.log
log4j.appender.DATEDFILE.Directory=//localhost/WebSphereLog/omklassning/
  1. 日志值。

请记录应用程序中的值。

  1. 日志前缀。

声明日志记录是从应用程序的哪一部分写入的,最好带有项目约定前缀的内容,例如 PANDORA_DB

  1. 文字量。

注意不要有太多的日志文本。它会影响应用程序的性能。

  1. 登录格式:

-有几种与log4j一起使用的变体和方法,但是当我们记录异常时,我们希望统一使用以下格式:

logger.error("PANDORA_DB2: Fel vid hämtning av frist i TP210_RAPPORTFRIST", e);

在上面的示例中,假设我们已经设置了log4j属性,以便它自动编写类和方法。

始终使用记录器,而不要使用以下记录器:

System.out.println(), System.err.println(), e.printStackTrace()

如果Web应用程序使用我们的框架,则可以从EJB中获得非常详细的错误信息,如果在处理程序中使用try-catch并根据上述模型进行日志记录:

在我们的项目中,我们使用这种转换模式,通过该转换模式可以自动写出方法和类名。在这里,我们为控制台和datedfileappender使用两种不同的专利:

log4j.appender.CONSOLE.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

log4j.appender.DATEDFILE.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

在上面的示例中,方法和类将被写出。在控制台行号也将写成我们的。

  1. toString()

toString()为每个对象准备一个。例如:

@Override
public String toString() {
  StringBuilder sb = new StringBuilder();
  sb.append(" DwfInformation [ ");
  sb.append("cc: ").append(cc);
  sb.append("pn: ").append(pn);
  sb.append("kc: ").append(kc);
  sb.append("numberOfPages: ").append(numberOfPages);
  sb.append("publicationDate: ").append(publicationDate);
  sb.append("version: ").append(version);
  sb.append(" ]");
  return sb.toString();
}

而不是特殊的方法,使这些输出

public void printAll()
{
    logger.info("inbet: " + getInbetInput());
    logger.info("betdat: " + betdat);
    logger.info("betid: " + betid);
    logger.info("send: " + send);
    logger.info("appr: " + appr);
    logger.info("rereg: " + rereg);   
    logger.info("NY: " + ny);   
    logger.info("CNT: " + cnt);   
}

那么,使用这些日志记录方式,您是否可以添加,评论或发现有疑问的内容?即使它与Java不相关,也可以随意回答或评论,Java和log4j只是其推理方式的实现。



1
@gnat-我认为您是对的,两个问题之间有很多重叠之处。我正在努力将其称为重复项。

Answers:


4

作为日志记录规则在应用程序中日志来自何处的扩展,您可能希望添加每个模块级别的日志记录标志。不必一直记录所有内容,而是允许您有选择地定位应用程序的各个部分。这样做有开销,您需要创建一个工具来启用/禁用该日志记录。理想情况下,您将能够在应用程序运行时即时启用/禁用。

我习惯于在调试下面看到一个称为“跟踪”的层,但这不一定是通用术语。“跟踪”级别的日志记录会尽可能地跟踪,包括模块进入/退出,带有进入/退出的时间戳以及用于捕获传递值的奖励积分。显然,这会生成大量数据,而您不会轻易打开它。但是,当您无法附加到进程或没有错误的应用程序的核心转储时,它在调试方面具有优势。

我喜欢查看带有日志信息的文件/模块引用和时间戳。在尝试查找线程之间的竞争条件以及协调应用程序多个区域的活动时,它可能很方便。公平地说,我认识一些人,他们认为这些细节会使日志文件混乱。添加时间戳是与团队讨论的事情。(如果log4j已经做到了,则表示歉意。)

如果日志不是由它自己的线程/进程来处理的,那也是要考虑的事情。日志消息不会传递给应用程序线程等待日志处理,而是传递给日志处理程序,并且应用程序线程以其快乐的方式继续前进。另外,创建某种缓冲机制来处理日志消息是加快应用程序响应速度的另一种方法。

可以控制日志文件的大小和历史记录是另一个要考虑的功能。您既不希望该应用耗尽主机系统上的所有磁盘空间,也不必永远保留所有日志文件。


2

要记住的一件事是,在执行任何类型的日志记录字符串操作之前,请检查日志记录级别。也就是说,如果您实际上并不打算记录日期消息,请不要进行设置日期格式程序或将一串字符串连接在一起以创建日志消息的所有工作。那只是浪费工作,使您的应用程序变慢。

仅供参考,在Apache Commons项目有一个ToStringBuilder ,它简化了创建toString()方法。


1

我发现尼克在您添加的内容中没有任何问题。这就是我一段时间以来一直在做的事情。您提供的帖子非常详细,可能可以用作日志记录的一种教程。但是,我确实想在这里添加一件事,那就是:在许多地方,我一直在使用条件日志记录来查看问题,例如:

     if(env_local)
     {
     write_to_local();
     }    
     else if(env_IT)
     {
     write_to_IT();
     } 
     else if(env_PROD)
     {
     write_to_prod();
     } 
     else
     dosomething();

我确实认为这种条件跟踪或调试不是最好的方法。


1

除了记录引发错误的类/方法外,记录传递给该方法的参数也很有用。如果仅在1000中发生1次,则知道引发错误的位置不是很有用。您还需要知道导致错误发生的数据。

我还发现使用一个变量定义应用程序的默认日志记录级别很有用。这样,您可以将DEBUG和INFO代码与WARNING和ERROR代码一起使用。在生产模式下运行时,默认情况下它不输出DEBUG信息,但是当出现错误时,您可以更新标志并开始将DEBUG消息写入日志。


1

在大多数情况下,记录是一个跨领域的问题。仅仅Java不足以使您能够将日志记录与实际业务逻辑区分开来。这意味着您不能例如仅采用一种方法并将其放入另一个项目,而必须先删除并调整所有日志记录。那只是冰山一角。

为了避免在混合日志记录和“实际”业务逻辑时出现该问题和其他问题,您应该考虑使用面向方面的编程。对于Java,最常用的框架是AspectJ。谷歌技术讲座有一段youtube视频,它解释了AspectJ及其用法,不仅记录得很好。您当然也可以在stackexchange上找到许多自己记录日志的示例。


0

我建议的一件事是,您可以使用一种方法来将多个日志记录上下文与任何特定的日志文件相关联,并进行安排,以便任何写入任何日志记录上下文的内容都将被记录下来,除非代码明确要求日志记录上下文丢弃其内容。这种设计可以使用户在操作过程中捕获相当详细的日志,如果操作成功,则将其丢弃,但如果操作失败,则可以使用它们。缺少这种日志记录功能,当出现故障时要获得良好的日志可能会要求应用程序浪费大量时间来记录无用数据,而一切正常工作的时间为99.99%。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.