When using the Salesforce CLI as the primary way to interact with a scratch org turning on Apex trace debugging can be a tiresome-I-have-to-click-into-the-org situation. Usually you are not able to use force:apex:log:list
and force:apex:log:get
commands to work with Apex logs without first opening the Web Developer in the org or setting up trace logging.
But it turns out there is a better way using a simple script.
The below script does the trick for you can easily be added to your process for creating new scratch orgs. The script sets up some timestamps and then queries for the scratch org user userId. Then we get the Id of the trace log configuration for the user and then updates the record to enable trace logging for 24 hours.
NOW=`date -u +"%Y-%m-%dT%H:%M:%SZ"` EXP=`date -v+24H -u +"%Y-%m-%dT%H:%M:%SZ"` USERID=`sfdx force:data:soql:query -q "select id,name from user where name='User User'" --json | jq ".result.records[0].Id" -r` TRACEID=`sfdx force:data:soql:query --query "SELECT Id, DebugLevel.DeveloperName, ExpirationDate, TracedEntityId FROM Traceflag WHERE TracedEntityId IN (SELECT ID from USER WHERE ID = '${USERID}')" --usetoolingapi --json | jq ".result.records[0].Id" -r` sfdx force:data:record:update --sobjecttype TraceFlag --sobjectid $TRACEID -v "StartDate=$NOW ExpirationDate=$EXP" --usetoolingapi --json --loglevel fatal
The above script uses jq
(https://stedolan.github.io/jq/) for JSON parsing and works on Mac (date
command switches is slightly different on Linux) so YMMV.