8

如何配置 OpenEJB 日志记录格式?这就是我现在在日志中看到的内容:

[...]
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.011 sec
Running com.XXX.FooTest
Apache OpenEJB 3.1.3    build: 20101015-05:42
http://openejb.apache.org/
INFO - openejb.home = /code/XXX
INFO - openejb.base = /code/XXX
INFO - Configuring Service(id=Default Security Serv...
[...]

我想禁用INFO消息,并更改其他人的格式。中的更改log4j.properties没有效果。

4

4 回答 4

8

请记住,您使用 OpenEJB 记录器获得的覆盖能力适用于系统属性以及 InitialContext 属性。

openejb.logger.external属性的真正目标是集成 OpenEJB 的服务器,例如 Geronimo,它们使用不同的日志系统并需要对日志进行高级控制。它不是为常用而设计的,因为启用了此选项并且没有采取其他步骤,您不会获得任何类型的日志记录,甚至不会出现错误,也不会获得有关失败部署的信息。即使正确使用仍然会禁用下面讨论的所有选项。

如果希望在测试中加入或退出日志记录配置,有很多方法可以做到这一点,而不会丢失 OpenEJB 提供的任何日志记录功能。

选项 1:在代码中通过 InitialContext 属性

在测试用例本身中通过 InitialContext 属性

Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory");

p.put("log4j.rootLogger", "fatal,C");
p.put("log4j.category.OpenEJB", "warn");
p.put("log4j.category.OpenEJB.options", "warn");
p.put("log4j.category.OpenEJB.server", "warn");
p.put("log4j.category.OpenEJB.startup", "warn");
p.put("log4j.category.OpenEJB.startup.service", "warn");
p.put("log4j.category.OpenEJB.startup.config", "warn");
p.put("log4j.category.OpenEJB.hsql", "warn");
p.put("log4j.category.CORBA-Adapter", "warn");
p.put("log4j.category.Transaction", "warn");
p.put("log4j.category.org.apache.activemq", "error");
p.put("log4j.category.org.apache.geronimo", "error");
p.put("log4j.category.openjpa", "warn");
p.put("log4j.appender.C", "org.apache.log4j.ConsoleAppender");
p.put("log4j.appender.C.layout", "org.apache.log4j.SimpleLayout");
p.put("openejb.nobanner", "false");

Context context = new InitialContext(p);

选项 2:一个 jndi.properties 文件

文件必须位于任何评估为“/jndi.properties”的路径的类路径中,而不是“/META-INF/jndi.properties”

在 Maven 中,这可以通过将文件放在src/test/resources/jndi.properties

log4j.rootLogger                   = fatal,C
log4j.category.OpenEJB             = warn
log4j.category.OpenEJB.options     = warn
log4j.category.OpenEJB.server      = warn
log4j.category.OpenEJB.startup     = warn
log4j.category.OpenEJB.startup.service = warn
log4j.category.OpenEJB.startup.config = warn
log4j.category.OpenEJB.hsql        = warn
log4j.category.CORBA-Adapter       = warn
log4j.category.Transaction         = warn
log4j.category.org.apache.activemq = error
log4j.category.org.apache.geronimo = error
log4j.category.openjpa             = warn
log4j.appender.C                   = org.apache.log4j.ConsoleAppender
log4j.appender.C.layout            = org.apache.log4j.SimpleLayout
openejb.nobanner = false

这是上述选项的一个简短视频。

请注意,查找和读取 jndi.properties 文件是java vm的一项功能,因此如果它不起作用,则更有可能是配置问题而不是 vm 错误。

选项 3:Maven Surefire 配置

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.5</version>
  <configuration>
    <systemPropertyVariables>
      <log4j.rootLogger>fatal,C</log4j.rootLogger>
      <log4j.category.OpenEJB>warn</log4j.category.OpenEJB>
      <log4j.category.OpenEJB.options>warn</log4j.category.OpenEJB.options>
      <log4j.category.OpenEJB.server>warn</log4j.category.OpenEJB.server>
      <log4j.category.OpenEJB.startup>warn</log4j.category.OpenEJB.startup>
      <log4j.category.OpenEJB.startup.service>warn</log4j.category.OpenEJB.startup.service>
      <log4j.category.OpenEJB.startup.config>warn</log4j.category.OpenEJB.startup.config>
      <log4j.category.OpenEJB.hsql>warn</log4j.category.OpenEJB.hsql>
      <log4j.category.CORBA-Adapter>warn</log4j.category.CORBA-Adapter>
      <log4j.category.Transaction>warn</log4j.category.Transaction>
      <log4j.category.org.apache.activemq>error</log4j.category.org.apache.activemq>
      <log4j.category.org.apache.geronimo>error</log4j.category.org.apache.geronimo>
      <log4j.category.openjpa>warn</log4j.category.openjpa>
      <log4j.appender.C>org.apache.log4j.ConsoleAppender</log4j.appender.C>
      <log4j.appender.C.layout>org.apache.log4j.SimpleLayout</log4j.appender.C.layout>
      <openejb.nobanner>false</openejb.nobanner>
    </systemPropertyVariables>
  </configuration>
</plugin>

选项4:任意组合

另请注意,上述所有技术都可以一次使用,包括您希望在单个测试用例中放置的任何覆盖。优先顺序如下:

  1. InitialContext 属性
  2. 类路径中的 jndi.properties
  3. 系统属性(在这种情况下,通过surefire设置)
  4. 类路径中的嵌入式.logging.properties

选项 5:请求功能

与往常一样,我们很高兴以任何方式让事情变得更容易。如果您有特定的需求或想法,我们很乐意尝试并在您想贡献的情况下帮助您完成它。

于 2010-11-25T19:46:01.480 回答
3

这是我为使事情正常工作所做的(在 中pom.xml):

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.5</version>
  <configuration>
    <systemPropertyVariables>
      <openejb.logger.external>true</openejb.logger.external>
    </systemPropertyVariables>
  </configuration>
</plugin>

现在工作正常。这是我的test/resources/jndi.properties

openejb.validation.output.level=VERBOSE
openejb.nobanner=false

这是test/resources/log4j.properties

log4j.rootLogger=INFO, CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern = [%-5p] %c: %m\n
# OpenEJB levels
log4j.logger.OpenEJB=INFO
log4j.logger.OpenEJB.options=INFO
log4j.logger.OpenEJB.server=INFO
log4j.logger.OpenEJB.startup=INFO
log4j.logger.OpenEJB.startup.service=INFO
log4j.logger.OpenEJB.startup.config=INFO
log4j.logger.OpenEJB.hsql=INFO
log4j.logger.CORBA-Adapter=INFO
log4j.logger.Transaction=INFO
log4j.logger.org.apache.activemq=INFO
log4j.logger.org.apache.geronimo=INFO
# OpenJPA logging levels
log4j.logger.openjpa.Tool=WARN
log4j.logger.openjpa.Runtime=WARN
log4j.logger.openjpa.Remote=WARN
log4j.logger.openjpa.DataCache=WARN
log4j.logger.openjpa.MetaData=WARN
log4j.logger.openjpa.Enhance=WARN
log4j.logger.openjpa.Query=WARN
log4j.logger.openjpa.jdbc.SQL=WARN
log4j.logger.openjpa.jdbc.SQLDiag=WARN
log4j.logger.openjpa.jdbc.JDBC=WARN
log4j.logger.openjpa.jdbc.Schema=WARN

现在我可以在测试期间微调 OpenEJB 的日志记录,感谢 David 的支持 :)

于 2010-11-25T09:42:45.540 回答
2

根据在测试中配置日志记录,您可以覆盖默认的日志记录配置:

  • 通过在创建时放置特定属性InitialContext〜或〜
  • 通过embedded.logging.properties在类路径上提供

这是推荐的方法。

作为替代方案,您可以禁用整个默认配置并提供您自己的:

您可以将“openejb.logger.external”设置为“true”作为系统属性(不能用作 InitialContext 属性)。然后 OpenEJB 根本不会尝试配置日志记录,您可以直接使用 Log4j 的任何 API 配置日志记录;xml、属性或代码。

于 2010-11-14T10:09:43.367 回答
0

如果您不介意使用另一个日志框架,这些链接可能会很有用。

http://hwellmann.blogspot.fi/2012/11/logging-with-slf4j-and-logback-in.html

七月到 SLF4J 桥

不要使用openejb.logger.external=true这种方法。见http://grepcode.com/file/repo1.maven.org/maven2/org.apache.openejb/openejb-core/3.0/org/apache/openejb/util/JuliLogStreamFactory.java

于 2013-02-15T09:51:42.760 回答