How to enable embedded tomcat logging
Solution 1
By default the embedded Tomcat uses the logging configuration provided by the JDK. If you haven't changed the configuration only a ConsoleHandler
is configured. If you wanted to programmatically add a FileHandler
you can add it to the root logger. Here's an example that writes to the file catalina.out
by appending the messages on INFO
level. This works for Tomcat 6.x and 7.x.
Logger logger = Logger.getLogger("");
Handler fileHandler = new FileHandler("catalina.out", true);
fileHandler.setFormatter(new SimpleFormatter());
fileHandler.setLevel(Level.INFO);
fileHandler.setEncoding("UTF-8");
logger.addHandler(fileHandler);
Solution 2
Here is what worked for me (Tomcat 9.0.38):
Add system property to point to my logging config:
-Djava.util.logging.config.file=/absolute/path/to/logging.properties
And the contents of logging.properties
is:
java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter
java.util.logging.ConsoleHandler.encoding = UTF-8
handlers = java.util.logging.ConsoleHandler
org.apache.coyote.http2.level = FINE
Solution 3
For me this worked only partially. This requires adding one more line:
java.util.logging.Logger logger = java.util.logging.Logger.getLogger("").setLevel(Level.ALL);
I wanted to show ALL logs and make logging level configurable. Here is what worked for me:
public static void main(String[] args) throws Exception {
// Tuning log level
if (args.length > 0) {
Level level = Level.parse(args[0]);
java.util.logging.Logger logger = java.util.logging.Logger.getLogger("");
logger.setLevel(level);
Handler[] handlers = logger.getHandlers();
Handler handler;
if (handlers.length == 1 && handlers[0] instanceof ConsoleHandler) {
handler = handlers[0];
} else {
handler = new ConsoleHandler();
}
handler.setFormatter(new SimpleFormatter());
handler.setLevel(level);
handler.setEncoding("UTF-8");
logger.addHandler(handler);
}
//... some code here
}
Solution 4
You need to include the tomcat-embed-logging-juli-8.0.15.jar in your classpath.
I used this code to load the logging.properties file and configure the logging externally using the normal java logging approach:
//Loads custom logging configuration located in a properties file named logging.properties
try (InputStream inputStream = new FileInputStream("logging.properties")) {
LogManager.getLogManager().readConfiguration(inputStream);
System.out.println("Custom logging configuraton loaded successfully");
} catch (Exception exception) {
System.err.println ("Custom logging configuration don't found using default system logging configuration.");
}
For more details about configure the logging.properties use this pages: Tomcat logging, org.apache.juli.FileHandler
Also you can use the java.util.logging.FileHandler that is also compatible with the juli aproach an has another advanced configuration options: java.util.logging.FileHandler
There is another jar for use log4j but for me this works fine. Note: I used the tomcat embedded 8.0.15 but there are new versions now.
Admin
Updated on June 04, 2022Comments
-
Admin almost 2 years
I m using embedded tomcat in my java application. below is my source code. however tomcat is not generating any log.
embedded = new Embedded(); embedded.setDebug(3); org.apache.catalina.logger.FileLogger embeddedFileLogger = new org.apache.catalina.logger.FileLogger(); embeddedFileLogger.setDirectory(tomcatHome+"/log"); embeddedFileLogger.setPrefix("Embedded_log_"); embeddedFileLogger.setSuffix(".txt"); embeddedFileLogger.setTimestamp(true); embeddedFileLogger.setVerbosity(3); //embedded.setLogger(new SystemOutLogger()); engine = embedded.createEngine(); //engine.setLogger(embeddedFileLogger); embeddedFileLogger.setContainer(engine); engine.setDefaultHost("localhost"); host = embedded.createHost("localhost", tomcatHome + "/webapps"); //host.setLogger(embeddedFileLogger); engine.addChild(host); _context = embedded.createContext("", tomcatHome + "/webapps/ROOT"); host.addChild(_context); embedded.addEngine(engine); CoyoteConnector connector = (CoyoteConnector)embedded.createConnector(InetAddress.getByName(ipAddress), port, false); embedded.addConnector(connector); embedded.setLogger(embeddedFileLogger); embedded.start();
Please let me know how can i enable embedded tomcat logging through code or tomcat configuration.