在logback中的toString

时间:2018-05-03 17:19:15

标签: java string logback logback-classic

我在项目中使用logback。我已经浏览了大括号的logback链接。

logger.debug(" My class output value - {}, object toString() {}", object.value(), object.toString());

我的项目中未启用调试。我们看到在我们的项目中调用toString()会影响我们的性能。在禁用调试的代码执行期间是否会调用toString()?

我可以用这种方法使用toString()吗?因为按照花括号定义字符串concat不会发生。它只适用于字符串连接还是适用于方法调用?

2 个答案:

答案 0 :(得分:1)

来自LogBack文档:

path = r'C:\\data\\'              
all_files = glob.glob(os.path.join(path, "*.bed")) 

df_from_each_file = (pd.read_csv(f, sep='\t') for f in all_files)
dfall = pd.concat(df_from_each_file, ignore_index=True)

因此,通过仅传递对象,而不调用toString(),您将保存toString()开销。

答案 1 :(得分:1)

Logback不会更改Java的规则:调用方法时,需要计算方法的参数以便传递给方法。在未启用日志级别时使用大括号表示法保存的所有内容都是String concatenation 的成本,也就是说,构造要从中记录的完整String的成本个别组件。

如果评估参数的成本显着降低了您的性能,使其不再满足客户的需求,那么您可能希望避免在未启用日志级别的情况下运行它的成本。从Logback手册第2章:架构,“Parameterized logging”:

  

避免参数构造成本的一种可能方法是使用测试包围日志语句。这是一个例子。

if(logger.isDebugEnabled()) { 
   logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
}
     

这样,如果logger禁用调试,则不会产生参数构造的成本。另一方面,如果为DEBUG级别启用了记录器,则会产生评估记录器是否启用的成本,两次:debugEnabled一次和debug一次。实际上,这种开销是微不足道的,因为评估记录器所需的时间不到实际记录请求所需时间的1%。

使用花括号语法(在手册后不久提出)通常是一个很好的折衷方案,我真的更喜欢它,因为它有助于区分被记录的语句和进入它的数据。但是,如果未启用日志级别,则完全跳过它并不完全相同,因为仍然会评估参数并将其传递给日志记录系统,然后才能确定是否需要记录它们。