Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Protokollieren, überwachen und verfolgen Vortrag zum Seminar „Aspektorientierte Programmierung“ von Andre Kaplick - 6. Juni 2016.

Ähnliche Präsentationen


Präsentation zum Thema: "Protokollieren, überwachen und verfolgen Vortrag zum Seminar „Aspektorientierte Programmierung“ von Andre Kaplick - 6. Juni 2016."—  Präsentation transkript:

1 protokollieren, überwachen und verfolgen Vortrag zum Seminar „Aspektorientierte Programmierung“ von Andre Kaplick - 6. Juni 2016

2 Andre Kaplick - 07. Juni ‚06 2/26 Seminar „Aspektorientierte Programmierung“ Die Gliederung Warum AspectJ zum protokollieren benutzen? Ein paar Protokoll-Aspekte Weitere Einsatzgebiete von Protokollierungs-Aspekten

3 Warum AspectJ zum protokollieren benutzen? Ein anschauliches Beispiel.

4 Andre Kaplick - 07. Juni ‚06 4/26 Seminar „Aspektorientierte Programmierung“ Die Beispielklassen (1) public class Item { private String id; private float price; public Item(String id, float price) { this.id = id; this.price = price; } public String getID() { return id; } public float getPrice() { return price; } public String toString() { return "Item: " + id; } import java.util.List; import java.util.Vector; public class Inventory { private List items = new Vector(); public void addItem(Item item) { items.add(item); } public void removeItem(Item item) { items.remove(item); }

5 Andre Kaplick - 07. Juni ‚06 5/26 Seminar „Aspektorientierte Programmierung“ Die Beispielklassen (2) public class ShoppingCartOperator { public static void addShoppingCartItem( ShoppingCart sc, Inventory inventory, Item item) { inventory.removeItem(item); sc.addItem(item); } public static void removeShoppingCartItem( ShoppingCart sc, Inventory inventory, Item item) { sc.removeItem(item); inventory.addItem(item); } import java.util.*; public class ShoppingCart { private List items = new Vector(); public void addItem(Item item) { items.add(item); } public void removeItem(Item item) { items.remove(item); } public float totalValue() { // unimplemented... free! return 0.5f; }

6 Andre Kaplick - 07. Juni ‚06 6/26 Seminar „Aspektorientierte Programmierung“ Die Beispielklassen (3) public class Test { public static void main(String[] args) { Inventory inventory = new Inventory(); Item item1 = new Item("1", 30); Item item2 = new Item("2", 31); Item item3 = new Item("3", 32); inventory.addItem(item1); inventory.addItem(item2); inventory.addItem(item3); ShoppingCart sc = new ShoppingCart(); ShoppingCartOperator.addShoppingCartItem(sc, inventory, item1); ShoppingCartOperator.addShoppingCartItem(sc, inventory, item2); }

7 Andre Kaplick - 07. Juni ‚06 7/26 Seminar „Aspektorientierte Programmierung“ Konventionelles protokollieren Für jede Klasse static Logger logger = Logger.getLogger("trace"); Für jede Methode logger.logp(Level.INFO, " ", " ", "Entering"); 5 Klassen und 13+1 Methoden Haben wir uns auch nicht verschrieben??

8 Andre Kaplick - 07. Juni ‚06 8/26 Seminar „Aspektorientierte Programmierung“ Die Ausgabe Mar 30, 2006 12:14:20 AM Test main INFO: Entering Mar 30, 2006 12:14:20 AM Inventory addItem INFO: Entering Mar 30, 2006 12:14:20 AM Inventory addItem INFO: Entering Mar 30, 2006 12:14:20 AM Inventory addItem INFO: Entering Mar 30, 2006 12:14:20 AM ShoppingCartOperator addShoppingCartItem INFO: Entering....

9 Andre Kaplick - 07. Juni ‚06 9/26 Seminar „Aspektorientierte Programmierung“ Warum ist diese Vorgehensweise so unschön? Zugriff pro Klasse Zugriff pro Methode Änderbarkeit Copy & Paste

10 Andre Kaplick - 07. Juni ‚06 10/26 Seminar „Aspektorientierte Programmierung“ Die aspektorientierte Art zu protokollieren import java.util.logging.*; import org.aspectj.lang.*; public aspect TraceAspect { private Logger logger = Logger.getLogger("trace"); pointcut traceMethods() : execution(* *.*(..)) && !within(TraceAspect); before() : traceMethods() { Signature sig = thisJoinPointStaticPart.getSignature(); logger.logp(Level.INFO, sig.getDeclaringType().getName(), sig.getName(), sig.getName(), "Entering"); } Aspekt nicht loggen

11 Andre Kaplick - 07. Juni ‚06 11/26 Seminar „Aspektorientierte Programmierung“ Warum ist dies so schön? Umkehrung der Verantwortlichkeit Zentralisierung Wiederverwendbar Leicht änderbar Kein Copy & Paste Zuverlässiger

12 Andre Kaplick - 07. Juni ‚06 12/26 Seminar „Aspektorientierte Programmierung“ Eingeschränkte Protokollierung Einfach Pointcut ändern Beispiel: pointcut traceMethods(): ( execution(* model..*.*(..)) || execution(model..*.new(..)) || execution(* ui.*.*(..)) || execution(ui.*.new(..)) || execution(* util.ComplexComputation.*(..)) || execution(util.ComplexComputation.new(..)) || execution(* database.Database.set*(..)) ) && !within(TraceAspect); Paketen model... Direkte Unterpakete von ui util.ComplexComputation set – Methoden in database.Database

13 Ein paar Protokoll-Aspekte Lösung für nerviges Problem.

14 Andre Kaplick - 07. Juni ‚06 14/26 Seminar „Aspektorientierte Programmierung“ Methodenaufrufe einschließlich Parameter protokollieren (1) import org.aspectj.lang.*; public aspect TraceAspect { pointcut traceMethods() : ( execution(* *.*(..)) || execution(* *.new(..)) ) && !within(TraceAspect); before() : traceMethods() { Signature sig = thisJoinPointStaticPart.getSignature(); System.out.println("Entering [" + sig.getDeclaringType().getName() + "." + sig.getName() + "]" createParameterMessage(thisJoinPoint) + createParameterMessage(thisJoinPoint)); } alle Methoden und Konstruktoren

15 Andre Kaplick - 07. Juni ‚06 15/26 Seminar „Aspektorientierte Programmierung“ Methodenaufrufe einschließlich Parameter protokollieren (2) // formatiere die Ausgabe der Parameter createParameterMessage private String createParameterMessage(JoinPoint joinPoint) { StringBuffer paramBuffer = new StringBuffer( "\n\t[This: " ); paramBuffer.append( joinPoint.getThis() ); Object[] arguments = joinPoint.getArgs(); paramBuffer.append( "]\n\t[Args: (" ); for (int i = 0; i < arguments.length; i++) { paramBuffer.append( arguments[i] ); if (i != arguments.length-1) paramBuffer.append(","); } paramBuffer.append( ")]" ); return paramBuffer.toString(); }

16 Andre Kaplick - 07. Juni ‚06 16/26 Seminar „Aspektorientierte Programmierung“ Die Ausgabe Entering [Test.main] [This: null] [Args: ([Ljava.lang.String;@1eed786)] Entering [Inventory. ] [This: Inventory@e48e1b] [Args: ()] Entering [Item. ] [This: Item: null] [Args: (1,30.0)] Entering [Item. ] [This: Item: null] [Args: (2,31.0)] Entering [Item. ] [This: Item: null] [Args: (3,32.0)] Entering [Inventory.addItem] [This: Inventory@e48e1b] [Args: (Item: 1)]...

17 Andre Kaplick - 07. Juni ‚06 17/26 Seminar „Aspektorientierte Programmierung“ Methodenaufrufe protokollieren, mit Einrücken (1) package logging; abstract public abstract aspect IndentedLogging { protected int indentationLevel = 0; abstract protected abstract pointcut loggedOperations(); before() : loggedOperations() { indentationLevel++; } after() : loggedOperations() { indentationLevel--; } before() : call(* java.io.PrintStream.println(..)) && within(IndentedLogging+) { for (int i = 0; i < indentationLevel; i++) System.out.print( ". " ); } TraceStack - Tiefe speichern Für Ausgaben in abgeleiteten Aspekten

18 Andre Kaplick - 07. Juni ‚06 18/26 Seminar „Aspektorientierte Programmierung“ Methodenaufrufe protokollieren, mit Einrücken (2) import org.aspectj.lang.*; import logging.*; extends IndentedLogging public aspect TraceAspect extends IndentedLogging { loggedOperations() protected pointcut loggedOperations() : ( execution(* *.*(..)) || execution(*.new(..)) ) && !within(IndentedLogging+); before() : loggedOperations() { Signature sig = thisJoinPointStaticPart.getSignature(); System.out.println( "Entering [" + sig.getDeclaringType().getName() + "." + sig.getName() + "]" ); }

19 Andre Kaplick - 07. Juni ‚06 19/26 Seminar „Aspektorientierte Programmierung“ Die Ausgabe Entering [Test.main]. Entering [Inventory. ]. Entering [Item. ]. Entering [Inventory.addItem]. Entering [ShoppingCart. ]. Entering [ShoppingCartOperator.addShoppingCartItem].. Entering [Inventory.removeItem].. Entering [ShoppingCart.addItem]. Entering [ShoppingCartOperator.addShoppingCartItem].. Entering [Inventory.removeItem].. Entering [ShoppingCart.addItem] Erster Aufruf ist nicht eingerückt !!!

20 Andre Kaplick - 07. Juni ‚06 20/26 Seminar „Aspektorientierte Programmierung“ Ausnahmen protokollieren import org.aspectj.lang.*; public aspect ExceptionAspect { pointcut exceptionMethods() : call(* *.*(..)) && !within(ExceptionAspect); after() throwing(Throwable ex) : exceptionMethods() { Signature sig = thisJoinPointStaticPart.getSignature(); System.err.println( "Exception logger aspect [" + sig.getDeclaringType().getName() + "." + sig.getName() + "]" ); ex.printStackTrace( System.err ); } alle Methodenaufrufe ohne die des Aspekts

21 Andre Kaplick - 07. Juni ‚06 21/26 Seminar „Aspektorientierte Programmierung“ Das Szenario public class TestException { public static void main(String[] args) { perform(); } public static void perform() { Object nullObj = null; nullObj.toString(); } löst eine NullPointerException aus

22 Andre Kaplick - 07. Juni ‚06 22/26 Seminar „Aspektorientierte Programmierung“ Die Ausgabe Aspektausgabe Systemausgabe Exception logger aspect [java.lang.Object.toString] java.lang.NullPointerException at TestException.perform(TestException.java:8) at TestException.main(TestException.java:3) Exception logger aspect [TestException.perform] java.lang.NullPointerException at TestException.perform(TestException.java:8) at TestException.main(TestException.java:3) Exception in thread "main" java.lang.NullPointerException at TestException.perform(TestException.java:8) at TestException.main(TestException.java:3)

23 Andre Kaplick - 07. Juni ‚06 23/26 Seminar „Aspektorientierte Programmierung“ Vorteile des Aspekts Aspekt ist detaillierter Ausgabe ist individuell und leicht veränderbar Aspekt liefert Ausgaben, auch wenn Ausnahme behandelt wird

24 Weitere Einsatzgebiete von Protokollierungs-Aspekten Wozu kann man Protokolle noch benutzen?

25 Andre Kaplick - 07. Juni ‚06 25/26 Seminar „Aspektorientierte Programmierung“ Auflistung der Anwendungsgebiete Testen Fehler finden & debuggen Profiling Überwachen von Methodenzugriffen Datenwiederherstellung Benutzeraktionen überwachen

26 Andre Kaplick - 07. Juni ‚06 26/26 Seminar „Aspektorientierte Programmierung“ Quellenangabe "AspectJ in Action – practical aspect- oriented programming" by Ramnivas Laddad


Herunterladen ppt "Protokollieren, überwachen und verfolgen Vortrag zum Seminar „Aspektorientierte Programmierung“ von Andre Kaplick - 6. Juni 2016."

Ähnliche Präsentationen


Google-Anzeigen