【问题标题】:log4j extra logging argumentslog4j 额外的日志记录参数
【发布时间】:2010-10-09 19:55:20
【问题描述】:

我正在开发一个(内部)库,我想强制使用此库的开发人员在记录错误或致命级别消息时包含文本 ID。在不修改 log4j 的情况下,我们要强制执行的内容类似于:

logger.error("E1234: 发生错误");

如果没有或只对 log4j 进行少量扩展,我们可以在夜间构建期间扫描源代码以验证是否包含文本 ID,或者实现在运行时验证它的 log4j 附加程序。

然而,我们想要的是在错误方法中添加一个额外的参数。例如:

logger.error("E1234", "发生错误");

这可以通过为 log4j Logger 类实现一些外观类来处理。

有没有其他人遇到过类似的问题?你的解决方案是什么?现在,我们更喜欢第一个代码示例。将来我们可能会实现代码分析器以在夜间构建期间执行(或者有人知道一些现有的代码分析器可以配置为从 error() 方法调用中检测丢失的文本 ID 吗?)

【问题讨论】:

    标签: java logging log4j


    【解决方案1】:

    避免使用这样的复合键:“E1234:An error has occurred”

    我会用

    public enum Error {
     E1234("E1234", "An error has occured"),
     E1245("E1235", "Other error has occured"),
     private final String code;
     private final String description;
     Error(code, description) {
       this.code;
       this.description = description
     }
     @Override
     public String toString() {
       return this.code + ": " + this.description;
     }
    }
    

    然后,您可以使用接受错误的方法创建自己的接口:

    public interface MyLogger {
     void error(Error);
     void info(Error);
     void warn(Error);
     void debug(Error);
    }
    

    然后实现它并委托给 log4j 真正的日志作业。这将帮助您的开发人员避免问题。

    【讨论】:

    • 不需要重写 toString() 吗?
    • 委托给 log4j 需要额外的工作来确保源文件和行号是正确的。
    • 感谢您的回复 - 看起来不错,但我不会使用它。它为 log4j(MyLogger 实现及其工厂)添加了一个额外的层,这很难强制开发人员使用,而不会增加太多好处。我们可能会使用您的错误定义并为其定义一个 ObjectRenderer,
    • 但我相信我宁愿寻找可以在夜间构建期间扫描源代码并报告此类问题的 som 工具。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 2013-11-08
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多