如何更改Google AppEngine中的日志记录格式

时间:2012-10-01 06:11:38

标签: google-app-engine logging java.util.logging

AppEngine使用JUL进行日志记录,我已经配置了logging.properties文件并在appengine-web.xml中引用了该文件

问题是AppEngine在控制台日志中显示数据的格式在每个日志行上大约180个字符后被截断。由于大部分内容都采用了方法和类名(包括包)和日期,因此没有太多的实际日志消息。

我试图以编程方式和通过logging.properties配置我自己的Formatter,但没有运气。

我意识到我可以通过slf4j,logback或log4j推送所有日志,但我相信这样做会导致所有这样的日志在AppEngine日志控制台中显示为stdout,它具有自己的详细风格。

有没有办法为AppEngine日志定义特定的格式,如果是这样的话?如果每个日志行没有被截断为180个字符,那就足够了。

3 个答案:

答案 0 :(得分:2)

您是否尝试过使用日志下载功能:它不会截断日志,您可以查看所有内容,还可以指定要下载的日志条目的天数和严重程度。

C:\eclipse\plugins\com.google.appengine.eclipse.sdkbundle_1.7.2.1\appengine-java-sdk-1.7.2.1\bin>appcfg.cmd --severity=DEBUG --num_days=2 request_logs C:\workspace\my_app\war C:\workspace\MY_LOGS.TXT

<path to SDK>/appcfg.cmd --severity=DEBUG --num_days=2 request_logs <path to war> <path to log>

这是我发现能够查看我的日志详细信息的唯一方法。默认日志级别为INFO,因此您必须使用severity和num_days参数才能使用它。

此外,如果要下载后端的日志,则需要在命令行上使用以下选项指定后端版本。工人是后端的名称。

 --version=worker

答案 1 :(得分:0)

进一步深入研究之后,我无法通过appengine运行时获取自定义JUL Handler或Formatter。因此,我创建了一个ServletContextListener来使用我自己的自定义格式化程序初始化根记录器,如下所示:

<listener>
   <listener-class>MyLoggingListener</listener-class>
</listener>

以下是ServletContextListener示例:

public class MyLoggingListener implements ServletContextListener
{
    private static Logger LOG;

    @Override
    public void contextInitialized(ServletContextEvent sce)
    {
        LOG = Logger.getLogger("");
        Handler[] handlers = LOG.getHandlers();
        for (Handler handler : handlers)
        {
            handler.setFormatter(new MyLogFormatter());
        }
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce)
    {}
}

<强>更新 上面的代码在Dev环境中工作,但在Appengine上似乎被忽略了。回到这个图纸上。

答案 2 :(得分:0)

查看App引擎配置工具本身的源代码,我已经看到它正在调用相同的LogService,您可以通过LogService API自行访问它。

因此,您的问题的答案非常简单,只需将代码从以下链接中删除到您的代码库中,只将其保护到管理员用户并解决问题。

https://developers.google.com/appengine/docs/java/logservice/overview