默认情况下,logger的additive标志被设置为true,表示子logger将继承父logger的所有appenders。该选项可以被重新设置,表示子logger将不再继承父logger的appenders。
例如:
log4j.rootCategory=INFO, axx, file, notif
log4j.category.il.axxrpc.AxxRpcAdapter=INFO, file
上面这个例子会把AxxRpcAdapter的INFO level的log输出到file, axx, notif三个appender上, 其中axx和notif是继承自root logger的。
如果我们想只把AxxRpcAdapter的log输出到"file", 则应该把additive标志设为false。
log4j.additivity.il.axxrpc.AxxRpcAdapter=false
性能方面考虑:
如果多个线程写log到同一个文件,每个线程拿到RootCategory时会做同步(synchronized),最终会导致线程间的等待,影响性能。
如何避免:
1. 发布的产品log level要尽量设高(比如ERROR, OFF), 少打log;
2. 可以根据模块分文件打log。由于logger的继承性, 不同的appender最终都可以调用到Root Logger而做同步,从而影响性能。所以可以考虑对每个appendername设定additive=false
例如:
log4j.rootCategory=INFO, axx, file, notif
log4j.category.il.axxrpc.AxxRpcAdapter=INFO, file
上面这个例子会把AxxRpcAdapter的INFO level的log输出到file, axx, notif三个appender上, 其中axx和notif是继承自root logger的。
如果我们想只把AxxRpcAdapter的log输出到"file", 则应该把additive标志设为false。
log4j.additivity.il.axxrpc.AxxRpcAdapter=false
性能方面考虑:
如果多个线程写log到同一个文件,每个线程拿到RootCategory时会做同步(synchronized),最终会导致线程间的等待,影响性能。
如何避免:
1. 发布的产品log level要尽量设高(比如ERROR, OFF), 少打log;
2. 可以根据模块分文件打log。由于logger的继承性, 不同的appender最终都可以调用到Root Logger而做同步,从而影响性能。所以可以考虑对每个appendername设定additive=false