【问题标题】:Configure Log4j2 in Google App Engine在 Google App Engine 中配置 Log4j2
【发布时间】:2016-02-05 14:17:57
【问题描述】:

我在网上查看并找不到一个易于遵循的指南来为 Google App Engine 启用 Log4j2。刚接触此功能.. 我发现了 3 个可能相关的主要文件。

1) appengine-web.xml 2) log4j.properties 3) log4j2.xml

我的 Log4j.properties 如下所示:(这已包含在 Web-Inf 中)

log4j.appender.toFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.toFile.File=./log/logfile.log
log4j.appender.toFile.DatePattern='.'
log4j.appender.toFile.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=% %-5p [%t] - %c.%M - %m%n

我在 appengine-web.xml 中添加了以下内容

  <!-- Configure apache Log4J Logging -->
  <system-properties>
  <property name="org.apache.logging.log4j.config.file" value="WEB-    INF/log4j.properties"/>
  </system-properties>

在运行 Java 应用程序时,我收到错误消息。

ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.

我的意图是将条目记录到文件中。关于我在哪里可以找到专门针对 Google App Engine 的示例的任何指示。

【问题讨论】:

  • 独立于您的 log4j2 配置所在的位置,您根本无法登录到 App Engine 上的文件。请参阅:stackoverflow.com/questions/2693081/…。我让我的回答反映了这一点,并建议您使用日志外观来实现可重用性(如果这是您所关心的)。可悲的是,我因此而被否决了。

标签: google-app-engine log4j2


【解决方案1】:

Log4j2 不使用 log4j.properties。该文件适用于 Log4j 1.x。最新版本的 log4j2 确实支持使用属性文件进行配置,但语法与 log4j1 不同。它还支持 XML、JSON 和 YAML。

就 Google App Engine 而言,恐怕我从未尝试过。

【讨论】:

    【解决方案2】:

    在 GAE 上没有关于 log4j2 的好教程的原因是你不能在 GAE 上使用 log4j2 并将文件作为输出。 GAE 文件系统是只读的。您将无法登录 vanilla 应用引擎上的文件。您也许可以在托管虚拟机中执行此操作。

    App Engine 使用java.util.logging,可以在WEB-INF 文件夹中的logging.properties 文件中进行配置。

    如果您想让您的日志记录机制更具可重用性,我建议您查看slf4j。您可以像这样添加 maven 依赖项(如果您使用 maven):

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-jdk14</artifactId>
            <version>RELEASE</version>
        </dependency>
    

    如果您在混音中添加一点 lombok,您可以使用 @Slf4j 注释您的类,然后使用 log.info()/.warn()/.error() 开始使用记录器。

    我发现这是迄今为止使用 Java 登录应用引擎的最佳解决方案。

    还有一件事要考虑:如果您可以将日志写入 App Engine 中的文件,您将如何使您的日志可供您自己使用,而不是向公众提供?您最终不会不得不编写一个 ui 来访问您的日志文件吗?如果您这样做...为什么不直接使用 App Engine 提供的日志记录工具?

    【讨论】:

    • 为什么使用 slf4j 与 log4j2 有什么不同?您在 Slf4j 中可以做的任何事情都应该在 Log4j2 中实现。
    • @rgoers 我很难理解你的陈述。 slf4j NOT 本身就是一个记录器,而是一个利用各种记录工具(如 java.util.logging 或 log4j 或 log4j2)的外观。您可能能够配置 log4j2 以登录到 java.util.logging。这似乎毫无意义,因为它将是一个日志设施登录到另一个。那有什么好处呢?使用 slf4j 可以重用相同的类,并调用相同的日志记录,而与实际的日志记录工具是什么或如何配置无关。
    • SLF4J 是一个日志 API。它必须绑定到日志记录实现。 Log4j2 也有一个 API 和一个实现。是的,SLF4J 的重点是成为日志记录的抽象,但这并不能解决无法记录到文件的问题。通过 java.util.logging 进行日志记录同样可能有同样的问题。所以我又要问了,用SLF4J怎么解决这里问的问题?
    • @rgoers 这真的很简单。您可以 不能 永远登录到应用引擎中的文件,因为文件系统是只读的。因此,这个问题无法解决(除非您使用托管虚拟机并通过保险丝挂载云存储,这将是一种特殊的愚蠢行为)。我非常喜欢 log4j 和 log4j2,但它不是登录应用引擎的好选择,因为正如我之前所说:应用引擎中唯一支持的记录器是 java.util.logging。我只是将 slf4j 包裹起来,以使我的类在非应用程序引擎代码中可用(如果我可以使用 log4j2)。
    • @rgoers App Engine 有自己的java.util.logging 实现,并且日志最终出现在项目的控制台中,机制未知。在托管 VM 中,您可以登录到某些文件(请参阅:cloud.google.com/appengine/articles/logging),在其他任何地方您都可以使用 Logs Api(请参阅:cloud.google.com/appengine/docs/java/logs)。可以为 API 编写一个 appender,但与官方支持的日志记录方法相比,它的性能可能很差。如果您想了解更多有关 Google 如何实现 jul 的详细信息,我建议您联系 Google 的技术支持。
    猜你喜欢
    • 1970-01-01
    • 2015-12-08
    • 2017-07-08
    • 1970-01-01
    • 2011-07-03
    • 2012-09-14
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    相关资源
    最近更新 更多