T'es-tu déjà demandé quelles informations tu peux trouver dans une log (en dehors de System.debug). Quelles sont les limites des logs en termes d'informations qu'elles peuvent dévoiler.
Comment on peut améliorer l'expérience à travers des outils gratuits (ou voir comment développer le sien si besoin)
La session est admin friendly. Avoir un peu d'expérience avec les log est préférable
3. Déclarations Conditionnelles
Déclaration conforme à la directive « Safe Harbor » contenue dans la loi américaine intitulée « Private Securities Litigation Reform Act » de 1995 :
Cette présentation est susceptible de comporter des déclarations conditionnelles, qui impliquent nécessairement une certaine prise de risque, des incertitudes et des
hypothèses. Si l'une de ces incertitudes se concrétise ou si certaines hypothèses se révèlent incorrectes, les résultats de Salesforce, Inc. pourraient être sensiblement
différents de ceux explicitement ou implicitement avancés par nos déclarations conditionnelles. Toutes les déclarations ne portant pas sur des faits historiques peuvent
être considérées comme conditionnelles, y compris les projections de disponibilité des produits ou des services, d'augmentation du nombre d'abonnés, de bénéfices, de
chiffre d'affaires ou autre valeur financière, toute déclaration concernant les stratégies ou les plans de gestion des opérations à venir, toute opinion personnelle, toute
déclaration concernant les services ou les développements technologiques nouveaux, planifiés ou mis à niveau, ainsi que les contrats clients et l'utilisation de nos
services.
Les incertitudes et les risques susmentionnés concernent, sans s'y limiter, les risques associés au développement et à la fourniture de nouvelles fonctionnalités pour
notre service, aux nouveaux produits et services, à notre nouveau modèle commercial, nos pertes d'exploitation antérieures, les éventuelles fluctuations de nos résultats
d'exploitation et de notre taux de croissance, les interruptions ou les retards de notre système d'hébergement, les failles des mesures de sécurité, l'issue des litiges, les
risques associés aux fusions et acquisitions réelles et éventuelles, la jeunesse du marché dans lequel nous évoluons, notre historique relativement limité, notre capacité
à développer, fidéliser et motiver notre personnel et à gérer notre croissance, les nouvelles éditions de notre service, ainsi que le déploiement réussi chez les clients,
notre expérience limitée en matière de revente de produits tiers, et l'utilisation et les ventes à de grands comptes. Vous trouverez plus d'informations sur les facteurs
pouvant influencer les résultats financiers de Salesforce, Inc. dans notre rapport annuel (formulaire 10-K) pour l'exercice fiscal le plus récent et dans notre rapport
trimestriel (formulaire 10-Q) pour le trimestre fiscal le plus récent. Ce rapport et d'autres documents contenant d'importantes informations sont accessibles sur notre site
web dans la partie Informations Investisseurs, section Documents pour la Commission des opérations de bourse (SEC).
Certains services ou fonctions qui ne sont pas encore commercialisés et sont mentionnés ici ou dans d'autres présentations, communiqués de presse ou déclarations
publiques, ne sont pas encore disponibles et ne seront peut-être pas livrés à temps, voire pas livrés du tout. Les clients qui achètent nos services doivent prendre leur
décision sur la base des fonctions actuellement disponibles. Salesforce, Inc. n'est pas tenu et n'a pas l'intention de mettre à jour ces déclarations conditionnelles.
4. Sommaire
Hmmm, j’ai choisi un beau sujet mais que vais-je pouvoir dire …
Ahh mais je sais, si je demandais à mon amis Chatgpt ce qu’il sait là-dessus.
Tadaa …
Réponse de chatGpt : quand qq aura traité le sujet, je pourrais te répéter ce
qu’il a dit ….
6. Question 1/2
Si je mets ERROR pour la category Apex Code , quelles informations sont
visibles ?
Un requestId est il unique dans un apexLog ? Citez un use case ?
Quelle est la taille limite que Salesforce peut stocker pour les logs
avant d'arrêter de logger?
Quelle différence y’a t-il entre FINE et FINEST pour la category Apex Code ?
7. Question 2/2
A quoi sert Debug dans la category System ?
La doc Salesforce dit : Système (Comprend des informations relatives aux appels à toutes les méthodes du
système, telles que la méthode System.debug)
56.0 SYSTEM,FINE;
Execute Anonymous: System.debug('test');
12:29:53.13|EXECUTION_STARTED
12:29:53.13|CODE_UNIT_STARTED|execute_anonymous_apex
12:29:53.13|CODE_UNIT_FINISHED|execute_anonymous_apex
12:29:53.13|EXECUTION_FINISHED
56.0 APEX_CODE,FINE;
Execute Anonymous: System.debug('test');
12:34:13.17|EXECUTION_STARTED
12:34:13.17|CODE_UNIT_STARTED||execute_anonymous_apex
12:34:13.17|USER_DEBUG|[1]|DEBUG|test
12:34:13.17|CODE_UNIT_FINISHED|execute_anonymous_apex
12:34:13.17|EXECUTION_FINISHED
9. Les trace flag (journaux de débogage)
● Trier par défaut sur le nom !!!
● Peut-être “recréer” si l’utilisateur n’est pas actuellement tracé
● Unique pour un “Nom” donné (sauf pour la dev console)
● Ils peuvent être créés via la Tooling Api
● Si la dev console est ouverte, elle surcharge le niveau
de log (soyez vigilant)
Accessible via : Menu > Debug logs
10. Anatomie d’un Trace flag
Qui : Traced Entity Type + Traced Entity Name
Combien de temps :Start Date +Expiration Date
Quoi : Debug Level
11. Les Traced Entity type ( ce qui peut-etre audité)
User ( presque tous les utilisateurs de l’org)
Platform Integration
Automated Process (PlatformEvent , update Automatique ,etc …)
Apex Class (Ne crée pas de log. Modifie le log level pour la classe indiquée )
Apex Trigger (Ne crée pas de log. Modifie le log level pour le trigger indiquée )
Attention : le champs Traced Entity Name depends
dépend de l’entité sélectionnée
12. Les Debug Levels
Database :
Information relative à la base de donnée (DML, SOQL,SOSL)
Workflow :
Informations relatives aux Process Builder et au Flow ( Nom, règles ou actions exécutées)
Validation :
Information sur les validation rules
Apex Code :
Les operations apex donc les requetes SOQL executées et les systemes debug
Apex Profiling
Informations structurées sur les limites y compris le nb de mail envoyés
Visualforce
Informations sur les visualforce page
System
Comprend des informations relatives aux appels à toutes les méthodes du système, telles que la méthode System.debug ???
14. Les évenements auditable 1/2
Apex :
Error : Execution/Code Unit + Fatal Error
Warn : USER_DEBUG_WARN ????
Info : Toutes les Exception vu par le code apex (y compris celle intercepté proprement)
Debug : USER_DEBUG
Fine : Method/Constructor
Finer : Heap Allocation
Finest : Variable scoping
Workflow :
Error : All element Error + Code Unit (pas dans la doc !!!!)
Warning : All Element Fault
Info : Flow name
Fine : Flow Trigger reason (decision, assignment etc …)
Finer : Flow Element detail (gestion des variables entre autres)
15. Les évenements auditable 2/2
Database : (
Info: Presque tout ( SOQL/SOSL/DML) + Code Unit (pas dans la doc !!!!)
Fine: Indique si vous utilisez le mode permission set
Fine : Exécute un query plan analysis pour chaque requête
Apex Profiling :
Info : cumul des limites + Code Unit (pas dans la doc !!!!)
Fine : Cumul profiling (aggregation des requetes / methodes apex)
Finest : Namespace limites
System : (utile selon la doc pour les batch et les schedule class)
info : SYSTEM_MODE_ENTER/SYSTEM_MODE_EXIT
Fine : trace les méthodes systèmes et
la spécialisation des logs Apex/Trigger si activés
18. Les logs ont-elles des limites !!!
- Une log ne peut contenir que 20MB de données. Au dela, Salesforce va automatiquement
tronquer la log et commencer par enlever les USER_DEBUG !!!!!
- Les logs sont conservés 7 jours dans l’org. Les logs générés par la developer console ne sont
conservées que 24h
- Au dela de 1G de log , il n’est plus possible de créer/modifier de nouveaux traceFlag
- Si un traceFlag génère plus que 1G de log en moins de 15 mn, il est automatiquement désactivé
20. L’impact des log levels sur la taille des logs 2/2
Level Size lignes
best max best max diff best max diff
Database INFO FINE 2k 2k 0 29 30 1
Workflow INFO FINER 3k 24k 21k 39 149 110
Apex FINE FINEST 12k 24k 12k 159 268 109
Apex
Profiling
FINE FINEST 4k 10k 6k 97 260 163
System NONE FINE 0 2k 2k 0 30 30
Total 25k 56k 31k 304 624 320
22. Les infos génériques
Ligne 1
59.0
APEX_CODE,FINEST;APEX_PROFILING,FINEST;CALLOUT,INFO;DB,FINEST;NBA,NONE;SYS
TEM,DEBUG;VALIDATION,INFO;VISUALFORCE,FINER;WAVE,NONE;WORKFLOW,FINER
ligne 2 ou 3
09:46:16.1
(1391284)|USER_INFO|[EXTERNAL]|0050800000GYRKz|fabrice@littlechaman.com.demo|(GMT+
01:00) Central European Standard Time (Europe/Paris)|GMT+01:00
23. Anatomie d’une log ( point de vue Apex)
|CODE_UNIT_STARTED|[EXTERNAL]|execute_anonymous_apex
|CODE_UNIT_STARTED|[EXTERNAL]|01q09000000ZbhH|ApexLog2Trigger on ApexLog2 trigger event
BeforeInsert|__sfdc_trigger/ApexLog2Trigger
|METHOD_ENTRY|[1]|01p0900000TMsiv|ApexLog2Handler.ApexLog2Handler()
|METHOD_EXIT|[1]|ApexLog2Handler
|METHOD_ENTRY|[4]|01p0900000TMsiv|ApexLog2Handler.insertApexLog3()
|USER_DEBUG|[4]|DEBUG|a020900000kIlNSAA0
|METHOD_ENTRY|[12]|01p0900000TMsiv|ApexLog2Handler.jenefaisrien()
|USER_DEBUG|[21]|DEBUG|Coucou, je suis passé par la ligne 19 , tout va bien
|METHOD_EXIT|[12]|01p0900000TMsiv|ApexLog2Handler.jenefaisrien()
|METHOD_EXIT|[4]|01p0900000TMsiv|ApexLog2Handler.insertApexLog3()
|CODE_UNIT_FINISHED|ApexLog2Trigger on ApexLog2 trigger event BeforeInsert|__sfdc_trigger/ApexLog2Trigger
24. Anatomie d’une log (flow )
60.0 WORKFLOW,INFO
FLOW_CREATE_INTERVIEW_BEGIN|00DG50000013N7Z||301G500000I9kqs
FLOW_CREATE_INTERVIEW_END|651459a69f58b32a5b6f1e3bc9a418dbbac42df-7918|New Account Creation
EXECUTION_STARTED
CODE_UNIT_STARTED|[EXTERNAL]|Flow: New Account Creation
CODE_UNIT_FINISHED|Flow: New Account Creation
EXECUTION_FINISHED
FLOW_ELEMENT_BEGIN|651459a69f58b32a5b6f1e3bc9a418dbbac42df-7918|FlowAssignment|doSomething1
FLOW_ELEMENT_END|651459a69f58b32a5b6f1e3bc9a418dbbac42df-7918|FlowAssignment|doSomething1
FLOW_ELEMENT_BEGIN|651459a69f58b32a5b6f1e3bc9a418dbbac42df-7918|FlowRecordCreate|doSomething2
FLOW_ELEMENT_END|651459a69f58b32a5b6f1e3bc9a418dbbac42df-7918|FlowRecordCreate|doSomething2
CODE_UNIT_STARTED|[EXTERNAL]|01q09000000ZbhH|ApexLog2Trigger on ApexLog2 trigger event BeforeInsert|__sfdc_trigger/ApexLog2Trigger
CODE_UNIT_FINISHED|ApexLog2Trigger on ApexLog2 trigger event BeforeInsert|__sfdc_trigger/ApexLog2Trigger
FLOW_ELEMENT_BEGIN|651459a69f58b32a5b6f1e3bc9a418dbbac42df-7918|FlowSubflow|Subflow1 (Conserve l’id du flow parent)
FLOW_ELEMENT_END|651459a69f58b32a5b6f1e3bc9a418dbbac42df-7918|FlowSubflow|Subflow1
FLOW_ELEMENT_BEGIN|651459a69f58b32a5b6f1e3bc9a418dbbac42df-7918|FlowDecision|doSomethingInsubFlow1
FLOW_ELEMENT_END|651459a69f58b32a5b6f1e3bc9a418dbbac42df-7918|FlowDecision|doSomethingInsubFlow1
FLOW_ELEMENT_BEGIN|651459a69f58b32a5b6f1e3bc9a418dbbac42df-7918|FlowDecision|doSomething3
FLOW_ELEMENT_END|651459a69f58b32a5b6f1e3bc9a418dbbac42df-7918|FlowDecision|doSomething3
25. Anatomie d’une log (screen flow part 2)
60.0 WORKFLOW,INFO
FLOW_VALUE_ASSIGNMENT|1687e2674bd1913bfd651fc81a7d18dbb7a1e61-7530|assigneMe ....
FLOW_VALUE_ASSIGNMENT|1687e2674bd1913bfd651fc81a7d18dbb7a1e61-7530|assigneMe|true
FLOW_ELEMENT_BEGIN|1687e2674bd1913bfd651fc81a7d18dbb7a1e61-7530|FlowAssignment|doSomething1
FLOW_ELEMENT_END|1687e2674bd1913bfd651fc81a7d18dbb7a1e61-7530|FlowAssignment|doSomething1
FLOW_ELEMENT_BEGIN|1687e2674bd1913bfd651fc81a7d18dbb7a1e61-7530|FlowDecision|doSomething2
FLOW_ELEMENT_END|1687e2674bd1913bfd651fc81a7d18dbb7a1e61-7530|FlowDecision|doSomething2
FLOW_ELEMENT_BEGIN|1687e2674bd1913bfd651fc81a7d18dbb7a1e61-7530|FlowSubflow|Subflow1
FLOW_ELEMENT_END|1687e2674bd1913bfd651fc81a7d18dbb7a1e61-7530|FlowSubflow|Subflow2
FLOW_ELEMENT_BEGIN|1687e2674bd1913bfd651fc81a7d18dbb7a1e61-7530|FlowDecision|doSomething3
FLOW_ELEMENT_END|1687e2674bd1913bfd651fc81a7d18dbb7a1e61-7530|FlowDecision|doSomething3
La log commence là !!!!
Comment trouver le nom flow en question ??
SELECT FlowLabel ,FlowDeveloperName FROM FlowInterviewLog
WHERE FlowInterviewGuid =’1687e2674bd1913bfd651fc81a7d18dbb7a1e61-7530’
27. Que peut-on analyser dans une log ?
● Analyser le comportement et fixer des erreurs dans le code ou un flow
etc …
● Analyser pourquoi on atteint les governor limit ou vérifier si on en est
proche
● Monitorer et optimiser les performances
● Auditer et monitorer l’activité et les interactions des utilisateurs
29. System.debug (en prod oui ou non ??)
1 : No debug
2 : system.debug(‘message’);
3 : system.debug(‘message long’);
4 : system.debug(aContactObjet);
5 : afficher x system.debug
6 : loop system.debug([select … from Contact)
Execution du code 5000 fois
scenario 1 : traceFlag activé
scenario 2 : Pas de traceFlag
Conclusion :
on évitera surtout les system.debug sur les objets / tableau en PROD
https://bobbuzzard.blogspot.com/2021/05/the-impact-of-systemdebug.html
30. Comment afficher plus d’info via un system.debug
System.debug([SELECT FIELDS(STANDARD) FROM Account limit 200 ]);
|USER_DEBUG|[1]|DEBUG|(Account:{AccountSource=Platform isPortfolio__c=false}, ...)
Mais que faire si on souhaite afficher toutes les lignes ou un objet contenant trop
d’information ?
System.debug(JSON.serializePretty([SELECT FIELDS(STANDARD) FROM Account limit 200]));
Warning : Le résultat sera affiché sur plusieurs lignes
31. Comment filtrer les system.debug à afficher
1 :system.debug(logginglevel.ERROR,'test ERROR');
2 : system.debug('test Normal');
Les system.debug ne s’affichent dès que le Level est atteint dans le traceflag.
Le message 1 s'affiche si le level est sur “Error” alors que le le message 2 ne
sera pas affiché.
33. Step 1 : auditer tous les utilisateurs cibles
● Créer un DebugLevel au niveau avec Apex ou Workflow au niveau
ERROR
On cherche à limiter la tailles des logs générés pour rester sous les limites
● Créer un TraceFlag pour tous les utilisateurs ciblés avec ce debugLevel
On essaiera de faire cela via un script utilisant la tooling api
● Attendre que les utilisateurs utilisent Salesforce durant qq heures
On peut arrêter dès qu’on commence à repérer des traitement trop longs
34. Step 2 : chercher les temps de traitement longs
SELECT Id,Operation ,DurationMilliseconds ,StartTime ,LastModifiedDate,LogUser.Name FROM ApexLog order by DurationMilliseconds
12h 2 sec
35. Step 3 : Analyser les problèmes
Chercher les code unit dans les logs pour identifier la source des problèmes
Créer des trace flags avec un niveau de detail plus fin :
Apex : Fine (ou plus)
Workflow : Fine (ou plus)
Database : Fine (ou plus)
Apex Profiling : Finer
Passer en revue les logs avec les outils (vscode / developer console etc …)
37. RequestIdentifier
RequestIdentifier , un champs de l’objet ApexLog
Represente l’Id de la transaction apex
Pas toujours unique(Batch, Async operation)
peut-être obtenu en apex via :
Request.getCurrent().getRequestId();
Cas d’usage :
Framework de log
Audit des appels externes à Salesforce
Retracer plus facilement les problèmes des utilisateurs via les logs
38. Le too Many SOQL 101 (l’erreur préférée des dev)
39. Comment gérer un too many soql 101(les pièges)
Suite à l'exécution d’un code apex : une erreur Too many SOQL queries: 101 apparait
vscode :
dev console :
Vers la fin de la log :
LIMIT_USAGE_FOR_NS|(default)| : Number of SOQL queries: 101 out of 100 ******* CLOSE TO LIMIT
LIMIT_USAGE_FOR_NS|slackv2| Number of SOQL queries: 29 out of 100
LA RAISON :
- Les manage package
- les requetes dans les flow (non visibles dans les logs)
42. Conclusion
config Plutot bon Plutot mauvais
vscode Tout Save order
Performance
HeapSize
SOQL 101
DevConsole Apex Fine/Finer
Profiling : Finest
Save order
Apex
HeapSize
Perf
Grosse log
Excel Workflow :Fine Flow Le reste
Calumet Tout Save order
SOQL 101
Debug
Tout ce qui ne marche
pas !encore dedans !! :)
43. I’ll be back : une nouvelle session arrive
● Marre de toujours nous voir parler
● Envie d’aborder un sujet qui vous tient à coeur
● Envie d'être le speaker d’un soir
N’hésitez pas à en parler à nos dev group leader
sinon y aura une suite (faites par ChatGpt cette fois) !!!!
44. Liens
Doc Salesforce pour les logs :
https://help.salesforce.com/s/articleView?id=sf.code_setting_debug_log_levels.htm&type=5
Apex replay debugger :
https://texei.com/conseils/jour-24-apex-replay-debugger/
Calumet (si vous êtes pas refroidi) :
https://littlechaman.com/