AppEngine使用JUL进行日志记录,我已经配置了logging.properties文件并在appengine-web.xml中引用了该文件
问题是AppEngine在控制台日志中显示数据的格式在每个日志行上大约180个字符后被截断。由于大部分内容都采用了方法和类名(包括包)和日期,因此没有太多的实际日志消息。
我试图以编程方式和通过logging.properties配置我自己的Formatter,但没有运气。
我意识到我可以通过slf4j,logback或log4j推送所有日志,但我相信这样做会导致所有这样的日志在AppEngine日志控制台中显示为stdout,它具有自己的详细风格。
有没有办法为AppEngine日志定义特定的格式,如果是这样的话?如果每个日志行没有被截断为180个字符,那就足够了。
答案 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