Friday, February 18, 2011

Quick Tip on Logging with Java on Google App Engine

I'm in the process of messing around with some really cool stuff on Google App Engine (wonder why ...) and I ran into something that I didn't see covered in the docs (which as a rule are excellent). I came across the solution in a sample app for GAE that solved the problem so I thought I'd share.


Setting up logging in a servlet is pretty straight-forward, particularly if you're using the Eclipse Plugin for GAE since it more or less configures it for you. Here's a quick example. This is dummy code obviously, but pay attention to the package delcaration.

package org.opencfsummit;

import  java.util.logging.Logger;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; 
import java.servlet.ServletException; 


public class MyServlet extends HttpServlet {

    private static final Logger log = Logger.getLogger(MyServlet.class.getName());

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // do whatever else your doPost method needs to do here, and write some info to the log
        log.info("I'd like to write this to the log, please.");

    }

}


That all seemed well and good, but when I looked for my log entries in the GAE admin console, nothing was getting logged.


Well, turns out that even though the Eclipse plugin sets up the basic logging configuration for you, there's a bit of additional configuration needed related to the package in which the class you're logging from resides.


The default WEB-INF/logging.properties file contains this:

# Set the default logging level for all loggers to WARNING
.level = WARNING


Now what didn't make sense to me until I found an example and tried it was why my log.info() calls weren't doing anything. Maybe I'm missing something, but I had to add this to logging.properties to get things to log:

org.opencfsummit.level = INFO


Now why if you're explicitly calling log.info() it wouldn't log the information at the info logging level I'm not sure, but adding my package name and a level to logging.properties definitely took care of the issue. 

No comments: