我使用log4j登录我的项目。这是它的样本设置:
public class MyClass {
private final Logger logger = Logger.getLogger(MyClass.class);
public MyClass() {
BasicConfigurator.configure();
Logger.getLogger(MyClass.class).setLevel(Level.INFO);
}
...
}
问题在于,在每次下一次记录器调用时,它都会复制日志消息(我的意思是在第一次呼叫时只有1条消息,在第二次呼叫时有2条相同的消息,然后有3条消息,依此类推)。似乎每次创建新记录器的实例并与所有旧实例一起使用 如何避免这个问题? 感谢。
UPP。试图让它静止,但它无论如何都不起作用。我仍然收到多条日志消息。有任何想法吗?可能是某些Weblogic特定的东西?
答案 0 :(得分:4)
制作记录器static
private static final Logger logger = Logger.getLogger(MyClass.class);
这里的关键是为每个类创建一个Logger
,而不是为每个实例创建一个。{/ p>
答案 1 :(得分:2)
尝试设置可加性false
programmatically或在配置中
Logger.getLogger(MyClass.class).setAdditivity(false);
对我而言,当我在 log4j.xml
中设置它时,这就成功了<logger name="com.stackoverflow.answers.gnat" additivity="false">
<!-- note additivity value set above -->
<level value="INFO"/>
<appender-ref ref="knowledge"/>
<appender-ref ref="reputation"/>
</logger>
答案 2 :(得分:1)
如果您按照上面的建议使Logger类静态,然后确保您通过JVM级别的-D系统属性或应用程序的配置来配置log4j,那么您应该没有任何问题。在类加载时或实例创建时调用解析配置是不必要的开销。
log4j应该只需要初始化一次配置 - 无论是初始化服务器还是部署应用程序。
您的项目是否为网络应用程序?
此外,您可以在此处找到有关挂钩到WebLogic Server日志记录配置的更多信息:http://download.oracle.com/docs/cd/E12840_01/wls/docs103/logging/logging_services.html
希望有所帮助。
答案 3 :(得分:0)
问题在于BasicConfurator.configure()
方法。
我在我的java项目中遇到了完全相同的问题,而且我没有使用WebLogic。
我将BasicConfigurator.configure()
方法从beforeTest()
移至beforeClass()
,突然问题就消失了。
@BeforeClass
public static void beforeClass() {
BasicConfigurator.configure();
GeoLogger.setLogLevel(Level.INFO);
}
@Before
public void beforeTest() {
//BasicConfigurator.configure();
}
希望这有助于指导您找到解决方案。