[Flex/ActionScript] Logging vanuit component

Pagina: 1
Acties:

  • dawuss
  • Registratie: Maart 2001
  • Laatst online: 21-01 13:54

dawuss

gadgeteer

Topicstarter
Ik ben redelijk nieuw met Flex en ActionScript en meteen lig ik al overhoop met het logsysteem. Ik ben namelijk bezig met het maken van een component, dat ik vervolgens mbv MXML toevoeg aan een applicatie. Het compoment zelf schrijf ik in ActionScript en vanaf daar wil ik kunnen loggen zodat het elders in de applicatie kan worden afgehandeld. Mijn probleem is echter dat deze log events niet aan lijken te komen bij het LogTarget.

Dit is het beste te illustreren met een voorbeeld. Op http://micheljansen.org/workspace/LogTest/src.zip is een heel simpel project te downloaden
• een MXML application met twee componenten: een logpanel en een loggende button
• een custom DebugTarget die naar het logpanel schrijft
• een DebugButton die logt als hij wordt gemaakt en als er op wordt geklikt

DebugButton:
Flash ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package org.micheljansen.util {
    
    import mx.logging.*;
    import mx.core.*;
    import mx.controls.*;

    public class DebugButton extends Button {

        public function DebugButton() {
            super();
            Log.getLogger("debug").debug("DebugButton constructed");
        }
        
        override public function initialize():void {
            super.initialize();
            this.label="DebugButton";
            Log.getLogger("debug").debug("DebugButton initialized");
        }
    }
}


XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<mx:Application 
    xmlns:mx="http://www.adobe.com/2006/mxml" 
    xmlns:util="org.micheljansen.util.*"
    backgroundColor="#FFFFFF"
    backgroundImage="null"
    paddingBottom="10"
    paddingLeft="10"
    paddingRight="10"
    paddingTop="10"
    creationComplete="initLogging();">
    
    <mx:Script>
    <![CDATA[
        import mx.logging.targets.*;
        import mx.logging.*;
        import org.micheljansen.util.*;
        import mx.controls.Alert;
        
        private function initLogging():void {
            var logTarget:TraceTarget = new TraceTarget();
            logTarget.level = LogEventLevel.ALL;
            Log.addTarget(logTarget);
            
            var debugTarget:DebugTarget = new DebugTarget(logPanel);
            Log.addTarget(debugTarget);
            
            Log.getLogger("debug").debug("logging initialised");
            
            //new DebugButton();
        } 
    ]]>
    </mx:Script>

    <util:DebugButton click="Log.getLogger('debug').debug('clickety');"/>
    
    <mx:Panel id="logPanel" title="Log" />
</mx:Application>



Zie het resultaat hier: http://micheljansen.org/w...st/LogTestApplication.swf

Het vreemde is nu dus, dat de logevents die worden gegenereerd in het <mx:script> block en in het click attribuut van de DebugButton wel werken, maar die binnen de DebugTarget class niet.

Wat doe ik verkeerd :?

micheljansen.org
Fulltime Verslaafde Commandline Fetisjist ©


  • BernardV
  • Registratie: December 2003
  • Laatst online: 03:02
Je <mx:script wordt uitgevoerd op creationComplete, dan is de button ook al aangemaakt.
De logger heeft bij het aanmaken van de button nog geen target, dus kan niet loggen.
Init je logger op init ipv creationComplete, dan moet het wel werken.

  • dawuss
  • Registratie: Maart 2001
  • Laatst online: 21-01 13:54

dawuss

gadgeteer

Topicstarter
<mx:Application lijkt geen init property te hebben:
ERROR] /Users/dawuss/Projects/Bachelorreferaat/LogTest/project/src/LogTest.mxml(10): Error: Cannot resolve attribute 'init' for component type mx.core.Application.

init="initLogging();">
Edit: ondertussen uitgevonden dat het initialize moest zijn.

de documentatie van mx:Application is ook wel erg onduidelijk wat betreft event properties. Zowel creationComplete als initialize staan er niet bij :?

Helaas werkt het ook dan niet :(

Je omschrijving van het probleem lijkt trouwens wel te kloppen: als ik de DebugButton laat loggen op Event.ADDED_TO_STAGE, dan komt dat wel netjes in het component terecht. Helaas kan ik daarmee niet loggen wat er in de constructor etc. gebeurt.

[ Voor 69% gewijzigd door dawuss op 01-12-2007 13:55 ]

micheljansen.org
Fulltime Verslaafde Commandline Fetisjist ©