9

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

问题是 AppEngine 在控制台日志中显示数据的格式在每条日志行大约 180 个字符后被截断。而且由于其中很大一部分被方法和类名(包括包)和日期占用,因此没有太多实际的日志消息出现。

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

我意识到我可以通过 slf4j、logback 或 log4j 推送我的所有日​​志,但我相信这样做会导致所有此类日志在 AppEngine 日志控制台中显示为标准输出,该控制台具有自己的冗长风格。

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

4

3 回答 3

3

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

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,因此您必须使用严重性和 num_days 参数才能使其有用。

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

 --version=worker
于 2012-10-16T08:29:25.817 回答
0

在深入研究之后,我无法获得自定义 JUL 处理程序或格式化程序以被 appengine 运行时拾取。因此,我创建了一个 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)
    {}
}

更新: 上面的代码在开发环境中工作,但在 Appengine 上似乎被忽略了。回到这个绘图板上。

于 2012-10-14T16:38:30.123 回答
0

查看 App 引擎配置工具本身的源代码,我看到它所做的一切都是调用同一个 LogService,您可以通过 LogService API 访问自己。

因此,您的问题的答案真的很简单,只需将以下链接中的代码放到您的代码库中,仅将其保护给管理员用户并解决问题。

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

于 2012-10-22T13:05:46.103 回答