-
Notifications
You must be signed in to change notification settings - Fork 6
Examples
Matthew Khouzam edited this page Mar 11, 2025
·
2 revisions
To instrument
import java.io.FileWriter;
public class SlappyWag {
public static void main(String[] args) {
System.out.println("The program will write hello 10x between two scope logs\n");
try (FileWriter fw = new FileWriter("test.txt")) {
for (int i = 0; i < 10; i++) {
fw.write("Hello world "+ i);
}
}
}
}one needs to add to the try-with-resources block a scopewriter
import java.io.FileWriter;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.eclipse.tracecompass.traceeventlogger.LogUtils;
public class SlappyWag {
private static Logger logger = Logger.getAnonymousLogger();
public static void main(String[] args) {
// Set the logger level based on your requirements
// logger.setLevel(Level.FINE);
System.out.println("The program will write hello 10x between two scope logs\n");
try (LogUtils.ScopeLog sl = new LogUtils.ScopeLog(logger, Level.FINE, "writing to file"); FileWriter fw = new FileWriter("test.txt")) {
for (int i = 0; i < 10; i++) {
fw.write("Hello world "+ i);
}
}
}
}Will generate the following trace
{"ts":0,"ph":"B","tid":1,"name":"writing to file"}
{"ts":100000,"ph":"E","tid":1}example 2:
try (LogUtils.ScopeLog linksLogger = new LogUtils.ScopeLog(logger, Level.CONFIG, "Perform Query")) { //$NON-NLS-1$
ds.updateAllReferences();
dataStore.addAll(ds.query(timestamp, value));
}will generate the following trace
{"ts":12345,"ph":"B","tid":1,"name":"Perform Query"}
{"ts":12366,"ph":"E","tid":1}See more examples in javadoc.
P.S.: You may need to terminate the logger thread at the end of your program since the library cannot terminate it automatically.
import java.util.logging.LogManager;
import java.util.logging.Logger;
public class SlappyWag {
private static Logger logger = Logger.getAnonymousLogger();
public static void main (String[] args) {
// Your code
// ...
LogManager.getLogManager().reset();
// End of your program
}
}War files work just like jars in this application, the XBootPath loader is needed though.
// HelloWorldWar.java
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.eclipse.tracecompass.traceeventlogger.LogUtils;
@WebServlet("/hello")
public class HelloWorldWar extends HttpServlet {
private static Logger logger;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try(LogUtils.ScopeLog sl = new LogUtils.ScopeLog(logger, Level.FINER, "doGetHello");){
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h1>Hello, World! From a WAR file!</h1>");
out.println("</body></html>");
}
}
public static void main(String[] args) {
logger = Logger.getAnonymousLogger();
List<String> myList = new ArrayList<>();
myList.add("Apple");
myList.add("Banana");
myList.add("Cherry");
myList.add("Date");
myList.add("Fig");
try (LogUtils.ScopeLog sl = new LogUtils.ScopeLog(logger, Level.FINER, "enhanced_for");){
for (String item : myList) {
System.out.println("Processing: " + item);
if (item.equals("Banana")) {
myList.remove("Cherry"); // Removing an element *after* the current one.
}
if(item.equals("Date")){
myList.remove("Fig");
}
}
} catch (java.util.ConcurrentModificationException e) {
LogUtils.traceInstant(logger, Level.WARNING, "cme", e.getMessage());
System.out.println("ConcurrentModificationException caught: " + e);
}
}
}The war file needs to be launched with
-Xbootclasspath/a:%home%/.m2/repository/org/eclipse/tracecompass/trace-event-logger/x.y.z/trace-event-logger-x.y.z.jarThen the war is instrumented.
The final trace here would be:
Here is an example of instrumenting code with a concurrent modification exception.
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.eclipse.tracecompass.traceeventlogger.LogUtils;
public class cme {
public static void main(String[] args) {
Logger logger = Logger.getAnonymousLogger();
List<String> myList = new ArrayList<>();
myList.add("Apple");
myList.add("Banana");
myList.add("Cherry");
// Example 1: ConcurrentModificationException using enhanced for-loop
try (LogUtils.ScopeLog sl = new LogUtils.ScopeLog(logger, Level.FINER, "enhanced_for");){
for (String item : myList) {
if (item.equals("Banana")) {
myList.remove("Banana"); // Modifying the list during iteration
}
}
} catch (java.util.ConcurrentModificationException e) {
LogUtils.traceInstant(logger, Level.WARNING, "cme", e.getMessage());
System.out.println("ConcurrentModificationException caught (enhanced for-loop): " + e);
}
// Reset the list
myList.clear();
myList.add("Apple");
myList.add("Banana");
myList.add("Cherry");
// Example 2: ConcurrentModificationException using Iterator (incorrect usage)
try (LogUtils.ScopeLog sl = new LogUtils.ScopeLog(logger, Level.FINE, "iterator")){
Iterator<String> iterator = myList.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
if (item.equals("Banana")) {
myList.remove("Banana"); // Modifying the list directly, not via the iterator
}
}
} catch (java.util.ConcurrentModificationException e) {
LogUtils.traceInstant(logger, Level.WARNING, "cme", e.getMessage());
System.out.println("ConcurrentModificationException caught (iterator, incorrect): " + e);
}
// Reset the list
myList.clear();
myList.add("Apple");
myList.add("Banana");
myList.add("Cherry");
// Example 3: Correct usage of Iterator to avoid ConcurrentModificationException
try (LogUtils.ScopeLog sl = new LogUtils.ScopeLog(logger, Level.FINE, "good")){
Iterator<String> iterator = myList.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
if (item.equals("Banana")) {
iterator.remove(); // Correct way to remove using the iterator
}
}
System.out.println("List after correct removal: " + myList);
} catch (java.util.ConcurrentModificationException e) {
LogUtils.traceInstant(logger, Level.WARNING, "cme", e.getMessage());
System.out.println("ConcurrentModificationException caught (iterator, correct): " + e);
}
}
}Generates
[{"ts": "1740543289400065", "ph": "B", "tid": 1, "pid": 1, "name": "enhanced_for"},
{"ts": "1740543289423019", "ph": "E", "tid": 1, "pid": 1},
{"ts": "1740543289428146.2", "ph": "B", "tid": 1, "pid": 1, "name": "iterator"},
{"ts": "1740543289438413.2", "ph": "E", "tid": 1, "pid": 1},
{"ts": "1740543289439121", "ph": "B", "tid": 1, "pid": 1, "name": "good"},
{"ts": "1740543289440130.2", "ph": "E", "tid": 1, "pid": 1}]For an eclipse application add
-Xbootclasspath/a:./plugins/org.eclipse.tracecompass.trace-event-logger_x.y.z.jarTo the launch command
For instrumentation examples, see the Trace Compass git repo.