DevFaqAddTimestampToLogs
DevFaqAddTimestampToLogs
Friday, June 20, 2014 5:34 AM
Contents |
How do I Add a Timestamp to the Logs?
This FAQ entry demonstrates how to prepend a timestamp to your log file entries. For example:
05:42:51.210 CONFIG [com.emxsys.wmt.core.project.GlobalActionContextProxy]: Creating a proxy .... 05:42:51.295 WARNING [org.openide.filesystems.Ordering]: Not all children in .... 05:42:52.151 INFO [org.netbeans.core.startup.NbEvents]: Turning on modules: ....
Please note, the NetBeans Platform includes its own logging mechanism. If you customize the logging through the use of the java.util.logging.config.file or java.util.logging.config.class property settings, then the native NetBeans logging mechanism is disabled, and either the default Java logging or your custom logging class is used instead.
Solution
This solution shows how to customize the output from the native NetBeans log formatter (NbFormatter) by creating a new custom formatter that by prepends a timestamp to the NbFormatter output. Note, using NbFormatter requires a private package reference to the org-netbeans-core-startup module. This FAQ will also show how to establish the private package access.
Step 1. Establish Project Dependencies
Include the a dependency on org-netbeans-core-startup in the project that will implement the custom formatter. In Maven, add following dependency to the project POM:
<dependency> <!--Private Package References: see maven plugin dependencies ...--> <artifactId>org-netbeans-core-startup</artifactId> <groupId>org.netbeans.modules</groupId> <version>${netbeans.version}</version> </dependency>
Step 2. Create the Custom Log Formatter
Here's an example of a custom Formatter. It uses the NetBeans NbFormatter instance to obtain a formatted message from the LogRecord. NbFormatter is a final class that exposes itself via a public static FORMATTER property. This solution simply prepends the timestamp, extracted from the LogRecord, to the formatted log message.
import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.logging.Formatter; import java.util.logging.LogRecord; import org.netbeans.core.startup.logging.NbFormatter; // Private Package Referenced: See POM notes. public class LogFormatter extends Formatter { @Override public String format(LogRecord record) { String logMsg = NbFormatter.FORMATTER.format(record); StringBuilder sb = new StringBuilder(); // Prepend a timestamp Instant instant = Instant.ofEpochMilli(record.getMillis()); ZonedDateTime timestamp = ZonedDateTime.ofInstant(instant, ZoneId.systemDefault()); sb.append(timestamp.toLocalTime.toString()); sb.append(' '); sb.append(logMsg); return sb.toString(); } }
Step 3. Override the Default Formatters
In a module Installer class, include the following code block:
LogFormatter formatter = new LogFormatter(); // Custom formatter // Override the default formatters with the custom formatter Logger logger = Logger.getLogger (""); // Root logger Handler[] handlers = logger.getHandlers(); for (Handler handler : handlers) { handler.setFormatter(formatter); }
Step 4. Configure Access to Private Package
In the module POM, configure the nbm-maven-plugin dependencies to allow the private package access to org.netbeans.modules:org-netbeans-core-startup via a 'impl' module dependency:
<plugin> <artifactId>nbm-maven-plugin</artifactId> <groupId>org.codehaus.mojo</groupId> <extensions>true</extensions> <configuration> <moduleDependencies> <dependency> <!--Private Package Reference--> <id>org.netbeans.modules:org-netbeans-core-startup</id> <type>impl</type> </dependency> </moduleDependencies> </configuration> </plugin>
Final Notes
Disable any java.util.logging.config.file or java.util.logging.config.class property settings. Check your application's .conf file, and in the application's POM, check the additionalArguments entry.
This example was tested with NetBeans 8.0 and JDK 8.