4

我们正在开发相当大的服务器应用程序。每个动作都由日志跟踪。调用 toString 方法的日志很多。不幸的是,我们需要其中的大部分,另一方面,我们无法跟踪 prod 上发生的情况。尝试改进 toString 方法有意义吗?例如,将 toString 的结果放入内存中,如果某些字段被更新,则更新。

example of my toString
public classs InMessage{
//declared 20+ fields
     @Override
      public String toString() {
       StringBuilder builder = new StringBuilder(this.getClass().getSimpleName());
       builder.append(": [");
       builder.append(super.toString());
       builder.append("; updateTime: ");
       builder.append(updateTime);
       //forexample 20 fields here
       builder.append(";]");
       return builder.toString();
     }}
then we process InMessage in some way and log each action
     log.debug("We received inMessage: {}", inMessage);

经过这次讨论,我们决定尽可能减少日志数量,仅此而已。

4

2 回答 2

8

除非您经常遇到性能或内存问题,否则不要担心。有用的日志可以极大地帮助产品诊断,您需要权衡它与可能永远不会发生的假设性能担忧。

(并不是说你在这里肯定会没有问题,只是不要优化那些不是真正问题的东西......)

编辑:相信你自己的判断,你是否记录了“太多”;如果单个 UI 或服务操作生成 20 页的附带/调试级别信息,即使在 INFO 级别日志记录中,您可能需要优化内容以使其真正有用

于 2013-02-14T13:53:49.333 回答
3

这种纳米优化通常以无用的努力结束,除了从以秒或有时以分钟为单位处理的时间中减去一些毫秒之外,不会增加任何整体价值。视情况而定,但您的情况可能是每一点都很重要的情况之一。

根据数据确定优化需求,不要预先优化,尤其是使用此类方法。我敢打赌,还有其他方法可以证明比质疑toStringlike 的使用更有价值,例如,改进常用算法的顺序或减少操作的负载(更少的调用,但重要的调用)。

只需将 的用法toString与您想到的解决方案进行比较,您正在实现一种观察者模式,如果字段发生更改,它会更新中央字符串存储库?那是在每个 setter 上执行代码(如果您使用这种方法)。

于 2013-02-14T13:57:22.643 回答