调试、测试和部署 Apex

在沙盒中开发 Apex 代码,并使用开发人员控制台对其进行调试,然后进行调试 原木。对代码进行单元测试,然后使用包将其分发给客户。

  • 调试Apex
    Apex 提供调试支持。您可以使用开发人员控制台和调试日志来调试 Apex 代码。
  • 测试 Apex Apex
    提供了一个测试框架,允许您编写单元测试、运行测试、检查测试结果以及获得代码覆盖率结果。
  • 部署 Apex
    您无法在 Salesforce 生产组织中开发 Apex。您的开发工作是在沙盒或 Developer Edition 组织中完成的。
  • 使用托管软件包
    分发 Apex 作为 ISV 或 Salesforce 合作伙伴,您可以使用软件包将 Apex 代码分发给客户组织。在这里,我们将介绍包和包版本控制。

调试Apex

Apex 提供调试支持。您可以使用开发人员调试 Apex 代码 控制台和调试日志。

为了帮助在代码中进行调试,Apex 支持异常语句和自定义异常。 此外,Apex 还会向开发人员发送电子邮件,以解决未处理的异常。

  1. 调试日志
  2. 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
  • 传入电子邮件处理

日志行日志行包含在代码单元中,并指示哪些代码或规则是 正在执行。日志行也可以是写入调试日志的消息。例如:

Debug Log Line Example

日志行由一组字段组成,由竖线 () 分隔。格式为:|

  • 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

微调类和触发器的调试日志记录Debug log filters for classes and triggers下面是该关系图所基于的伪代码示例。

  1. Trigger1调用 的方法和 的另一个方法。为 例:Class1Class2trigger Trigger1 on Account (before insert) { Class1.someMethod(); Class2.anotherMethod(); }
  2. Class1调用 的方法,而 的方法又调用实用程序的方法 类。为 例:Class3public class Class1 { public static void someMethod() { Class3.thirdMethod(); } } public class Class3 { public static void thirdMethod() { UtilityClass.doSomething(); } }
  3. Class2导致触发器 执行。为 例:Trigger2public class Class2 { public static void anotherMethod() { // Some code that causes Trigger2 to be fired. } }
  • 在开发者控制台中使用日志
  • 调试Apex API 调用
  • 调试日志 优先顺序 记录
    哪些事件取决于各种因素。这些因素包括跟踪标志、默认日志记录级别、API 标头、基于用户的系统日志启用以及入口点设置的日志级别。

在开发者控制台中使用日志

使用开发者控制台中的“日志”选项卡打开调试日志。

使用“日志”选项卡打开相关调试日志以供查看

日志在 Log Inspector 中打开。Log Inspector 是 开发者控制台。它显示操作的来源、触发操作的内容以及内容 接下来发生了。使用此工具检查调试日志,其中包括数据库事件、Apex 处理、 工作流和验证逻辑。

要了解有关在开发人员控制台中使用日志的更多信息,请参阅 Salesforce 联机帮助中的日志检查器。使用开发人员控制台或监控调试日志时,您可以指定 日志中包含的信息。日志类别记录的信息类型,例如来自 Apex 或工作流规则的信息。日志级别记录的信息量。事件类型日志类别和日志级别的组合,用于指定要记录的事件。每 事件可以记录其他信息,例如事件所在的行号和字符号 已开始、与事件关联的字段以及事件的持续时间。

调试日志类别

每个调试级别都包括以下每个日志类别的调试日志级别。这 每个类别记录的信息量取决于日志级别。

日志类别描述
数据库包括有关数据库活动的信息,包括每个数据操作 语言 (DML) 语句或内联 SOQL 或 SOSL 查询。
工作流程包括工作流规则、流和流程的信息,例如规则名称 以及所采取的行动。
NBA(英语:包括有关 Einstein Next Best Action 活动的信息,包括策略 来自策略生成器的执行详细信息。
验证包括有关验证规则的信息,例如规则的名称以及是否 规则的计算结果为 true 或 false。
标注包括服务器所在的请求-响应 XML 从外部 Web 服务发送和接收。在调试与以下内容相关的问题时很有用 使用 Lightning 平台 Web 服务 API 调用或对用户访问外部进行故障排除 对象通过 Salesforce Connect。
Apex 代码包括有关 Apex 代码的信息。可以包含日志消息等信息 由 DML 语句、内联 SOQL 或 SOSL 查询生成,任何 触发器,以及任何测试方法的开始和完成。
Apex 分析包括累积分析信息,例如命名空间的限制和 发送的电子邮件数量。
视觉力包括有关 Visualforce 事件的信息,包括序列化和 在 Visualforce 中反序列化视图状态或计算公式字段 页。
系统包括有关调用所有系统方法(如方法)的信息。System.debug

调试日志级别

对于每个日志类别,每个调试级别都包括以下日志级别之一。关卡 按从低到高的顺序列出。根据以下组合记录特定事件 类别和级别。大多数事件开始在 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.DebugDEBUG
  • 用户为该方法提供的字符串:System.DebugHello world!

此代码片段触发以下日志行示例。

调试日志行代码片段调试日志行代码片段当测试到达第 5 行时,将记录以下日志行 法典。

15:51:01.071 (55856000)|DML_BEGIN|[5]|Op:Insert|Type:Invoice_Statement__c|Rows:1

在此示例中,事件标识符由以下部分组成。

  • 活动名称:DML_BEGIN
  • 代码中事件的行号:[5]
  • DML 操作类型—:InsertOp: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/YourTriggerApex 代码ERROR 及以上
CODE_UNIT_STARTED行号、代码单元名称,例如 和:MyTrigger on Account trigger event BeforeInsert for [new]对于 Apex 方法,命名空间(如果适用)、类名和方法名;为 示例,或者YourNamespace.YourClass.yourMethod()YourClass.yourMethod()对于 Apex 触发器,typeRef;例如__sfdc_trigger/YourTriggerApex 代码ERROR 及以上
CONSTRUCTOR_ENTRY行号、Apex 类 ID、括号内包含参数类型(如果有)的字符串,以及 类型Ref;例如,或<init>()YourClassYourClass.YourInnerClassApex 代码FINE 及以上
CONSTRUCTOR_EXIT行号,带有 括号之间的参数类型(如果有)和 typeRef;例如,或<init>()YourClassYourClass.YourInnerClassApex 代码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_USAGEUsage 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() invocationsApex 分析最好
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_STARTVisualforce 控制器的元素名称、方法名称、返回类型和 typeRef (例如,YourApexClass)Apex 代码INFO 及以上
VF_APEX_CALL_ENDVisualforce 控制器的元素名称、方法名称、返回类型和 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_REMOVEEntityName: NameField Id工作流程INFO 及以上
WF_APPROVAL_SUBMITEntityName: NameField Id工作流程INFO 及以上
WF_APPROVAL_SUBMITTER提交者 ID、提交者全名和错误消息工作流程INFO 及以上
WF_ASSIGN所有者和受托人模板 ID工作流程INFO 及以上
WF_CRITERIA_BEGINEntityName: 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_UPDATEEntityName: 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_MSGEntityName: NameField Id、操作 ID、规则名称、 和规则 ID工作流程INFO 及以上
WF_PROCESS_FOUND进程定义 ID 和进程标签工作流程INFO 及以上
WF_PROCESS_NODE进程名称工作流程INFO 及以上
WF_REASSIGN_RECORDEntityName: 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_INVOCATIONEntityName: NameField Id工作流程INFO 及以上
WF_RULE_NOT_EVALUATED没有工作流程INFO 及以上
WF_SOFT_REJECT进程名称工作流程INFO 及以上
WF_SPOOL_ACTION_BEGIN节点类型工作流程INFO 及以上
WF_TIME_TRIGGEREntityName: 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 开发人员指南 中的 DebuggingHeaderDebuggingInfo

调试日志优先顺序

记录哪些事件取决于各种因素。这些因素包括您的跟踪 标志、默认日志记录级别、API 标头、基于用户的系统日志启用和日志 由您的入口点设置的级别。调试日志级别的优先顺序为:

  1. 跟踪标志将覆盖所有其他日志记录逻辑。开发者控制台在以下情况下设置跟踪标志 它将加载,并且该跟踪标志将一直有效,直到它过期。您可以在 开发人员控制台或在安装程序中或使用 和 工具 API 对象。TraceFlagDebugLevel注意设置类和触发器跟踪标志不会导致 要生成或保存的日志。类和触发器跟踪标志覆盖其他日志记录级别, 包括由用户跟踪标志设置的日志记录级别,但它们不会导致日志记录发生。如果 日志记录在类或触发器执行时启用,日志在执行时生成 执行。
  2. 如果您没有活动跟踪标志,则同步和异步 Apex 测试将使用 默认日志记录级别。默认日志记录级别为:分贝信息APEX_CODE调试APEX_PROFILING信息工作流程信息验证信息标注信息视觉力信息系统调试
  3. 如果没有相关的跟踪标志处于活动状态,并且没有运行任何测试,则 API 标头将 日志记录级别。在没有调试标头的情况下发送的 API 请求会生成暂时性 日志 – 未保存的日志 – 除非其他日志记录规则生效。
  4. 如果入口点设置了日志级别,则使用该日志级别。例如,Visualforce 请求可以包含用于设置日志级别的调试参数。

如果这些情况都不适用,则不会生成或保留日志。