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

Slides:



Advertisements
Ähnliche Präsentationen
der Universität Oldenburg
Advertisements

der Universität Oldenburg
Objektorientierte Programmierung
der Universität Oldenburg
der Universität Oldenburg
der Universität Oldenburg
DVG Einfache Klassen Einfache Klassen. DVG Einfache Klassen 2 Strukturen Beispiel: Personendaten bestehen aus –String name –String vorname.
Einführung in die Programmierung Ausführbare Klassen
Einführung in die Programmierung Zusammenfassung
PKJ 2005/1 Stefan Dissmann Vorwoche - Klasse public class Studierende { private String name, vorname, studiengang; private int matNr, semester; private.
der Universität Oldenburg
Abstrakte Klassen HS Merseburg (FH) WS 06/07.
Ausnahmen HS Merseburg (FH) WS 06/07.
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
Indirekte Adressierung
Java: Referenzen und Zeichenketten
Java: Grundlagen der Objektorientierung
FH-Hof Fehlerbehandlung Richard Göbel. FH-Hof Konzept Fehler können mit dem Operator throw einer übergeordneten Funktion signalisiert werden. Parameter.
Ein Beispiel in Java.
Konstruktoren.
Benötigte Applets Startseite: in HTML-Format Applet auf der Startseite Das Applet, das auf der Startseite geladen wird, wird die vier Buttons und die eine.
M a r c – o l i v e r p a h l Die ObjektOrientierte Mühle Das Beispiel soll noch einmal das Konzept der Objektorientiertheit erläutern. Dabei werden außerdem.
Imperative Programmierung Funktionen und Parameter
Programmieren mit JAVA
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
AspectJ – Eine Aspektorientierte Programmiersprache
DVG Klassen und Objekte
DVG Einfache Klassen 1 Einfache Klassen. 2DVG Einfache KlassenStrukturen Beispiel: Personendaten bestehen aus String name String name.
Java in 9 Folien Besser: Online-Buch Go to Java 2.
Bestimmung des ggT zweier Zahlen
Informatikunterricht mit Java
Vererbung Einfache Vererbung – Erben von abstrakten Klassen – Implementieren eines Interfaces.
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
Informatik 1 Übung 8. NACHBESPRECHUNG Übung 8 Rekursion Existiert Weg von A nach B?
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
EPROG Tutorium Einheit 4 Klassen und Objekte. Wiederholung Schleifen do... while while for break/continue Strings String char Methoden für Strings Arrays.
Grundlagen der Programmierung
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Einfach und doppelt verkettete Listen in JAVA by Jens Weibler
EPROG Tutorium #3 Philipp Effenberger
Learning By Doing Ausnahmebehandlung Exceptions (Ausnahmebehandlung) Typische Fehlverhalten zur Laufzeit: s. Buch S. 287ff -Verwendung von null-Objekten.
Programmiervorkurs WS 2014/15 Methoden
Java-Kurs - 8. Übung Besprechung der Hausaufgabe.
Informatik I : Software höhere Programmiersprachen Java Klassen: hat Methoden (Funktionen) und Daten (Variablen) es kann mehrere Klassen geben nur eine.
Alois Schütte Advanced System Programming 2 Interprozeßkommunikation  2.1 JVM Ablaufumgebung  2.2 Java Native Interface (JNI)  Verwendung von.
AOP Lösung für Querschnittsaufgaben. Was ist AOP ? AOP ist kein Ersatz für OOP AOP ergänzt OOP AOP beinhaltet die Behandlung von Querschnittsaufgaben.
Robuste Programme durch Ausnahmebehandlung
Ausnahmen Vorlesung besteht aus zwei Teilen Programmierung (4 SWS)
Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid AOP mit AspectJ.
Abteilung für Telekooperation Softwareentwicklung 2 UE WS 2008/09 SE2UE_ Ausnahmen (Exceptions)
Objektorientierte Programmierung (OOP)
Java Programme nur ein bisschen objektorientiert.
Vortrag Einführung in AspectJ. Gliederung 1 Einleitung 2 Querschnittsfunktionalitäten in AspectJ 2.1 Sprachelemente 3 Beispiel 4 Join Point Modell 5 Weaving.
Objektorientierung in Java Java-Kurs LE 5.
Vererbung in Java. public abstract class Form { protected int breite; protected int hoehe; protected String farbe; /** * Erzeuge eine Form der Breite.
Konstruktoren.
Objektorientierung Gliederung von Daten und Funktionen zu Objekten
Vererbung.
„Was du ererbt von Deinen Vätern hast, erwirb es, um es zu besitzen.“
JAVA lernen: Methoden.
Cäsar-Verschlüsselung
Grundkurs Informatik mit Java
Schleifen mit der Turtle
Cäsar-Verschlüsselung
Polymorphie Überladen
Definition Felder Konstruktor Methoden Beispiel
Implementieren von Klassen
Polymorphie Überschreiben
 Präsentation transkript:

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

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

Warum AspectJ zum protokollieren benutzen? Ein anschauliches Beispiel.

Andre Kaplick 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); }

Andre Kaplick 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; }

Andre Kaplick 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); }

Andre Kaplick 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??

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

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

Andre Kaplick 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

Andre Kaplick 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

Andre Kaplick 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

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

Andre Kaplick 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

Andre Kaplick 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(); }

Andre Kaplick Juni ‚06 16/26 Seminar „Aspektorientierte Programmierung“ Die Ausgabe Entering [Test.main] [This: null] [Args: Entering [Inventory. ] [This: [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: [Args: (Item: 1)]...

Andre Kaplick 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

Andre Kaplick 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() + "]" ); }

Andre Kaplick 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 !!!

Andre Kaplick 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

Andre Kaplick 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

Andre Kaplick 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)

Andre Kaplick 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

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

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

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