Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.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
Language agnostic 记录错误的最佳做法是什么?_Language Agnostic_Logging_Error Handling - Fatal编程技术网

Language agnostic 记录错误的最佳做法是什么?

Language agnostic 记录错误的最佳做法是什么?,language-agnostic,logging,error-handling,Language Agnostic,Logging,Error Handling,我多次看到类似以下错误的日志记录: System.out.println("Method aMethod with parameters a:"+a+" b: "+b); print("Error in line 88"); 所以。。记录错误的最佳做法是什么 编辑: 这是java,但可能是C/C++、basic等。记录错误的最佳实践并不存在。它基本上只需要遵循一个一致的模式(在软件/公司/等内部),提供足够的信息来跟踪问题。例如,您可能希望跟踪时间、方法、参数、调用方法等 只要您不只是打印“E

我多次看到类似以下错误的日志记录:

System.out.println("Method aMethod with parameters a:"+a+" b: "+b);
print("Error in line 88");
所以。。记录错误的最佳做法是什么

编辑:


这是java,但可能是C/C++、basic等。

记录错误的最佳实践并不存在。它基本上只需要遵循一个一致的模式(在软件/公司/等内部),提供足够的信息来跟踪问题。例如,您可能希望跟踪时间、方法、参数、调用方法等


只要您不只是打印“Error in”

以一致格式记录错误的最简单方法是使用Log4j之类的日志框架(假设您使用的是Java)。在代码标准中包含日志部分非常有用,可以确保所有开发人员都知道需要记录哪些内容。大多数日志框架的优点是它们具有不同的日志级别,因此您可以控制开发、测试和生产之间日志记录的详细程度。

最佳实践是使用java.util.logging框架

然后,您可以使用这两种格式之一记录消息

log.warning("..");
log.fine("..");
log.finer("..");
log.finest("..");

然后,您可以使用logging.properties(下面的示例)在日志记录的级别之间切换,并执行各种巧妙的操作,如记录到文件、使用旋转等

handlers = java.util.logging.ConsoleHandler

.level = WARNING

java.util.logging.ConsoleHandler.level = ALL

com.example.blah = FINE
com.example.testcomponents = FINEST
我认为应该避免使用log4j和其他框架,Java已经具备了您所需要的一切

编辑


这可以作为任何编程语言的通用实践。在企业应用程序中,能够从单个属性文件控制所有级别的日志记录通常非常重要。

一些建议的最佳做法

  • 使用日志框架。这将允许您:

    • 轻松更改日志消息的目标
    • 根据严重性筛选日志消息
    • 支持国际化日志消息
  • 如果您使用的是java,那么现在首选它作为日志外观

  • 如前所述,slf4j是一个门面,然后您必须选择一个底层实现。log4j、java.util.logging或“simple”

  • 遵循您的框架建议,确保不会不必要地执行


Apache Commons日志记录不适用于应用程序常规日志记录。它旨在供不希望强制API用户执行日志记录的库或API使用

Commons日志记录也存在类加载问题

选择[许多]日志api中的一个,最广泛使用的可能是或

如果您想要实现独立性,您可能需要考虑Log4J的原始作者


选择一个实现后,在该实现中一致地使用日志级别/严重性,这样搜索/过滤日志就更容易了。

上面提到的apache通用日志API是一个很好的资源。回到java,还有一个标准的错误输出流(System.err)

直接从Java API:

此流已打开并准备就绪 接受输出数据

通常,该流对应于 显示输出或其他输出 主机指定的目标 环境或用户。按照惯例, 此输出流用于显示 错误消息或其他信息 这应该是迫在眉睫的 用户的注意,即使 主输出流的值 变量out已被重定向 发送到一个文件或其他目的地 通常不连续监测


直接登录到控制台是可怕的,坦率地说,这是一个缺乏经验的开发人员的标志。这样做的唯一原因是1)他或她不知道其他方法,和/或2)开发人员一点也没有考虑过当他/她的代码部署到生产站点时会发生什么,以及在那时应用程序将如何维护。处理一个每天记录1GB或更多完全不需要的调试日志的应用程序是令人恼火的

普遍接受的最佳实践是使用具有以下概念的日志框架:

  • 不同的日志对象-不同的类/模块/etc可以记录到不同的记录器,因此您可以选择将不同的日志配置应用到应用程序的不同部分
  • 不同的日志级别-因此您可以调整日志配置,只记录生产中的错误,在开发环境中记录各种调试和跟踪信息,等等
  • 不同的日志输出-框架应允许您配置日志输出发送到何处,而无需对代码库进行任何更改。您可能希望将日志输出发送到的不同位置的一些示例包括文件、根据日期/大小滚动的文件、数据库、电子邮件、远程处理接收器等
  • 日志框架决不能从日志代码中抛出任何异常或错误。您的应用程序不应该因为日志框架无法创建其日志文件或获得文件锁定而无法加载或启动(除非这是您的应用程序的关键要求,可能是出于法律原因)
  • 您将使用的最终日志框架当然取决于您的平台。一些常见的选择:

    • 爪哇:
      • 内置
    • .NET:
    • C++:

    除了其他答案中的技术考虑之外,建议记录一条有意义的消息,也许还有一些步骤可以避免将来出现错误。当然,这取决于错误

    当消息声明“无法从文件X读取,您没有适当的权限”时,您可以从I/O错误中获得更多信息


    请参阅或上的更多示例。

    这些示例通常具有高级功能,例如自动记录
    handlers = java.util.logging.ConsoleHandler
    
    .level = WARNING
    
    java.util.logging.ConsoleHandler.level = ALL
    
    com.example.blah = FINE
    com.example.testcomponents = FINEST