Identificare una copia di classe con un ID custom in stackTrace

di il
9 risposte

Identificare una copia di classe con un ID custom in stackTrace

Buongiorno, per fare logging di una mia applicazione avrei bisogno di 'associare' una determinata copia di una classe (che avvio in più istanze) all'interno dei metodi dello stackTrace.
Ho letto dei CustomAttribute ma giuro che, pur avendoci provato, non sono riuscito a capire come fare.
Di base vorrei questo:
Istanzio n volte la classe clsSomething.
Poi all'interno di uno StackTracer vorrei che quando la copia ennesima è la protagonista, essa 'esponga' un ID da me creato all'avvio di quella copia della classe che mi consenta di 'marcare' l'evento tracciato con il suo ID.
Non so se riesco a spiegarmi...
Lo stackTrace lo uso tipo così:
Dim stackTrace As New Diagnostics.StackFrame(1)
_caller = (stackTrace.GetMethod.DeclaringType.Name + suffix + "." + stackTrace.GetMethod.Name + " [" + myid + "]").PadRight(56, CChar("."))
Vorrei che _caller contenesse anche l'ID della copia della classe insomma.
Grazie.

9 Risposte

  • Re: Identificare una copia di classe con un ID custom in stackTrace

    calatubo ha scritto:


    vorrei che quando la copia ennesima è la protagonista, essa 'esponga' un ID da me creato all'avvio di quella copia della classe che mi consenta di 'marcare' l'evento tracciato con il suo ID.
    Una domanda: questo ID deve essere "parlante", ovvero il suo valore deve contenere dati significativi dell'oggetto di cui si parla, oppure si potrebbe trattare semplicemente di un identificativo pseudo-casuale generato solo per "etichettare" univocamente quell'oggetto?

    In entrambi i casi, crea una proprietà o un metodo che restituisca ciò che vuoi leggere, da inserire poi nello stack trace.

    A livello di implementazione, decidi se produrre un identificativo casuale univoco (es. usando System.GUID) oppure un identificativo "parlante" (es. concatenando valori che diano le informazioni che vuoi acquisire, magari usando uno StringBuilder).

    Se nessuna delle soluzioni è applicabile, definisci meglio i dettagli del tuo problema, perché non è chiarissimo.

    Ciao!
  • Re: Identificare una copia di classe con un ID custom in stackTrace

    Grazie per la risposta, dunque l'ID è proprio un numero casuale che identifica 'quella' copia della classe.
    Forse non sono stato chiaro, e forse il mio è un problema stupido. Provo a chiarire.
    Nella classe che fa logging, nel metodo che 'scrive' su file io ho la seguente sezione:

    Dim stackTrace As New Diagnostics.StackFrame(1)
    _caller = (stackTrace.GetMethod.DeclaringType.Name + suffix + "." + stackTrace.GetMethod.Name + " [" + myid + "]").PadRight(56, CChar("."))

    Dove:

    stackTrace.GetMethod.DeclaringType.Name è valorizzato come il nome della classe che ha invocato la scrittura di log
    stackTrace.GetMethod.Name è valorizzato come il nome del metodo di quella classe che ha invocato la scrittura di log

    Io vorrei:

    stackTrace.????? che venga valorizzato come l'ID casuale che la classe chiamante ha avuto come identificativo di 'quella' copia della classe, in modo che la classe chiamante si capisca che è la copia il cui ID è 123456 e non 123457

    Scusate per l'imbroglio linguistico...
  • Re: Identificare una copia di classe con un ID custom in stackTrace

    calatubo ha scritto:


    Grazie per la risposta, dunque l'ID è proprio un numero casuale che identifica 'quella' copia della classe. [...]
    Genera un ID usando e memorizzalo nell'oggetto per utilizzarlo poi nel trace.
  • Re: Identificare una copia di classe con un ID custom in stackTrace

    Perdono un ultima volta... ma come fare per memorizzare questo ID e come recuperarlo nello stackTrace?
    Lo salvo in una proprietà della classe? Ma poi come lo recupero nello stackTrace?
    Mi spiace ma non ho mai usato lo stackTrace prima d'ora e sono assai ignorante in merito...
  • Re: Identificare una copia di classe con un ID custom in stackTrace

    Ciao,
    non credo che dallo stackTrace si possa risalire all'istanza di classe
    ( che , tra parentesi, potrebbe anche essere anonima o statica);
    quindi , come ti diceva Alka se ho ben interpretato, valorizzi l'id nel costruttore della tua classe
    e lo passi al metodo che scrive il log

    HTH
  • Re: Identificare una copia di classe con un ID custom in stackTrace

    Ok si, questo è chiarissimo, il fatto è che pensavo di ricavare questo ID nello stackTrace agendo in qualche modo sull'istanza della classe. Passarlo a chi scrive il log mi costringe a rivedere tutte le chiamate aggiungendo l'id come parametro.

    Quindi, semplicemente, non si può fare quello che chiedevo.
  • Re: Identificare una copia di classe con un ID custom in stackTrace

    calatubo ha scritto:


    ...
    Quindi, semplicemente, non si può fare quello che chiedevo.
    a me non viene in mente nessun modo;
    non so se qualcun altro riesce a tirare fuori l coniglio dal cilindro.

    Forse , e dico foooorse, si potrebbe semplificare qualcosa
    inserendo l'id in un TrhreadLocal quando lo crei e che rileggi nel metodo del log
    ... ma non ci metto al mano sul fuoco che vada tutto liscio

    HTH
  • Re: Identificare una copia di classe con un ID custom in stackTrace

    calatubo ha scritto:


    Ok si, questo è chiarissimo, il fatto è che pensavo di ricavare questo ID nello stackTrace agendo in qualche modo sull'istanza della classe. Passarlo a chi scrive il log mi costringe a rivedere tutte le chiamate aggiungendo l'id come parametro.
    Continua a non essermi chiaro che utilità avrebbe questo dato, visto che al massimo potrebbe dirti semplicemente che uno stack trace si riferisce a un oggetto differente da un altro, ma non indicherebbe in alcun modo i riferimenti di un oggetto preciso.

    In pratica, sarebbe come avere una lista di oggetti "Prodotto" dei quali uno genera un errore, e nello stack farsi restituire il puntatore dell'oggetto: a che prodotto farebbe riferimento? e cosa avrebbe di diverso dagli altri? è totalmente inutile.

    Se non vuoi modificare la classe o le chiamate al log, potresti ottenere dall'oggetto (qualsiasi oggetto) il suo hash tramite il metodo .

    Se questo non va bene, devi dettagliare meglio lo scenario, ossia il motivo per cui estrai quelle informazioni del trace, in poche parole tutte le motivazioni per cui hai necessità di recuperare dati e informazioni che, apparentemente, ad altri sviluppatori non servono o utilizzano strumenti appropriati per risolvere un problema che ancora non si riesce a capire.

    Ciao!
  • Re: Identificare una copia di classe con un ID custom in stackTrace

    Il fatto è, nel concreto, che le 'copie' della stessa classe che vorrei identificare nel log, si connettono in vari modi a device in rete che sono 'controllati' dalla classe stessa in un contesto di test automation. Quindi a me interessa sapere che ho avuto un certo evento da 'quella' classe perchè questo mi consente di capire che l'evento è accaduto da chi 'controllava' un particolare oggetto in rete e non un altro. Gli oggetti in rete sono dello stesso tipo ma interagiscono col 'sistema' in autonomia. Quindi la copia di classe x che controlla l'oggetto di rete y mi 'logga' gli eventi relativi a quell'oggetto.
    Capisco sia un po' complicato e non so se ho reso l'idea. E' vero che le classi sono 'generiche' ma io so che ciascuna di esse 'controlla' un oggetto e solo quello. Per cui, scrivere nel log l'ID dell'istanza equivale a sapere quale 'oggetto' ha causato l'evento loggato.
Devi accedere o registrarti per scrivere nel forum
9 risposte