在沙盒中开发 Apex 代码,并使用开发人员控制台对其进行调试,然后进行调试 原木。对代码进行单元测试,然后使用包将其分发给客户。
- 调试Apex
Apex 提供调试支持。您可以使用开发人员控制台和调试日志来调试 Apex 代码。 - 测试 Apex Apex
提供了一个测试框架,允许您编写单元测试、运行测试、检查测试结果以及获得代码覆盖率结果。 - 部署 Apex
您无法在 Salesforce 生产组织中开发 Apex。您的开发工作是在沙盒或 Developer Edition 组织中完成的。 - 使用托管软件包
分发 Apex 作为 ISV 或 Salesforce 合作伙伴,您可以使用软件包将 Apex 代码分发给客户组织。在这里,我们将介绍包和包版本控制。
调试Apex
Apex 提供调试支持。您可以使用开发人员调试 Apex 代码 控制台和调试日志。
为了帮助在代码中进行调试,Apex 支持异常语句和自定义异常。 此外,Apex 还会向开发人员发送电子邮件,以解决未处理的异常。
- 调试日志
- Apex 中的异常
调试日志
调试日志可以记录数据库操作、系统进程和以下情况下发生的错误 执行事务或运行单元测试。调试日志可以包含以下信息:
- 数据库更改
- HTTP 标注
- 顶点错误
- Apex 使用的资源
- 自动化工作流程,例如:
- 工作流规则
- 分配规则
- 审批流程
- 验证规则
您可以保留和管理特定用户(包括您自己)和类的调试日志 和触发器。设置类和触发器跟踪标志不会导致生成日志或 保存。类和触发器跟踪标志覆盖其他日志记录级别,包括日志记录级别 由用户跟踪标志设置,但它们不会导致日志记录发生。如果在以下情况下启用日志记录 类或触发器执行,日志在执行时生成。
若要查看调试日志,请从“设置”中输入“快速查找”框,然后选择“调试日志”。然后 单击要检查的调试日志旁边的“查看”。单击“下载”将日志下载为 XML 文件。Debug Logs
- 每个调试日志必须小于或等于 20 MB。减少大于 20 MB 的调试日志 通过删除较旧的日志行(例如早期语句的日志行)来调整大小。日志行可以从任何 位置,而不仅仅是调试日志的开头。System.debug
- 系统调试日志将保留 24 小时。监视调试日志保留 7 个 日。
- 如果在 15 分钟的时段内生成超过 1,000 MB 的调试日志,则跟踪标志为 禁用。我们向上次修改跟踪标志的用户发送一封电子邮件,通知他们 他们可以在 15 分钟内重新启用跟踪标志。警告如果调试日志跟踪 标志在经常访问的 Apex 类上启用,或者为经常执行请求的用户启用, 无论时间窗口和调试大小如何,请求都可能导致失败 原木。
- 当您的组织累积的调试日志超过 1,000 MB 时,我们会阻止组织中的用户 添加或编辑跟踪标志。添加或编辑跟踪标志以便生成更多日志 达到限制后,请删除一些调试日志。
检查调试日志部分
生成调试日志后,列出的信息类型和数量取决于为用户设置的筛选器值。 但是,调试日志的格式始终相同。
注意
会话 ID 在 Apex 调试日志中替换为“SESSION_ID_REMOVED”调试日志包含以下部分。页眉标头包含以下信息。
- 事务期间使用的 API 版本。
- 用于生成 日志。例如:
下面是一个示例 页眉。
59.0 APEX_CODE,DEBUG;APEX_PROFILING,INFO;CALLOUT,INFO;DB,INFO;SYSTEM,DEBUG;VALIDATION,INFO;VISUALFORCE,INFO;
WORKFLOW,INFO
本示例中,API版本为59.0,并设置了以下调试日志类别和级别。
Apex 代码 | 调试 |
Apex 分析 | 信息 |
标注 | 信息 |
数据库 | 信息 |
系统 | 调试 |
验证 | 信息 |
视觉力 | 信息 |
工作流程 | 信息 |
警告
如果 Apex Code 日志级别设置为 FINEST,则调试 日志包含所有 Apex 变量分配的详细信息。确保 Apex 代码 被跟踪不会处理敏感数据。在启用 FINEST 日志级别之前,请 确保了解组织的 Apex 处理的敏感数据级别。是 特别注意社区用户自助注册等流程,其中 可以将用户密码分配给 Apex 字符串变量。执行单元执行单元等同于事务。它包含以下一切 在事务中发生。 并分隔执行单元。EXECUTION_STARTEDEXECUTION_FINISHED代码单元代码单元是事务中的离散工作单元。例如,触发器 是一个代码单元,方法也是一个 或验证规则。webservice
注意
类不是离散的代码单元。CODE_UNIT_STARTED并分隔代码单位。工作单元 可以嵌入其他工作单元。例如:CODE_UNIT_FINISHED
EXECUTION_STARTED
CODE_UNIT_STARTED|[EXTERNAL]execute_anonymous_apex
CODE_UNIT_STARTED|[EXTERNAL]MyTrigger on Account trigger event BeforeInsert for [new]|__sfdc_trigger/MyTrigger
CODE_UNIT_FINISHED <-- The trigger ends
CODE_UNIT_FINISHED <-- The executeAnonymous ends
EXECUTION_FINISHED
代码单元包括但不限于以下内容:
- 触发器
- 工作流调用和基于时间的工作流
- 验证规则
- 审批流程
- Apex 潜在客户转换
- @future方法调用
- Web 服务调用
- executeAnonymous调用
- Apex 控制器上的 Visualforce 属性访问
- Apex 控制器上的 Visualforce 操作
- 批量执行 Apex 和方法,以及每次执行 方法startfinishexecute
- Apex 方法的执行System.Schedule execute
- 传入电子邮件处理
日志行日志行包含在代码单元中,并指示哪些代码或规则是 正在执行。日志行也可以是写入调试日志的消息。例如:

日志行由一组字段组成,由竖线 () 分隔。格式为:|
- timestamp:由事件发生的时间和一个值组成 括号之间。时间采用用户的时区,格式为 。括号中的值表示时间 自请求开始以来经过的纳秒。运行时间值为 从使用执行时在开发者控制台中查看的日志中排除 日志视图。但是,当您使用“原始日志”视图时,您可以看到经过的时间。自 打开 Raw Log 视图,在 Developer Console 的 Logs 选项卡中,右键单击名称 ,然后选择打开原始日志。HH:mm:ss.SSS
- event identifier:指定触发调试日志的事件 条目(例如 或 )。SAVEPOINT_RESETVALIDATION_RULE还包括其他 与该事件一起记录的信息,例如方法名称或行,以及 执行代码的字符号。如果无法找到行号,则改为记录。为 示例,为内置记录 托管包中的 Apex 类或代码。[EXTERNAL][EXTERNAL]对于某些事件(、、、、和),事件结束 标识符包括一个管道 (),后跟 Apex 类或触发器的 typeRef。CODE_UNIT_STARTEDCODE_UNIT_FINISHEDVF_APEX_CALL_STARTVF_APEX_CALL_ENDCONSTRUCTOR_ENTRYCONSTRUCTOR_EXIT|对于触发器,typeRef 开始 替换为 SFDC 触发器前缀。例如,或 .__sfdc_trigger/__sfdc_trigger/YourTriggerName__sfdc_trigger/YourNamespace/YourTriggerName为 一个类,typeRef 使用格式 或 。YourClassYourClass$YourInnerClass,YourNamespace/YourClass$YourInnerClass
更多日志数据此外,日志还包含以下信息。
- 累积资源使用情况记录在许多代码单元的末尾。其中 代码单元是触发器、 批处理 Apex 消息处理、方法、Apex 测试方法、Apex Web 服务方法和 Apex 潜在客户转换。executeAnonymous@future
- 累积分析信息在事务结束时记录一次 并包含有关 DML 调用、成本高昂的查询等的信息。 “昂贵”的查询会大量使用资源。
下面是一个调试示例 日志。
37.0 APEX_CODE,FINEST;APEX_PROFILING,INFO;CALLOUT,INFO;DB,INFO;SYSTEM,DEBUG;
VALIDATION,INFO;VISUALFORCE,INFO;WORKFLOW,INFO
Execute Anonymous: System.debug('Hello World!');
16:06:58.18 (18043585)|USER_INFO|[EXTERNAL]|005D0000001bYPN|devuser@example.org|
Pacific Standard Time|GMT-08:00
16:06:58.18 (18348659)|EXECUTION_STARTED
16:06:58.18 (18383790)|CODE_UNIT_STARTED|[EXTERNAL]|execute_anonymous_apex
16:06:58.18 (23822880)|HEAP_ALLOCATE|[72]|Bytes:3
16:06:58.18 (24271272)|HEAP_ALLOCATE|[77]|Bytes:152
16:06:58.18 (24691098)|HEAP_ALLOCATE|[342]|Bytes:408
16:06:58.18 (25306695)|HEAP_ALLOCATE|[355]|Bytes:408
16:06:58.18 (25787912)|HEAP_ALLOCATE|[467]|Bytes:48
16:06:58.18 (26415871)|HEAP_ALLOCATE|[139]|Bytes:6
16:06:58.18 (26979574)|HEAP_ALLOCATE|[EXTERNAL]|Bytes:1
16:06:58.18 (27384663)|STATEMENT_EXECUTE|[1]
16:06:58.18 (27414067)|STATEMENT_EXECUTE|[1]
16:06:58.18 (27458836)|HEAP_ALLOCATE|[1]|Bytes:12
16:06:58.18 (27612700)|HEAP_ALLOCATE|[50]|Bytes:5
16:06:58.18 (27768171)|HEAP_ALLOCATE|[56]|Bytes:5
16:06:58.18 (27877126)|HEAP_ALLOCATE|[64]|Bytes:7
16:06:58.18 (49244886)|USER_DEBUG|[1]|DEBUG|Hello World!
16:06:58.49 (49590539)|CUMULATIVE_LIMIT_USAGE
16:06:58.49 (49590539)|LIMIT_USAGE_FOR_NS|(default)|
Number of SOQL queries: 0 out of 100
Number of query rows: 0 out of 50000
Number of SOSL queries: 0 out of 20
Number of DML statements: 0 out of 150
Number of DML rows: 0 out of 10000
Maximum CPU time: 0 out of 10000
Maximum heap size: 0 out of 6000000
Number of callouts: 0 out of 100
Number of Email Invocations: 0 out of 10
Number of future calls: 0 out of 50
Number of queueable jobs added to the queue: 0 out of 50
Number of Mobile Apex push calls: 0 out of 10
16:06:58.49 (49590539)|CUMULATIVE_LIMIT_USAGE_END
16:06:58.18 (52417923)|CODE_UNIT_FINISHED|execute_anonymous_apex
16:06:58.18 (54114689)|EXECUTION_FINISHED
为 Apex 类设置调试日志过滤器和 触发器
调试日志筛选提供了一种机制,用于在触发器时微调日志详细程度 和班级水平。这在调试 Apex 时特别有用 逻辑。例如,若要评估复杂进程的输出,可以引发日志 给定类的详细程度,同时关闭其他类或触发器的日志记录 单个请求。
当您重写类或触发器的调试日志级别时, 这些调试级别也适用于您的类或触发器调用的类方法,以及 因此被执行的触发器。执行路径中的所有类方法和触发器 从其调用方继承调试日志设置,除非他们具有这些设置 重写。
下图演示了在类和触发器中重写调试日志级别 水平。对于这种情况,假设导致 您想仔细研究的一些问题。为此,调试日志级别 的被提升到最细的粒度。 不会覆盖这些日志级别,并且 因此继承了 的粒度日志过滤器。但是,有 已经过测试并且已知可以正常工作,因此它已关闭其日志过滤器。 同样,不在导致 一个问题,因此它的日志记录最小化,只记录 Apex 代码的错误 类别。 从 继承这些日志设置。Class1Class1Class3Class1UtilityClassClass2Trigger2Class2
微调类和触发器的调试日志记录下面是该关系图所基于的伪代码示例。
- Trigger1调用 的方法和 的另一个方法。为 例:Class1Class2
trigger Trigger1 on Account (before insert) { Class1.someMethod(); Class2.anotherMethod(); }
- Class1调用 的方法,而 的方法又调用实用程序的方法 类。为 例:Class3
public class Class1 { public static void someMethod() { Class3.thirdMethod(); } } public class Class3 { public static void thirdMethod() { UtilityClass.doSomething(); } }
- Class2导致触发器 执行。为 例:Trigger2
public class Class2 { public static void anotherMethod() { // Some code that causes Trigger2 to be fired. } }
- 在开发者控制台中使用日志
- 调试Apex API 调用
- 调试日志 优先顺序 记录
哪些事件取决于各种因素。这些因素包括跟踪标志、默认日志记录级别、API 标头、基于用户的系统日志启用以及入口点设置的日志级别。
在开发者控制台中使用日志
使用开发者控制台中的“日志”选项卡打开调试日志。

日志在 Log Inspector 中打开。Log Inspector 是 开发者控制台。它显示操作的来源、触发操作的内容以及内容 接下来发生了。使用此工具检查调试日志,其中包括数据库事件、Apex 处理、 工作流和验证逻辑。
要了解有关在开发人员控制台中使用日志的更多信息,请参阅 Salesforce 联机帮助中的日志检查器。使用开发人员控制台或监控调试日志时,您可以指定 日志中包含的信息。日志类别记录的信息类型,例如来自 Apex 或工作流规则的信息。日志级别记录的信息量。事件类型日志类别和日志级别的组合,用于指定要记录的事件。每 事件可以记录其他信息,例如事件所在的行号和字符号 已开始、与事件关联的字段以及事件的持续时间。
调试日志类别
每个调试级别都包括以下每个日志类别的调试日志级别。这 每个类别记录的信息量取决于日志级别。
调试日志级别
对于每个日志类别,每个调试级别都包括以下日志级别之一。关卡 按从低到高的顺序列出。根据以下组合记录特定事件 类别和级别。大多数事件开始在 INFO 级别记录。水平是累积的, 也就是说,如果选择 FINE,则日志还包括在 DEBUG、INFO、WARN、 和 ERROR 级别。
注意
并非所有级别都适用于所有类别。只有级别 对应于一个或多个事件可用。
- NONE
- ERROR
- WARN
- INFO
- DEBUG
- FINE
- FINER
- FINEST
重要
在运行部署之前,请验证是否未设置 Apex Code 日志级别 到FINEST。否则,部署所需的时间可能比预期的要长。如果开发者 控制台处于打开状态,开发者控制台中的日志级别会影响所有日志,包括创建的日志 在部署期间。
调试事件类型
以下是写入调试日志的内容的示例。该事件是 。格式为 |:
USER_DEBUGtimestampevent identifier
- timestamp:由事件发生的时间和 括弧。时间采用用户的时区,格式为 。括号中的值表示经过的时间 自请求开始以来的纳秒数。运行时间值将从日志中排除 当您使用“执行日志”视图时,在开发人员控制台中查看。但是,您可以看到 使用“原始日志”视图时经过的时间。要打开“原始日志”视图,请从 Developer 控制台的“日志”选项卡,右键单击日志的名称,然后选择“打开原始日志” 日志。HH:mm:ss.SSS
- event identifier:指定触发调试日志条目的事件(例如 作为 或 )。SAVEPOINT_RESETVALIDATION_RULE还包括与该事件一起记录的其他信息, 例如方法名称或执行代码的行号和字符号。如果 无法找到行号,已记录 相反。例如,为内置记录 托管包中的 Apex 类或代码。[EXTERNAL][EXTERNAL]对于某些事件(、、、、和)、 事件标识符的末尾包括一个管道 () 后跟 Apex 类或触发器的 typeRef。CODE_UNIT_STARTEDCODE_UNIT_FINISHEDVF_APEX_CALL_STARTVF_APEX_CALL_ENDCONSTRUCTOR_ENTRYCONSTRUCTOR_EXIT|对于触发器,typeRef 开始 替换为 SFDC 触发器前缀。为 example,或 .__sfdc_trigger/__sfdc_trigger/YourTriggerName__sfdc_trigger/YourNamespace/YourTriggerName为 一个类,typeRef 使用格式 或 。YourClassYourClass$YourInnerClass,YourNamespace/YourClass$YourInnerClass
以下是调试日志行的示例。
调试日志行示例在此示例中,事件标识符由以下部分组成:
- 活动名称:
USER_DEBUG
- 代码中事件的行号:
[2]
- 设置方法的日志记录级别 自:System.Debug
DEBUG
- 用户为该方法提供的字符串:System.Debug
Hello world!
此代码片段触发以下日志行示例。
调试日志行代码片段当测试到达第 5 行时,将记录以下日志行 法典。
15:51:01.071 (55856000)|DML_BEGIN|[5]|Op:Insert|Type:Invoice_Statement__c|Rows:1
在此示例中,事件标识符由以下部分组成。
- 活动名称:
DML_BEGIN
- 代码中事件的行号:
[5]
- DML 操作类型—:Insert
Op:Insert
- 对象名称:
Type:Invoice_Statement__c
- 传递到 DML 的行数 操作:
Rows:1
将记录以下事件类型。该表列出了哪些字段或其他信息是 记录每个事件,以及日志级别和类别的哪个组合导致事件 登录。
活动名称 | 与事件一起记录的字段或信息 | 记录的类别 | 记录的级别 |
---|---|---|---|
BULK_HEAP_ALLOCATE | 分配的字节数 | Apex 代码 | 最好 |
CALLOUT_REQUEST | 行号和请求标头 | 标注 | INFO 及以上 |
CALLOUT_REQUEST(外部对象访问 用于 Salesforce Connect 的跨组织和 OData 适配器) | 外部终结点和方法 | 标注 | INFO 及以上 |
CALLOUT_RESPONSE | 行号和响应正文 | 标注 | INFO 及以上 |
CALLOUT_RESPONSE(外部对象访问 用于 Salesforce Connect 的跨组织和 OData 适配器) | 状态和状态代码 | 标注 | INFO 及以上 |
CODE_UNIT_FINISHED | 行号、代码单元名称,例如 和:MyTrigger on Account trigger event BeforeInsert for [new]对于 Apex 方法,命名空间(如果适用)、类名和方法名;为 示例,或者YourNamespace.YourClass.yourMethod()YourClass.yourMethod()对于 Apex 触发器,typeRef;例如,或__sfdc_trigger/YourNamespace.YourTrigger__sfdc_trigger/YourTrigger | Apex 代码 | ERROR 及以上 |
CODE_UNIT_STARTED | 行号、代码单元名称,例如 和:MyTrigger on Account trigger event BeforeInsert for [new]对于 Apex 方法,命名空间(如果适用)、类名和方法名;为 示例,或者YourNamespace.YourClass.yourMethod()YourClass.yourMethod()对于 Apex 触发器,typeRef;例如__sfdc_trigger/YourTrigger | Apex 代码 | ERROR 及以上 |
CONSTRUCTOR_ENTRY | 行号、Apex 类 ID、括号内包含参数类型(如果有)的字符串,以及 类型Ref;例如,或<init>()YourClassYourClass.YourInnerClass | Apex 代码 | FINE 及以上 |
CONSTRUCTOR_EXIT | 行号,带有 括号之间的参数类型(如果有)和 typeRef;例如,或<init>()YourClassYourClass.YourInnerClass | Apex 代码 | FINE 及以上 |
CUMULATIVE_LIMIT_USAGE | 没有 | Apex 分析 | INFO 及以上 |
CUMULATIVE_LIMIT_USAGE_END | 没有 | Apex 分析 | INFO 及以上 |
CUMULATIVE_PROFILING | 没有 | Apex 分析 | FINE 及以上 |
CUMULATIVE_PROFILING_BEGIN | 没有 | Apex 分析 | FINE 及以上 |
CUMULATIVE_PROFILING_END | 没有 | Apex 分析 | FINE 及以上 |
DML_BEGIN | 行号、操作(如或)、记录名称或类型以及行数 传递到 DML 操作InsertUpdate | 分贝 | INFO 及以上 |
DML_END | 行号 | 分贝 | INFO 及以上 |
EMAIL_QUEUE | 行号 | Apex 代码 | INFO 及以上 |
ENTERING_MANAGED_PKG | 包命名空间 | Apex 代码 | FINE 及以上 |
EVENT_SERVICE_PUB_BEGIN | 事件类型 | 工作流程 | INFO 及以上 |
EVENT_SERVICE_PUB_DETAIL | 订阅 ID、发布事件的用户的 ID 和事件消息 数据 | 工作流程 | FINER 及以上 |
EVENT_SERVICE_PUB_END | 事件类型 | 工作流程 | INFO 及以上 |
EVENT_SERVICE_SUB_BEGIN | 事件类型和操作(订阅或取消订阅) | 工作流程 | INFO 及以上 |
EVENT_SERVICE_SUB_DETAIL | 订阅 ID、订阅实例 ID、引用数据(如 进程 API 名称)、激活或停用订阅的用户的 ID 和事件 消息数据 | 工作流程 | FINER 及以上 |
EVENT_SERVICE_SUB_END | 事件类型和操作(订阅或取消订阅) | 工作流程 | INFO 及以上 |
EXCEPTION_THROWN | 行号、异常类型和消息 | Apex 代码 | INFO 及以上 |
EXECUTION_FINISHED | 没有 | Apex 代码 | ERROR 及以上 |
EXECUTION_STARTED | 没有 | Apex 代码 | ERROR 及以上 |
FATAL_ERROR | 异常类型、消息和堆栈跟踪 | Apex 代码 | ERROR 及以上 |
FLOW_ACTIONCALL_DETAIL | 采访 ID、元素名称、操作类型、操作枚举或 ID,无论是操作调用 成功,并显示错误消息 | 工作流程 | FINER 及以上 |
FLOW_ASSIGNMENT_DETAIL | 采访 ID、引用、运算符和值 | 工作流程 | FINER 及以上 |
FLOW_BULK_ELEMENT_BEGIN | 采访 ID 和元素类型 | 工作流程 | FINE 及以上 |
FLOW_BULK_ELEMENT_DETAIL | 采访 ID、元素类型、元素名称、记录数 | 工作流程 | FINER 及以上 |
FLOW_BULK_ELEMENT_END | 采访 ID、元素类型、元素名称、记录数和执行 时间 | 工作流程 | FINE 及以上 |
FLOW_BULK_ELEMENT_LIMIT_USAGE | 将使用量递增,以达到此批量元素的限制。每个事件都显示使用情况 对于以下限制之一:SOQL queries SOQL query rows SOSL queries DML statements DML rows CPU time in ms Heap size in bytes Callouts Email invocations Future calls Jobs in queue Push notifications | 工作流程 | FINER 及以上 |
FLOW_BULK_ELEMENT_NOT_SUPPORTED | 不支持批量操作的操作、元素名称和实体名称 | 工作流程 | INFO 及以上 |
FLOW_CREATE_INTERVIEW_BEGIN | 组织 ID、定义 ID 和版本 ID | 工作流程 | INFO 及以上 |
FLOW_CREATE_INTERVIEW_END | 面试 ID 和流名称 | 工作流程 | INFO 及以上 |
FLOW_CREATE_INTERVIEW_ERROR | 消息、组织 ID、定义 ID 和版本 ID | 工作流程 | ERROR 及以上 |
FLOW_ELEMENT_BEGIN | 采访 ID、元素类型和元素名称 | 工作流程 | FINE 及以上 |
FLOW_ELEMENT_DEFERRED | 元素类型和元素名称 | 工作流程 | FINE 及以上 |
FLOW_ELEMENT_END | 采访 ID、元素类型和元素名称 | 工作流程 | FINE 及以上 |
FLOW_ELEMENT_ERROR | 消息、元素类型和元素名称(流运行时异常) | 工作流程 | ERROR 及以上 |
FLOW_ELEMENT_ERROR | 消息、元素类型和元素名称(未找到 spark) | 工作流程 | ERROR 及以上 |
FLOW_ELEMENT_ERROR | 消息、元素类型和元素名称(设计器例外) | 工作流程 | ERROR 及以上 |
FLOW_ELEMENT_ERROR | 消息、元素类型和元素名称(超出设计器限制) | 工作流程 | ERROR 及以上 |
FLOW_ELEMENT_ERROR | 消息、元素类型和元素名称(设计器运行时异常) | 工作流程 | ERROR 及以上 |
FLOW_ELEMENT_FAULT | 消息、元素类型和元素名称(采用的错误路径) | 工作流程 | 警告及以上 |
FLOW_ELEMENT_LIMIT_USAGE | 将使用量递增,以达到此元素的限制。每个事件都显示 这些限制之一。SOQL queries SOQL query rows SOSL queries DML statements DML rows CPU time in ms Heap size in bytes Callouts Email invocations Future calls Jobs in queue Push notifications | 工作流程 | FINER 及以上 |
FLOW_INTERVIEW_FINISHED_LIMIT_USAGE | Usage toward a limit when the interview finishes. Each event displays the usage for one of these limits.SOQL queries SOQL query rows SOSL queries DML statements DML rows CPU time in ms Heap size in bytes Callouts Email invocations Future calls Jobs in queue Push notifications | 工作流程 | FINER 及以上 |
FLOW_INTERVIEW_PAUSED | 采访 ID、流名称以及用户暂停的原因 | 工作流程 | INFO 及以上 |
FLOW_INTERVIEW_RESUMED | 面试 ID 和流名称 | 工作流程 | INFO 及以上 |
FLOW_LOOP_DETAIL | 访谈 ID、索引和值索引是集合变量中的位置 对于循环正在操作的项。 | 工作流程 | FINER 及以上 |
FLOW_RULE_DETAIL | 面试 ID、规则名称和结果 | 工作流程 | FINER 及以上 |
FLOW_START_INTERVIEW_BEGIN | 面试 ID 和流名称 | 工作流程 | INFO 及以上 |
FLOW_START_INTERVIEW_END | 面试 ID 和流名称 | 工作流程 | INFO 及以上 |
FLOW_START_INTERVIEWS_BEGIN | 请求 | 工作流程 | INFO 及以上 |
FLOW_START_INTERVIEWS_END | 请求 | 工作流程 | INFO 及以上 |
FLOW_START_INTERVIEWS_ERROR | 消息、采访 ID 和流名称 | 工作流程 | ERROR 及以上 |
FLOW_START_INTERVIEW_LIMIT_USAGE | 在面试开始时达到限制的使用量。每个事件都显示 以下限制之一:SOQL queries SOQL query rows SOSL queries DML statements DML rows CPU time in ms Heap size in bytes Callouts Email invocations Future calls Jobs in queue Push notifications | 工作流程 | FINER 及以上 |
FLOW_START_SCHEDULED_RECORDS | 运行流的消息和记录数 | 工作流程 | INFO 及以上 |
FLOW_SUBFLOW_DETAIL | 采访 ID、姓名、定义 ID 和版本 ID | 工作流程 | FINER 及以上 |
FLOW_VALUE_ASSIGNMENT | 面试 ID、键和值 | 工作流程 | FINER 及以上 |
FLOW_WAIT_EVENT_RESUMING_DETAIL | 采访 ID、元素名称、事件名称和事件类型 | 工作流程 | FINER 及以上 |
FLOW_WAIT_EVENT_WAITING_DETAIL | 采访 ID、元素名称、事件名称、事件类型以及条件是否 遇到 | 工作流程 | FINER 及以上 |
FLOW_WAIT_RESUMING_DETAIL | 采访 ID、元素名称和持久采访 ID | 工作流程 | FINER 及以上 |
FLOW_WAIT_WAITING_DETAIL | 采访 ID、元素名称、元素正在等待的事件数,以及 持久化采访 ID | 工作流程 | FINER 及以上 |
HEAP_ALLOCATE | 行号和字节数 | Apex 代码 | FINER 及以上 |
HEAP_DEALLOCATE | 行号和释放的字节数 | Apex 代码 | FINER 及以上 |
IDEAS_QUERY_EXECUTE | 行号 | 分贝 | 最好 |
LIMIT_USAGE_FOR_NS | 命名空间和以下内容 限制:Number of SOQL queries Number of query rows Number of SOSL queries Number of DML statements Number of DML rows Number of code statements Maximum heap size Number of callouts Number of Email Invocations Number of fields describes Number of record type describes Number of child relationships describes Number of picklist describes Number of future calls Number of find similar calls Number of System.runAs() invocations | Apex 分析 | 最好 |
METHOD_ENTRY | 行号、类的 Lightning 平台 ID 和方法签名(带有 命名空间(如果适用) | Apex 代码 | FINE 及以上 |
METHOD_EXIT | 行号、类的 Lightning 平台 ID 和方法签名(带有 命名空间(如果适用)对于构造函数,将记录以下信息: 行 编号和类名。 | Apex 代码 | FINE 及以上 |
NAMED_CREDENTIAL_REQUEST | 命名凭据 ID、命名凭据名称、终结点、方法、外部凭据 类型、Http 标头授权、请求大小字节数和重试 401。如果使用 出站网络连接,还会记录以下附加字段: 出站网络 连接 ID、出站网络连接名称、出站网络连接状态、主机 类型、主机区域和专用连接出站每小时数据使用百分比。 | 标注 | INFO 及以上 |
NAMED_CREDENTIAL_RESPONSE | 从 NamedCredential 返回的响应正文的截断部分 标注。 | 标注 | INFO 及以上 |
NAMED_CREDENTIAL_RESPONSE_DETAIL | 命名凭据 ID、命名凭据名称、状态代码、响应大小字节、总体 标注时间毫秒和连接时间毫秒。如果使用出站网络连接,则这些 还会记录其他字段:出站网络连接 ID、出站网络 连接名称和专用连接出站每小时数据使用百分比。 | 标注 | FINER 及以上 |
NBA_NODE_BEGIN | 元素名称、元素类型 | NBA(英语: | FINE 及以上 |
NBA_NODE_DETAIL | 元素名称、元素类型、消息 | NBA(英语: | FINE 及以上 |
NBA_NODE_END | 元素名称、元素类型、消息 | NBA(英语: | FINE 及以上 |
NBA_NODE_ERROR | 元素名称、元素类型、错误消息 | NBA(英语: | ERROR 及以上 |
NBA_OFFER_INVALID | 姓名、ID、原因 | NBA(英语: | FINE 及以上 |
NBA_STRATEGY_BEGIN | 策略名称 | NBA(英语: | FINE 及以上 |
NBA_STRATEGY_END | 策略名称、输出计数 | NBA(英语: | FINE 及以上 |
NBA_STRATEGY_ERROR | 策略名称、错误消息 | NBA(英语: | ERROR 及以上 |
POP_TRACE_FLAGS | 行号,具有其日志级别的类或触发器的 Lightning 平台 ID 设置,进入范围,此类或触发器的名称以及日志级别 离开此作用域后生效的设置 | 系统 | INFO 及以上 |
PUSH_NOTIFICATION_INVALID_APP | 应用命名空间、应用名称当 Apex 代码尝试发送 通知组织中不存在或未启用推送的应用。 | Apex 代码 | 错误 |
PUSH_NOTIFICATION_INVALID_CERTIFICATE | 应用命名空间、应用名称此事件表示证书无效。为 例如,它已过期。 | Apex 代码 | 错误 |
PUSH_NOTIFICATION_INVALID_NOTIFICATION | 应用命名空间、应用名称、服务类型(Apple 或 Android GCM)、用户 ID、设备、有效负载 (子字符串),有效负载长度。当通知有效负载太 长。 | Apex 代码 | 错误 |
PUSH_NOTIFICATION_NO_DEVICES | 应用命名空间、应用名称当我们尝试的所有用户都没有时,会发生此事件 发送通知以注册设备。 | Apex 代码 | 调试 |
PUSH_NOTIFICATION_NOT_ENABLED | 当组织中未启用推送通知时,会发生此事件。 | Apex 代码 | 信息 |
PUSH_NOTIFICATION_SENT | 应用命名空间、应用名称、服务类型(Apple 或 Android GCM)、用户 ID、设备、有效负载 (子字符串)此事件记录已接受发送通知。我们没有 保证通知的送达。 | Apex 代码 | 调试 |
PUSH_TRACE_FLAGS | 行号、设置了日志级别的类或触发器的 Salesforce ID,以及 超出范围、此类或触发器的名称以及日志级别设置 进入此范围后生效的 | 系统 | INFO 及以上 |
QUERY_MORE_BEGIN | 行号 | 分贝 | INFO 及以上 |
QUERY_MORE_END | 行号 | 分贝 | INFO 及以上 |
QUERY_MORE_ITERATIONS | 行号和迭代次数queryMore | 分贝 | INFO 及以上 |
SAVEPOINT_ROLLBACK | 行号和保存点名称 | 分贝 | INFO 及以上 |
SAVEPOINT_SET | 行号和保存点名称 | 分贝 | INFO 及以上 |
SLA_END | 案例数、加载时间、处理时间、要插入的案例里程碑数、 更新、删除和新建触发器 | 工作流程 | INFO 及以上 |
SLA_EVAL_MILESTONE | 里程碑 ID | 工作流程 | INFO 及以上 |
SLA_NULL_START_DATE | 没有 | 工作流程 | INFO 及以上 |
SLA_PROCESS_CASE | 案例 ID | 工作流程 | INFO 及以上 |
SOQL_EXECUTE_BEGIN | 行号、聚合数和查询源 | 分贝 | INFO 及以上 |
SOQL_EXECUTE_END | 行号、行数和持续时间(以毫秒为单位) | 分贝 | INFO 及以上 |
SOQL_EXECUTE_EXPLAIN | 已执行的 SOQL 查询的查询计划详细信息。有关查看查询计划的信息 使用开发人员控制台,请参阅检索查询计划。获取反馈 有关查询性能的信息,请参阅获取有关 查询性能。 | 分贝 | 最好 |
SOSL_EXECUTE_BEGIN | 行号和查询源 | 分贝 | INFO 及以上 |
SOSL_EXECUTE_END | 行号、行数和持续时间(以毫秒为单位) | 分贝 | INFO 及以上 |
STACK_FRAME_VARIABLE_LIST | 帧号和变量列表的形式:| .例如:Variable numberValuevar1:50 var2:'Hello World' | Apex 分析 | FINE 及以上 |
STATEMENT_EXECUTE | 行号 | Apex 代码 | FINER 及以上 |
STATIC_VARIABLE_LIST | 格式为:| .例如:Variable numberValuevar1:50 var2:'Hello World' | Apex 分析 | FINE 及以上 |
SYSTEM_CONSTRUCTOR_ENTRY | 行号和带有 括号之间的参数类型(如果有)<init>() | 系统 | FINE 及以上 |
SYSTEM_CONSTRUCTOR_EXIT | 行号和带有 括号之间的参数类型(如果有)<init>() | 系统 | FINE 及以上 |
SYSTEM_METHOD_ENTRY | 行号和方法签名 | 系统 | FINE 及以上 |
SYSTEM_METHOD_EXIT | 行号和方法签名 | 系统 | FINE 及以上 |
SYSTEM_MODE_ENTER | 模式名称 | 系统 | INFO 及以上 |
SYSTEM_MODE_EXIT | 模式名称 | 系统 | INFO 及以上 |
TESTING_LIMITS | 没有 | Apex 分析 | INFO 及以上 |
TOTAL_EMAIL_RECIPIENTS_QUEUED | 发送的电子邮件数量 | Apex 分析 | FINE 及以上 |
USER_DEBUG | 行号、日志记录级别和用户提供的字符串 | Apex 代码 | 默认为 DEBUG 及以上版本。如果用户设置了方法的日志级别,则会在该级别记录事件 相反。System.Debug |
USER_INFO | 行号、用户 ID、用户名、用户时区和用户时区(以 GMT 为单位) | Apex 代码 | ERROR 及以上 |
VALIDATION_ERROR | 错误信息 | 验证 | INFO 及以上 |
VALIDATION_FAIL | 没有 | 验证 | INFO 及以上 |
VALIDATION_FORMULA | 公式来源和值 | 验证 | INFO 及以上 |
VALIDATION_PASS | 没有 | 验证 | INFO 及以上 |
VALIDATION_RULE | 规则名称 | 验证 | INFO 及以上 |
VARIABLE_ASSIGNMENT | 行号、变量名称(包括变量的命名空间,如果适用)、 变量值和变量地址的字符串表示形式 | Apex 代码 | 最好 |
VARIABLE_SCOPE_BEGIN | 行号、变量名称(包括变量的命名空间,如果适用)、类型、 一个值,指示是否可以引用变量,以及一个值,指示 变量是否为静态变量 | Apex 代码 | 最好 |
VARIABLE_SCOPE_END | 没有 | Apex 代码 | 最好 |
VF_APEX_CALL_START | Visualforce 控制器的元素名称、方法名称、返回类型和 typeRef (例如,YourApexClass) | Apex 代码 | INFO 及以上 |
VF_APEX_CALL_END | Visualforce 控制器的元素名称、方法名称、返回类型和 typeRef (例如,YourApexClass) | Apex 代码 | INFO 及以上 |
VF_DESERIALIZE_VIEWSTATE_BEGIN | 查看状态 ID | 视觉力 | INFO 及以上 |
VF_DESERIALIZE_VIEWSTATE_END | 没有 | 视觉力 | INFO 及以上 |
VF_EVALUATE_FORMULA_BEGIN | 查看状态 ID 和公式 | 视觉力 | FINER 及以上 |
VF_EVALUATE_FORMULA_END | 没有 | 视觉力 | FINER 及以上 |
VF_PAGE_MESSAGE | 消息文本 | Apex 代码 | INFO 及以上 |
VF_SERIALIZE_VIEWSTATE_BEGIN | 查看状态 ID | 视觉力 | INFO 及以上 |
VF_SERIALIZE_VIEWSTATE_END | 没有 | 视觉力 | INFO 及以上 |
WF_ACTION | 操作说明 | 工作流程 | INFO 及以上 |
WF_ACTION_TASK | 任务主题、操作 ID、规则名称、规则 ID、所有者和截止日期 | 工作流程 | INFO 及以上 |
WF_ACTIONS_END | 所执行操作的摘要 | 工作流程 | INFO 及以上 |
WF_APPROVAL | 转换类型、 和 进程节点名称EntityName: NameField Id | 工作流程 | INFO 及以上 |
WF_APPROVAL_REMOVE | EntityName: NameField Id | 工作流程 | INFO 及以上 |
WF_APPROVAL_SUBMIT | EntityName: NameField Id | 工作流程 | INFO 及以上 |
WF_APPROVAL_SUBMITTER | 提交者 ID、提交者全名和错误消息 | 工作流程 | INFO 及以上 |
WF_ASSIGN | 所有者和受托人模板 ID | 工作流程 | INFO 及以上 |
WF_CRITERIA_BEGIN | EntityName: NameField Id、规则名称、规则 ID 和 (如果规则遵循触发器类型) 触发器类型和递归计数 | 工作流程 | INFO 及以上 |
WF_CRITERIA_END | 指示成功的布尔值(true 或 false) | 工作流程 | INFO 及以上 |
WF_EMAIL_ALERT | 操作 ID、规则名称和规则 ID | 工作流程 | INFO 及以上 |
WF_EMAIL_SENT | 电子邮件模板 ID、收件人和抄送电子邮件 | 工作流程 | INFO 及以上 |
WF_ENQUEUE_ACTIONS | 排队的操作摘要 | 工作流程 | INFO 及以上 |
WF_ESCALATION_ACTION | 箱 ID 和升级日期 | 工作流程 | INFO 及以上 |
WF_ESCALATION_RULE | 没有 | 工作流程 | INFO 及以上 |
WF_EVAL_ENTRY_CRITERIA | 进程名称、电子邮件模板 ID 和指示结果的布尔值(true 或 false) | 工作流程 | INFO 及以上 |
WF_FIELD_UPDATE | EntityName: NameField Id和对象或字段 名字 | 工作流程 | INFO 及以上 |
WF_FLOW_ACTION_BEGIN | 流触发器的 ID | 工作流程 | INFO 及以上 |
WF_FLOW_ACTION_DETAIL | 流触发器的 ID、对象类型和记录的 ID,其创建或更新导致了 要触发的工作流规则、工作流规则的名称和 ID,以及流的名称和值 变量 | 工作流程 | FINE 及以上 |
WF_FLOW_ACTION_END | 流触发器的 ID | 工作流程 | INFO 及以上 |
WF_FLOW_ACTION_ERROR | 流触发器 ID、流定义的 ID、流版本的 ID 和流错误 消息 | 工作流程 | ERROR 及以上 |
WF_FLOW_ACTION_ERROR_DETAIL | 详细的流错误消息 | 工作流程 | ERROR 及以上 |
WF_FORMULA | 公式来源和值 | 工作流程 | INFO 及以上 |
WF_HARD_REJECT | 没有 | 工作流程 | INFO 及以上 |
WF_NEXT_APPROVER | 所有者、下一个所有者类型和字段 | 工作流程 | INFO 及以上 |
WF_NO_PROCESS_FOUND | 没有 | 工作流程 | INFO 及以上 |
WF_OUTBOUND_MSG | EntityName: NameField Id、操作 ID、规则名称、 和规则 ID | 工作流程 | INFO 及以上 |
WF_PROCESS_FOUND | 进程定义 ID 和进程标签 | 工作流程 | INFO 及以上 |
WF_PROCESS_NODE | 进程名称 | 工作流程 | INFO 及以上 |
WF_REASSIGN_RECORD | EntityName: NameField Id和所有者 | 工作流程 | INFO 及以上 |
WF_RESPONSE_NOTIFY | 通知程序名称、通知程序电子邮件、通知程序模板 ID 和回复电子邮件 | 工作流程 | INFO 及以上 |
WF_RULE_ENTRY_ORDER | 表示顺序的整数 | 工作流程 | INFO 及以上 |
WF_RULE_EVAL_BEGIN | 规则类型 | 工作流程 | INFO 及以上 |
WF_RULE_EVAL_END | 没有 | 工作流程 | INFO 及以上 |
WF_RULE_EVAL_VALUE | 价值 | 工作流程 | INFO 及以上 |
WF_RULE_FILTER | 筛选条件 | 工作流程 | INFO 及以上 |
WF_RULE_INVOCATION | EntityName: NameField Id | 工作流程 | INFO 及以上 |
WF_RULE_NOT_EVALUATED | 没有 | 工作流程 | INFO 及以上 |
WF_SOFT_REJECT | 进程名称 | 工作流程 | INFO 及以上 |
WF_SPOOL_ACTION_BEGIN | 节点类型 | 工作流程 | INFO 及以上 |
WF_TIME_TRIGGER | EntityName: NameField Id、时间动作、时间 操作容器和计算日期时间 | 工作流程 | INFO 及以上 |
WF_TIME_TRIGGERS_BEGIN | 没有 | 工作流程 | INFO 及以上 |
XDS_DETAIL(外部对象访问 用于 Salesforce Connect 的跨组织和 OData 适配器) | 对于 OData 适配器,自定义 HTTP 的 POST 正文和名称以及计算公式 头 | 标注 | FINER 及以上 |
XDS_RESPONSE(外部对象访问 用于 Salesforce Connect 的跨组织和 OData 适配器) | 外部数据源、外部对象、请求详细信息、返回记录数、 和系统使用情况 | 标注 | INFO 及以上 |
XDS_RESPONSE_DETAIL(外部对象访问 用于 Salesforce Connect 的跨组织和 OData 适配器) | 来自外部系统的截断响应,包括返回的记录 | 标注 | FINER 及以上 |
XDS_RESPONSE_ERROR(外部对象访问 用于 Salesforce Connect 的跨组织和 OData 适配器) | 错误信息 | 标注 | ERROR 及以上 |
调试Apex API 调用
调用 Apex 的所有 API 调用都支持允许访问 有关代码执行的详细信息,包括对 的任何调用。SOAP 输入标头的 categories 字段允许您 根据中概述的级别设置日志记录粒度 桌子。System.debug()DebuggingHeader
元素名称 | 类型 | 描述 |
---|---|---|
类别 | 日志类别 | 指定 中返回的信息类型 调试日志。有效值为:DbWorkflowValidationCalloutApex_codeApex_profilingVisualforceSystemAll |
水平 | 日志类别级别 | 指定 调试日志。有效的日志级别包括(从 从低到高):NONEERRORWARNINFODEBUGFINEFINERFINEST |
此外,作为 for backwards 的一部分,仍支持以下日志级别 兼容性。DebuggingHeader
日志级别 | 描述 |
---|---|
NONE | 不包含任何日志消息。 |
DEBUGONLY | 包括较低级别的消息和消息 由对方法的调用生成。System.debug |
DB | 包括调用 方法和每个数据 操作语言 (DML) 语句或内联 SOQL 或 SOSL 查询。System.debug |
PROFILE | 包括调用 方法,每个 DML 语句 或内联 SOQL 或 SOSL 查询,以及入口和 退出每个用户定义的方法。另外 调试日志的末尾包含整个 各部分的分析信息 使用最多资源的请求。这 分析信息以 SOQL 和 SOSL 语句、DML 操作和 Apex 方法调用。这三个部分列出了 代码中消耗时间最多的位置, 按总累积时间的降序排列。也 列出的是类别的次数 执行。System.debug |
CALLOUT | 包括请求-响应 XML 服务器正在从外部发送和接收 Web 服务。在调试相关问题时很有用 使用 Lightning 平台 Web 服务 API 调用 或对用户访问外部对象进行故障排除 通过 Salesforce Connect。 |
DETAIL | 包括级别和以下级别生成的所有消息。PROFILE变量声明语句循环执行的开始所有循环控制,例如 break 和 继续引发的异常 *静态和类初始化代码 *上下文中的任何更改with sharing |
相应的输出标头 ,包含生成的调试日志。查看更多 信息,请参阅 SOAP API 开发人员指南 中的 DebuggingHeader。DebuggingInfo
调试日志优先顺序
记录哪些事件取决于各种因素。这些因素包括您的跟踪 标志、默认日志记录级别、API 标头、基于用户的系统日志启用和日志 由您的入口点设置的级别。调试日志级别的优先顺序为:
- 跟踪标志将覆盖所有其他日志记录逻辑。开发者控制台在以下情况下设置跟踪标志 它将加载,并且该跟踪标志将一直有效,直到它过期。您可以在 开发人员控制台或在安装程序中或使用 和 工具 API 对象。TraceFlagDebugLevel注意设置类和触发器跟踪标志不会导致 要生成或保存的日志。类和触发器跟踪标志覆盖其他日志记录级别, 包括由用户跟踪标志设置的日志记录级别,但它们不会导致日志记录发生。如果 日志记录在类或触发器执行时启用,日志在执行时生成 执行。
- 如果您没有活动跟踪标志,则同步和异步 Apex 测试将使用 默认日志记录级别。默认日志记录级别为:分贝信息APEX_CODE调试APEX_PROFILING信息工作流程信息验证信息标注信息视觉力信息系统调试
- 如果没有相关的跟踪标志处于活动状态,并且没有运行任何测试,则 API 标头将 日志记录级别。在没有调试标头的情况下发送的 API 请求会生成暂时性 日志 – 未保存的日志 – 除非其他日志记录规则生效。
- 如果入口点设置了日志级别,则使用该日志级别。例如,Visualforce 请求可以包含用于设置日志级别的调试参数。
如果这些情况都不适用,则不会生成或保留日志。