JournalReading

Trovare e leggere i Journal di Revit

Dato che l’argomento mi serve per una lezone che terrò a breve a Lecco, e dato che spesso è ammantato di un arcano mistero come se si trattasse di chissà quale arte oscura, vi condivido qualche indicazione su come raggiungere i journal di Revit e qualche applicazione di utilizzo pratico, in attesa di utilizzarli per […]

Dato che l’argomento mi serve per una lezone che terrò a breve a Lecco, e dato che spesso è ammantato di un arcano mistero come se si trattasse di chissà quale arte oscura, vi condivido qualche indicazione su come raggiungere i journal di Revit e qualche applicazione di utilizzo pratico, in attesa di utilizzarli per tentare un po’ di machine learning supervisionato. Non sarà il mio post più brillante, o quello più riccamente illustrato, ma spero che vi sia utile.

1. Journal: cosa sono e dove sono?

I journal sono il diario segreto di Revit: ne crea uno ogni volta che lo aprite e vi appunta tutti i suoi oscuri segreti. Sono spesso utili per tracciare il lavoro, verificare cosa sta succedendo davvero e risalire all’origine di eventuali problemi. Non che i file di Revit abbiano mai problemi, s’intende.

I journal sono il diario non troppo segreto di Revit.
I journal sono il diario non troppo segreto di Revit.

Per trovarli, aprite una finestra di esplora risorse e digitate %LOCALAPPDATA%.
Vi si aprirà una cartella con percorso del tipo C:\\Users\Chiara\AppData\Local\ (sarà un po’ diverso, a meno che non abbiate tutti “Chiara” come nome utente del pc, nel qual caso potrei anche inquietarmi un attimo).
Completatelo aggiungendo \Autodesk\Revit\Autodesk Revit 2019\Journals (o qualunque altra versione di Revit volete usare).
Il percorso completo, per chi di voi non ha ancora preso un caffè questa mattina, dovrebbe essere: C:\\Users\[vostro nome utente]\AppData\Local\Autodesk\Revit\Autodesk Revit [anno di release]\Journals

RevitJournalFolder
Vi si aprirà una cartella che ha più o meno questo aspetto.

All’interno della cartella troverete diverse categorie di file:

  • journal.*.log è il file che state cercando: Revit ne crea uno ogni volta che viene aperto.
  • journal.*.dmp. Sono i cosiddetti file “dump” e vengono creati quando il programma va in crash, quindi è probabile che ne abbiate parecchi. Hanno lo stesso nome del journal file per la sessione corrispondente.
  • Dump*.txt. Sono i file di testo corrispondenti ai file dump di cui parlavo sopra.
  • file che contengono “worker“, sia journal che dump, contengono informazioni che riguardano i processi di Revit che possono essere utilizzati per mandare in multi-thread certe applicazioni come la rigenerazione di viste e la stampa;
  • journal abbreviati: appaiono come journal normali ma vengono creati quando alcune operazioni generano molte entry nel journal, per escludere queste ripetizioni e rendere il file più facile da controllare.

L’articolo ufficiale del Knowledge Network è a questo indirizzo.

KnowledgeNetwork

2. Cosa contengono?

2.1 Journal.*.log

Come sempre, un file .log è tranquillamente apribile da blocco note (anche se vi consiglio di utilizzare un log explorer un po’ più “intelligente”. Se vi sentite audaci, provate ad esempio glogg. Oppure Notepad++, che vi consiglio di utilizzare in combo con il plug-in analyse. Una volta iniziato, difficilmente riuscirete a farne a meno.

Il suo interno può risultare un po’ ostico da leggere, soprattutto a una prima occhiata. Se non avete voglia di leggere me, avete diverse opzioni alternative:

  • la classe Troubleshooting Revit Using Journal Files tenuta da Fernanda Lima Firman all’Autodesk Technical Academy del 2014 (slide qui);
  • i due eccellenti articoli How to read the Revit Journal file – Understanding Journal Files di Nauman Mysorewala (parte 1 e parte 2);
  • la screencast How to read Revit journals di Lance Coffey;
  • la classe Code Blue, Dr. Revit!-How to Resuscitate Corrupt Revit Models tenuta da Matt Wunch e dallo stesso Nauman Mysorewala all’Autodesk University del 2017, per cui è disponibile anche il video (incorporato qui sotto).

..

Se invece siete ancora qui, proviamo a vedere come appare un log (usando Notepad++) e dove sono le informazioni che potrebbero interessarci.

L’inizio del journal è abbastanza ovvio: parla di chi sono io, qual è la mia licenza, com’è fatto il mio computer e quali impostazioni iniziali mi deve caricare. Trovate le informazioni relative cercando, ad esempio:

  • OPERATING SYSTEM INFORMATION;
  • PROCESSOR INFORMATION;
  • VIDEO CONTROLLER INFORMATION.
Queste sono le informazioni del mio processore. Lo so. Devo comprare un pc nuovo.
Queste sono le informazioni del mio processore. Lo so. Devo comprare un pc nuovo.

Già questo sarebbe utile in sé: raccogliere tutti i journal di una struttura complessa è un buon modo di emergenza per analizzare l’infrastruttura dal punto di vista hardware.

Non sempre il dipartimento IT collabora nell'assessment dell'infrastruttura hardware.
Non sempre il dipartimento IT collabora nell’assessment dell’infrastruttura hardware, ma perché chiedere informazioni che abbiamo già?

 

Le informazioni vengono raccolte anche in relazione alle stampanti, sia fisiche che virtuali, e questo è un altro aspetto estremamente interessante, considerato che spesso si creano colli di bottiglia o si ottengono risultati subottimali semplicemente a causa dell’installazione scorretta o della mancata installazione della corretta stampante.

PRINTER INFORMATION

Venendo a una parte più relativa a come Revit viene usato, probabilmente per noi più interessante, proviamo a cercare per esempio la parte in cui carica le mie impostazioni in basso a destra.

Le opzioni di selezione: sono normalmente in basso a destra.
Le opzioni di selezione: sono normalmente in basso a destra.

‘H 05-Dec-2018 15:47:23.455;   0:<
Jrn.Directive “AllowLinkSelection” _
, 1

Ogni volta che troviamo il trattino basso _ si tratta di una command line continuation, ovvero quella che in dos era ^. Niente panico. Revit sta semplicemente cercando di ricordarsi che, nonostante sia andato a capo, sta continuando con il pensiero. Nel mio caso, il gruppo di tre stringhe sta semplicemente cercando di dirmi che in quella data e a quell’ora (la prima riga) quando ho aperto Revit avevo impostato su 1 l’opzione “Allow Link Selection”. 1 ovviamente è un booleano che corrisponde a “vero”. Mi trovavo quindi in questa condizione.

La situazione in figura viene quindi descritta dal journal in questo modo:

‘H 05-Dec-2018 15:47:23.455; 0:<
Jrn.Directive “AllowLinkSelection” _
, 1
‘H 05-Dec-2018 15:47:23.455; 0:<
Jrn.Directive “AllowFaceSelection” _
, 0
‘H 05-Dec-2018 15:47:23.455; 0:<
Jrn.Directive “AllowUnderlaySelection” _
, 0
‘H 05-Dec-2018 15:47:23.455; 0:<
Jrn.Directive “AllowPinnedSelection” _
, 1

Tradotto in termini semplici, significa che:

  • posso selezionare i link;
  • non posso selezionare gli elementi da faccia, ma solo da bordo;
  • non posso selezionare gli elementi in underlay;
  • posso selezionare gli elementi pinnati.

Lo so, è prolisso da morire, ma gli vogliamo bene per questo.

Keep Talking, Revit, and nobody explodes. Maybe.
Keep Talking, Revit, and nobody explodes. Maybe.

Scorrendo il file e superata la parte iniziale, in cui carica i plug-in e cerca di capire cosa è venuto al mondo a fare (tutta quella sequenza in cui compare la stringa API_SUCCESS), ci rendiamo conto che si tratta di una registrazione passo – passo di tutte le operazioni fatte sul modello, compreso l’ID dell’elemento su cui abbiamo agito.

Applicazione 1: tempi di sincronizzazione

Cercate la stringa Operation – BeginWriteData: dovreste trovare, nel pacchetto di riferimento in cui il journal si sta appuntando tutto ciò che fa quando sincronizza un locale con il centrale, e in particolare una serie di stringhe che iniziano con Time. In particolare:

  • Time: 12/5/2018 14:27:05:195 Calling: BeginWriteData. Inizia a provare a scrivere. Ad ogni “Calling” corrisponde un “Returned” in cui si rassicura che effettivamente ha la penna.
  • Time: 12/5/2018 14:27:05:885 Calling: GetWriteDataCredentials. Controlla di avere davvero l’autorizzazione per fare quello che deve fare.
  • Time: 12/5/2018 14:27:06:066 Calling: CheckForPreemptiveCommit. La prima regola del buon blogger: controlla che nessuno abbia già scritto qualcosa a riguardo.
  • Start uploading local file. Sta finalmente iniziando a scrivere.

Nota: questa sequenza di operazioni viene ripetuta per ciascuno dei file .tmp che raccolgono le operazioni svolte.

Sapete che ha finito quando finalmente tira le somme di quello che ha fatto, con una serie di stringhe del tipo:

‘ 0:< CACHES3 >> GetWriteDataTask (new) elapsed = 13398 ticks with 2338346 frequency
‘ 0:< CACHES3 >> Elapsed time to Write All Available Files (new) = 870 milliseconds
‘ 0:< CACHES3 >> Elapsed time to Write All Available Files (new) = 0 milliseconds
‘ 0:< CACHES3 >> Elapsed time to Write All Available Files (new) = 0 milliseconds

Nel mio caso, ha iniziato a scrivere alle 14:27:05:195 e ed è ritornato dal PreemptiveCommit dell’ultimo file alle 14:27:11:751. Nel log sostiene di averci impiegato 0.87 secondi (ovvero 870 millisecondi), perché considera il tempo che ha fisicamente impiegato a scrivere. Noi sappiamo che sono trascorsi circa 6 secondi da quando abbiamo pigiato il pulsante “Sincronizza” a quando la rotella ha smesso di girare. È andata ancora bene.

Raccogliendo correttamente dai journal tutte le informazioni circa le sincronizzazioni, si può agevolmente creare una dashboard che tenga sotto controllo il crearsi di colli di bottiglia e, come sempre, evitare che le giornate trascorrano in contemplazione di ciambelle blu che girano.

Le ciambelle blu piacciono a tutti, ma non su Revit.
Le ciambelle blu piacciono a tutti, ma non su Revit.

Se sono le prestazioni a interessarvi, nella parte finale del journal Revit fa un riassunto delle proprie prodezze. Cercate Log Summary: lo troverete verso la fine, dopo Journal Exit e il timestamp della chiusura. Ora sapete come mai certe volte Revit impiega così tanto tempo persino a chiudersi: deve finire di scrivere sul diario.

Caro Diario, oggi quella famiglia tanto carina mi ha sorriso. Prima di chiudersi.
Caro Diario, oggi quella famiglia tanto carina mi ha sorriso. Prima di chiudersi.

 

2.2 Un’occhiata agli errori

Cercando la stringa errorMsg, troverete tutti i messaggi di errore che sono comparsi all’utente. Particolarmente utile quando dovete fare assistenza a qualcuno che non ricorda il messaggio di errore che ha ricevuto (oppure ha dato una risposta a caso).

‘ 1:< Error dialog data for transaction Finish sketch in Host document
‘ 1:< Error: Lines must be in closed loops. The highlighted lines are open on one end.

Quando trovate la stringa Error posted, fa riferimento a quegli errori gialli per i quali l’utente non deve necessariamente dare un feedback. Quelli piccoli piccoli. Tipo “Can’t make extrusion” (che cancella i pavimenti).

L’errore API_ERROR ha solitamente a che fare con qualche plug-in che non riesce ad avviarsi (vi siete ricordati di pagare la subscription, vero?).

Se volete davvero divertirvi, lanciate la ricerca della stringa BadGeomError. Di solito si tratta di errori relativi alla geometria e sono particolarmente esilaranti quando sono errori non manifesti, ma nascosti all’interno di famiglie che apparentemente funzionano bene. Solitamente il risultato appare in questa forma:

BadGeomError– Improperly generated Geometry in ‘[categoria]: [nome famiglia]: [nome tipo]’ (1402260). There are both active generated and non-generated edges or faces.

Il numero tra parentesi è l’ID dell’elemento: se il cielo ci assiste, l’id è rimasto lo stesso e possiamo usarlo per andare a caccia dell’elemento (ma di solito il cielo non ci assiste: non fate troppo affidamento sugli ID di Revit, perché non sono stabili). Per fortuna un errore di geometria è un errore di tipo, quindi l’ID non ci serve: la soluzione è, ahimé, apri la famiglia e prova ancora.

GameOverTryAgain

 

2.3 Quando Revit diventa colloquiale

C’è un cuore pulsante, dietro a tutti quei messaggi di errore. Cercate semplicemente “sad” per scoprirlo. La stringa che personalmente preferisco è questa:

SoFarSoGood
Well, thank you for letting me know that.

 


 

3. File Dump

Naturalmente è nei file dump che la faccenda si fa particolarmente succosa, perché sono i file che Revit ha creato mentre si stava chiudendo in preda a un errore irreversibile, sono i messaggi in bottiglia che disperatamente lancia, sperando che qualcuno lo legga.

RevitDumpFile

Per aprire un file .log è necessario avere un programma come windbg.exe. Se non l’avete, potete installarlo da questa pagina. Se volete qualcosa di leggero, potete usare anche BlueScreenView. Oppure, se non avete la possibilit’ di installare nulla sul vostro computer, potete ricorrere a tool on-line nati per farvi aprire i dump degli errori di Windows, come questo. Ci metterà qualche minuto a elaborare il tutto.
Se tentate di aprirlo con il blocco note, ottenete questo poco invitante risultato:

DumpText
Ooops…

 

Nel file dump potete trovate alcune spiegazioni circa cosa è andato storto in Revit. Il più classico degli errori è:

The request has exceeded the allowable time limit Tag

…ovvero “Revit ci stava mettendo troppo tempo, quindi mi sono stancata è ho chiuso tutto”. Non so se vi suona familiare.

Questo però esula dal motivo per cui sto scrivendo questo post, l’applicazione primaria dei journal file che scoprirete tra qualche settimana, quindi è una storia che dovrà necessariamente essere raccontata in un altro momento.

8 Comments

  1. Una cosa che ho sempre trovato molto figa e’ che trascinando (drag and drop) il file .txt journal su Revit, il programma automaticamente ri-crea le azioni scritte nel journal.

    L’ho usato varie volte dopo che Revit ha crashato e non ho potuto aver un back up.

    Now sit back and watch Revit re-doing 110ish commands in seconds for you.

    Enrico

  2. Un lato di Revit inesplorato; articolo interessante per iniziare a scoprire nuove pagine da leggere: i journal di Revit. Grazie

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

This site uses Akismet to reduce spam. Learn how your comment data is processed.