在寻找一种将日志实际写入log4j库中文件的方法时,在以下方法中找到
public void callAppenders(LoggingEvent event) {
int writes = 0;
for (Category c = this; c != null; c = c.parent) {
synchronized (c) {
if (c.aai != null) {
writes += c.aai.appendLoopOnAppenders(event);
}
if (!c.additive) {
break;
}
}
}
if (writes == 0) {
this.repository.emitNoAppenderWarning(this);
}
}
但是无法理解for循环中发生了什么。谁能帮助我了解这里的迭代过程?永远不要碰到这种代码片段..!
更新:
我编写了使用一种方法登录日志文件的代码。在该方法中,它调用下面来自log4j库的方法
public void log(String callerFQCN, Priority level, Object message, Throwable t) {
if (this.repository.isDisabled(level.level)) {
return;
}
if (level.isGreaterOrEqual(getEffectiveLevel())) {
forcedLog(callerFQCN, level, message, t);
}
}
从这里是forceLog方法
protected void forcedLog(String fqcn, Priority level, Object message, Throwable t) {
callAppenders(new LoggingEvent(fqcn, this, level, message, t));
}
这最后调用了顶部的callAppenders
方法提及。 protected volatile Category parent;
存在于Category类中,所有上述方法也是该类的一部分。
谢谢
答案 0 :(得分:1)
可能您习惯于看到类似这样的循环
for (int i=0; i<10; i++) { ... }
,并了解此操作将i
从0
迭代到10
以下,即9
。
也许您发现此循环的语法有点怪异,但从未对此有更深入的了解。所以,让我们现在开始。
int i=0
是创建迭代初始状态的语句。在这里,它定义了一个名为i
的新整数变量,并将其初始化为0
。这就是为什么此循环从0开始的原因。i<10
是一个布尔表达式,它决定是否(进一步)执行循环体。这个定义了只要i
小于10
,就应该重复循环。i++
定义了迭代之间要更改的内容。在这里,它会将i
增加1
。现在,让我们看一下代码段
for (Category c = this; c != null; c = c.parent) { ... }
Category c = this
创建一个类型为Category
的新变量,并将其初始化为this
。因此,对于第一次迭代,c
将是this
。c != null
定义了只要类别c
不是null
,循环就会重复。c = c.parent
定义每次下一次循环迭代都使用当前类别的父级。类别对象似乎具有父字段,从而创建链,直到最顶层的类别在此字段中具有空值。因此,循环遵循从当前类别到最顶层的链。
因此,迭代是:
直到c
变为null
(因为某些最终父代本身具有空父代)。循环体不会创建或修改任何Category实例,这意味着循环仅遵循开始循环之前已建立的Category父层次结构。
因此,如果到目前为止仅使用for (int i=0; i<10; i++) { ... }
模式,那么您将错过for
循环的许多功能和灵活性。