Präsentation herunterladen
Die Präsentation wird geladen. Bitte warten
Veröffentlicht von:Claus Rosenberg Geändert vor über 7 Jahren
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
Ähnliche Präsentationen
© 2024 SlidePlayer.org Inc.
All rights reserved.