我在项目中使用logback。我已经浏览了大括号的logback链接。
logger.debug(" My class output value - {}, object toString() {}", object.value(), object.toString());
我的项目中未启用调试。我们看到在我们的项目中调用toString()会影响我们的性能。在禁用调试的代码执行期间是否会调用toString()?
我可以用这种方法使用toString()吗?因为按照花括号定义字符串concat不会发生。它只适用于字符串连接还是适用于方法调用?
答案 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%。
使用花括号语法(在手册后不久提出)通常是一个很好的折衷方案,我真的更喜欢它,因为它有助于区分被记录的语句和进入它的数据。但是,如果未启用日志级别,则完全跳过它并不完全相同,因为仍然会评估参数并将其传递给日志记录系统,然后才能确定是否需要记录它们。