.Net6中NLog配置信息记录

配置模板范本

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true"
internalLogLevel="Info"
internalLogFile="internal-nlog-AspNetCore.txt">

<!-- enable asp.net core layout renderers -->
<extensions>
<add assembly="NLog.Web.AspNetCore"/>
</extensions>

<!-- the targets to write to -->
<targets>
<!-- File Target for all log messages with basic details -->
<target xsi:type="File" name="allfile" fileName="nlog-AspNetCore-all-${shortdate}.log"
layout="${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}" />

<!-- File Target for own log messages with extra web details using some ASP.NET core renderers -->
<target xsi:type="File" name="ownFile-web" fileName="nlog-AspNetCore-own-${shortdate}.log"
layout="${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}|${callsite}" />

<!--Console Target for hosting lifetime messages to improve Docker / Visual Studio startup detection -->
<target xsi:type="Console" name="lifetimeConsole" layout="${MicrosoftConsoleLayout}" />
</targets>

<!-- rules to map from logger name to target -->
<rules>
<!--All logs, including from Microsoft-->
<logger name="*" minlevel="Trace" writeTo="allfile" />

<!--Output hosting lifetime messages to console target for faster startup detection -->
<logger name="Microsoft.Hosting.Lifetime" minlevel="Info" writeTo="lifetimeConsole, ownFile-web" final="true" />

<!--Skip non-critical Microsoft logs and so log only own logs (BlackHole) -->
<logger name="Microsoft.*" maxlevel="Info" final="true" />
<logger name="System.Net.Http.*" maxlevel="Info" final="true" />

<logger name="*" minlevel="Trace" writeTo="ownFile-web" />
</rules>
</nlog>

所有的布局参数

  • ${cached} - 将缓存应用于另一个布局输出。
  • ${db-null} - 为数据库呈现 DbNull
  • ${exception} - 通过调用记录器方法之一提供的异常信息
  • ${level} - 日志级别(例如错误、调试)或级别序号(数字)
  • ${literal} - 字符串 literal。(文本) - 用于转义括号
  • ${logger} - 记录器名称。GetLogger, GetCurrentClassLogger 等
  • ${message} - (格式化的)日志消息。
  • ${newline} - 换行符文字。
  • ${object-path} - 呈现对象的(嵌套)属性
  • ${onexception} - 仅在为日志消息定义了异常时才输出内部布局。
  • ${onhasproperties} - 仅当事件属性包含在日志事件中时才输出内部布局。
  • ${var} - 渲染变量

调用站点和堆栈跟踪

条件

  • ${when} - 仅在满足指定条件时输出内部布局。
  • ${whenempty} - 当内部布局生成空结果时输出备用布局。

上下文信息

  • ${activity} - 从 System.Diagnostics.Activity.Current NLog.DiagnosticSource External 捕获跟踪上下文
  • ${activityid} - 将 System.Diagnostics 跟踪关联 ID 放入日志中。
  • ${all-event-properties} - 记录所有事件上下文数据。
  • ${event-context} - 记录事件属性数据 - 替换为 ${事件属性}
  • ${event-properties} - 记录事件属性数据 - 重命名 ${事件-上下文}
  • ${gdc} - 全局诊断上下文项。用于保存每个应用程序实例值的字典结构。
  • ${install-context} - 安装参数(传递给 InstallNLogConfig)。
  • ${mdc} - 映射的诊断上下文 - 线程本地结构。
  • ${mdlc} - 异步映射诊断上下文 - 作用域内上下文的线程本地结构。MDC 的异步版本。
  • ${ndc} - 嵌套诊断上下文 - 线程本地结构。
  • ${ndlc} - 异步嵌套诊断上下文 - 线程本地结构。

计数器

日期和时间

  • ${date} - 当前日期和时间。
  • ${longdate} - 日期和时间采用长而可排序的格式"yyyy-MM-dd HH:mm:ss.ffff"。
  • ${qpc} - 高精度计时器,基于从 QueryPerformanceCounter 返回的值。
  • ${shortdate} - 可排序格式为 yyyy-MM-dd 的短日期。
  • ${ticks} - 当前日期和时间的分笔报价值。
  • ${time} - 24 小时可排序格式的时间 HH:mm:ss.mmm。

编码和字符串转换

  • ${json-encode} - 使用 JSON 规则转义另一个布局的输出。
  • ${left} - 文本的剩余部分
  • ${lowercase} - 将另一个布局输出的结果转换为小写。
  • ${norawvalue} - 防止将另一个布局呈现器的输出视为原始值
  • ${pad} - 将填充应用于另一个布局输出。
  • ${replace} - 将另一个布局输出中的字符串替换为另一个字符串。使用正则表达式可选
  • ${replace-newlines} - 将换行符替换为另一个字符串。
  • ${right} - 文本的右侧部分
  • ${rot13} - 使用 ROT-13 解码"加密"的文本。
  • ${substring} - 文本的子字符串
  • ${trim-whitespace} - 从另一个布局呈现器的结果中修剪空格。
  • ${uppercase} - 将另一个布局输出的结果转换为大写。
  • ${url-encode} - 对另一个布局输出的结果进行编码,以便与 URL 一起使用。
  • ${wrapline} - 以指定的行长度换行另一个布局输出的结果。
  • ${xml-encode} - 将另一个布局输出的结果转换为符合 XML 标准。

环境和配置文件

文件和目录

身份

集成

进程、线程和程序集

银光

  • ${document-uri} - 承载当前 Silverlight 应用程序的 HTML 页面的 URI。
  • ${sl-appinfo} - 有关 Silverlight 应用程序的信息。

网络、ASP.NET 和 ASP.NET 核心

 

 

文件位置

启动时,NLog 会在各种文件中搜索其配置,如下所述。它将加载找到的第一个 nlog 配置。找到第一个 nlog 配置时,搜索结束。如果未找到配置,NLog 将不会执行任何日志记录。

对于独立的 *.exe 应用程序,将按如下方式搜索文件:

  • 标准应用程序配置文件(通常为应用程序名称.exe.config)
  • 应用程序名称.exe.nlog 在应用程序的目录中
  • NLog.config 在应用程序的目录中(名称敏感;使用 docker dotnet core)
  • NLog.dll.nlog 位于 NLog.dll所在的目录中(仅当 GAC 中未安装 NLog 时)

对于 ASP.NET 应用程序,将按如下方式搜索文件:

  • 标准 web 应用程序文件 web.config
  • web.nlog 与 web.config 位于同一目录中
  • NLog.config 在应用程序的目录中
  • NLog.dll.nlog 位于 NLog.dll所在的目录中(仅当 GAC 中未安装 NLog 时)

 

 

NLog config XML(NLog配置文件也就是nlog.config的框架格式)

NLog 配置的格式设置为 XML,要么嵌入在 Visual Studio 项目配置文件(app.config 或 web.config)中,要么是独立的 XML 文件(请记住配置文件属性:Copy If newer)

独立 XML 示例:NLog.config

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <targets>
        <target name="logfile" xsi:type="File" fileName="file.txt" />
        <target name="logconsole" xsi:type="Console" />
    </targets>

    <rules>
        <logger name="*" minlevel="Info" writeTo="logconsole" />
        <logger name="*" minlevel="Debug" writeTo="logfile" />
    </rules>
</nlog>

要在/文件中嵌入NLog配置XML,请在下添加一个nlog元素并添加一个元素。例如:app.configweb.configsectionconfigSectionsnlog

<configuration>
  <configSections>
    <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>
  </configSections>
  ...
  <nlog>
    <targets>
       <target name="logconsole" xsi:type="Console" />
    </targets>
    <rules>
       <logger name="*" minlevel="Info" writeTo="logconsole" />
    </rules>
  </nlog>
</configuration>
 

XML 命名空间的使用是可选的,但在 Visual Studio 中启用了智能感知。

NLog 配置 XML 在不使用命名空间时对 Xml 节点和 Xml 属性不区分大小写,在使用命名空间时区分大小写。

 

顶级元素

可以使用以下元素作为 的子元素。 并且在任何配置中都是必需的 其他配置是可选的,在高级方案中可能很有用。nlogtargetsrules

  • targets– 定义日志目标/输出
  • rules– 定义日志路由规则
  • extensions– 从 *.dll 文件加载 NLog 扩展名
  • include– 包括外部配置文件
  • variable– 设置配置变量的值

最简单的配置由一个规则和一个将消息路由到目标的规则 () 组成。target logger

 

目标

该部分定义日志目标。每个目标都由一个元素表示。每个目标需要两个属性:targetstarget

  • name– 目标名称
  • type– 目标类型 – 例如"文件"、"数据库"、"邮件"。使用命名空间时,此属性被命名为 。xsi:type

除了这些属性之外,目标通常还接受其他参数,这些参数会影响诊断跟踪的编写方式。每个目标都有一组不同的参数,它们在项目的主页上进行了详细描述,并且它们是上下文相关的。Intellisense也可以在Visual Studio中使用。

例如 , File 目标接受定义输出文件名的参数,而 Console 目标具有确定诊断跟踪是否写入进程的标准错误 (stderr) 而不是标准输出 (stdout) 的参数。fileNameerror

此示例演示了定义多个目标的部分:两个文件、一个网络目标和 OutputDebugString 目标:targets

<targets>
  <target name="f1" xsi:type="File" fileName="file1.txt"/>
  <target name="f2" xsi:type="File" fileName="file2.txt"/>  
  <target name="n1" xsi:type="Network" address="tcp://localhost:4001"/>
  <target name="ds" xsi:type="OutputDebugString"/>
</targets>




日志级别

每个日志条目都有一个级别。每个记录器都配置为包含或忽略某些级别。常见的配置是指定包含该级别和更高级别的最低级别。例如,如果最低级别为"信息",则记录"信息"、"警告"、"错误"和"致命",但忽略"调试"和"跟踪"。

日志级别(降序)如下所示:

水平典型用途
Fatal 发生了不好的事情;应用程序正在下降
Error 有些事情失败了;申请可能会或可能不会继续
Warn 意想不到的事情;申请将继续
Info 正常行为,如邮件发送,用户更新的个人资料等。
Debug 用于调试;执行的查询、用户身份验证、会话已过期
Trace 用于跟踪调试;开始方法 X,结束方法 X

还有一个级别,即最高值。它不用于 LogEvents,但可用于在日志记录规则中进行筛选Off

 

 

规则

该部分控制哪些记录器对象和日志级别处于活动状态及其输出目标rules

在创建NLog记录器对象时,必须提供类似于的记录器名称。记录器名称也可以通过使用记录器名称变为"NameSpace.ClassName"的位置从类上下文中提取。NLog.LogManager.GetLogger("blah blah")NLog.LogManager.GetCurrentClassLogger()

使用一个元素定义单个规则,该元素筛选要匹配的记录器对象:logger

  • name– 匹配记录器对象的记录器名称 - 可能包括通配符(* 和 ?)
  • minlevel– 要记录的最低级别
  • maxlevel– 要记录的最大级别
  • level– 单级记录
  • levels- 以逗号分隔的要记录的级别列表
  • writeTo– 以逗号分隔的目标列表,以写入
  • final– 最终规则匹配后不处理任何规则
  • enabled- 设置为禁用规则而不删除它false
  • ruleName- 规则标识符,允许使用 和 进行规则查找。在 NLog 4.6.4 中引入Configuration.FindRuleByNameConfiguration.RemoveRuleByName
  • finalMinLevel- 记录器匹配将被限制为以下规则的指定最低级别。NLog 5.0 中引入

下面的示例显示了一个规则,该规则将匹配所有记录器对象,而与 它们的记录器名称无关,因为 .同时,它只会匹配 LogEvents 与最小 LogLevel = Info(或更严重)。与这些条件匹配的 LogEvent 将写入控制台目标。name="*"

<targets>
       <target name="logconsole" xsi:type="Console" />
</targets>
<rules>
       <logger name="*" minlevel="Info" writeTo="logconsole" />
</rules>

规则按顺序处理。多个规则可能适用于记录器。用于在找到匹配项后停止处理规则。final

注: 虽然规则被命名为 ,但它不定义记录器。它根据名称模式引用一个或多个记录器。logger

 

 

记录器名称筛选器

通过将规则模式与记录器名称匹配,将规则映射到记录器。规则属性可以包含通配符(* 和 ?),以便通过通配符匹配来匹配记录器名称。namename

  • *- 匹配 0 个或更多字符
  • ?- 正好匹配1个字符

使用时,记录器名称将具有"NameSpace.ClassName"格式。这使得为命名空间中的所有类设置筛选非常方便:NLog.LogManager.GetCurrentClassLogger()

<logger name="Name.Space.*" writeTo="target1" />

通过使用记录器名称筛选,还可以重定向单个类名记录器的输出:

<logger name="Name.Space.Class1" writeTo="target2" /> <!-- Add final=true to stop output to target1 -->
<logger name="Name.Space.*" writeTo="target1" />

还可以减少单个类名记录器的日志记录:

<logger name="Name.Space.Class2" maxlevel="Warn" final="true" /> <!-- Blackhole that stops all but Error + Fatal -->
<logger name="Name.Space.*" writeTo="target1" />

还可以完全阻止单个类名记录器:

<logger name="Name.Space.Class3" maxlevel="Off" final="true" /> <!-- Blackhole that stops everything -->
<logger name="Name.Space.*" writeTo="target1" />

在NLog 4.6之前,人们只能在模式的开头和/或结尾使用通配符(*):

<rules>
  <logger name="*" minlevel="Info" writeTo="logconsole" />
  <logger name="Name.Space.*" minlevel="Debug" writeTo="f1" />  
  <logger name="*.Class1" minlevel="Trace" writeTo="f2" />
  <logger name="*.Library.*" minlevel="Warn" writeTo="f3" />
</rules>
 

从 NLog 4.6 开始,通配符(* 和 ?)允许在任何位置使用。

<rules>
  <logger name="*TcpTestServer[*].Connection[07].*" minlevel="Trace" writeTo="logconsole" final="true" />
  <logger name="*TcpTestServer[*].Connection[??].*" minlevel="Debug" writeTo="logconsole" final="true" />
  <logger name="*" minlevel="Info" writeTo="logconsole" />
</rules>







记录器级别筛选器

规则定义匹配的日志条目级别。具有其他级别的条目将不匹配此规则。常用的说明符是 。其他说明符允许更高级的配置。minlevel

如果规则包含多个级别声明属性 (, 和 ),则仅使用第一个级别声明属性或集,其余属性或集将被忽略。levellevelsminlevelmaxlevel

级别声明属性按以下顺序进行处理:

  1. level
  2. levels
  3. minlevel和(这些具有相同的优先级)maxlevel
  4. (记录所有级别)

例如:如果使用,则规则将仅使用minlevel="Warn" level="Info"Info

如果规则被标记为并包含任何级别声明属性,则该属性仅适用于指定的级别。finalfinal

 

 

 

动态记录器级过滤器

日志记录规则由于其静态特性而提供高性能。配置选项非常有限。但是最近进行了更改以改进这一点:

  • NLog 4.6 增加了对使用 NLog 配置变量配置级别属性的支持。(等):levelminlevel
<variable name='globalLevel' value='debug'/>

<rules>
  <logger minlevel='${globalLevel}'/>
</rules>
  • NLog 4.6.4 增加了对使用配置 API 查找日志记录规则的支持RuleName

  • NLog 4.6.7 增加了对使用 NLog 布局的支持,例如在运行时动态更改级别属性。另请参见半动态路由规则${gdc:globalLevel}

 

 

变量

NLog 配置变量允许您通过减少重复文本来简化配置。变量可用于为常用(或冗长而复杂的)NLog 布局提供人名。这使得组织和构建 NLog 配置变得更加容易。

定义自定义变量,如下所示:

<variable name="varname" value="xxx" />

变量的值可以通过语法插入到属性值中。变量值甚至可用于定义另一个变量的值。下面的示例演示如何使用预定义的变量以及定义和使用自定义变量。${varname}shortdatelogDirectory

<nlog>
  <variable name="logDirectory" value="logs/${shortdate}"/>
  <targets>
    <target name="file1" xsi:type="File" fileName="${logDirectory}/file1.txt"/>
    <target name="file2" xsi:type="File" fileName="${logDirectory}/file2.txt"/>
  </targets>
</nlog>
 

使用此语法时,必须在使用前定义变量。否则,配置初始化将失败。注意 ${gdc} 可以用作配置变量的替代变量,因为它们的工作方式独立于加载/卸载/重新加载不同的 NLog 配置。

NLog 配置变量可以在两种模式下运行:

  • 恒定模式 -${varName}
  • 动态模式 - (随 NLog 4.1 一起引入)${var:varName}

恒定模式(或静态模式)适用于所有类型的属性,独立于其类型,但它们不会对运行时更改做出反应。

动态模式仅适用于 NLog 类型的属性,并提供以下功能:Layout

  • 可以从配置 API 中更改、删除和创建变量
  • 可以为变量配置默认值,例如${var:password:default=unknown}
  • 默认情况下,即使在重新加载配置后,也会保留在运行时分配的所有变量。除非已配置 .keepVariablesOnReload="false"

    NLog 4.4 引入,在 NLog 5.0 之前,默认值为keepVariablesOnReloadfalse

NLog 5.0 扩展了 NLog 配置变量,以处理复杂的布局类型,如 JsonLayout + CsvLayout。前任:

<nlog>
  <variable name="myJsonLayout">
    <layout type="JsonLayout">
       <attribute name="message" value="${messsage}">
    </layout>
  </variable>
  <targets>
    <target name="debug" type="Debug" layout="${myJsonLayout}" />
  </targets>
  <rules>
    <logger name="*" minlevel="Debug" writeTo="debug" />
  </rules>
</nlog>





布局和布局呈现器

NLog最强大的资产之一是使用布局的能力。在最简单的形式中,布局是带有由 和 分隔的嵌入标记的文本。这些标记称为布局呈现器,可用于将上下文信息片段插入到文本中。${}

布局可以在很多地方使用,例如它们可以控制写入屏幕上或发送到文件的信息的格式,也可以控制文件名本身。这是非常强大的,我们稍后会看到。

让我们假设,我们希望使用以下命令对写入控制台的每条消息进行批注:

  • 当前日期和时间
  • 发出日志消息的类和方法的名称
  • 日志级别
  • 消息文本

这很简单:

<target name="c" xsi:type="Console"  layout="${longdate} ${callsite} ${level} ${message}"/>

我们可以使每个记录器的每条消息转到一个单独的文件,如以下示例所示:

<target name="f" xsi:type="File" fileName="${logger}.txt"/>

如您所见,在 fileName 属性中使用了 ${logger} 布局呈现器,这会导致将每个日志消息写入其名称包含记录器名称的文件。上面的示例将创建以下文件:

  • 名称.空间.类1.txt
  • 名称.空间.类2.txt
  • 名称.空间.类3.txt
  • 其他.名称.空间.类1.txt
  • 其他.名称.空间.类2.txt
  • 其他.名称.空间.类3.txt

 

 

异步处理和包装器目标

NLog提供了包装器和复合目标,它们通过添加以下功能来修改其他目标的行为:

  • 异步处理(包装的目标在单独的线程中运行)
  • 错误时重试
  • 负载平衡
  • 缓冲
  • 滤波
  • 故障转移(故障转移)

要在配置文件中定义包装器,只需将一个目标节点嵌套在另一个目标节点中即可。您甚至可以包装包装器目标 - 深度没有限制。例如,要添加具有出错时重试功能的异步日志记录,请将以下内容添加到配置文件中:

<targets>
  <target name="n" xsi:type="AsyncWrapper">
    <target xsi:type="RetryingWrapper">
      <target xsi:type="File" fileName="${file}.txt" />
    </target>
  </target>
</targets>

由于异步处理是一种常见方案,因此 NLog 支持速记符号,以便为所有目标启用异步处理,而无需指定显式包装器。您只需在目标元素上设置,该元素中的所有目标都将与 AsyncWrapper 目标一起包装。async="true"

<nlog>
  <targets async="true">
    <!-- all targets in this section will automatically be asynchronous -->
  </targets>
</nlog>

请记住,在使用异步后台写入时,Flush 非常重要。它确保在应用程序退出之前写入所有日志记录。

 

默认包装器

有时,我们要求以相同的方式包装所有目标,例如添加缓冲和/或重试。NLog为此提供了语法。您只需将此元素放在该部分中,所有目标都将使用指定的包装器自动包装。请注意,这仅适用于单个截面,您可以有多个截面,以便您可以定义以类似方式包装的目标组。<default-wrapper /><targets /><default-wrapper /><targets />

<nlog>  
  <targets>  
    <default-wrapper xsi:type="BufferingWrapper" bufferSize="100"/>  
    <target name="f1" xsi:type="File" fileName="f1.txt"/>  
    <target name="f2" xsi:type="File" fileName="f2.txt"/>  
  </targets>  
  <targets>  
    <default-wrapper xsi:type="AsyncWrapper">  
      <wrapper-target xsi:type="RetryingWrapper"/>  
    </default-wrapper>  
    <target name="n1" xsi:type="Network" address="tcp://localhost:4001"/>  
    <target name="n2" xsi:type="Network" address="tcp://localhost:4002"/>  
    <target name="n3" xsi:type="Network" address="tcp://localhost:4003"/>  
  </targets>  
</nlog>

在上面的示例中,我们定义了两个缓冲文件目标和三个异步和重试网络目标。

 

默认目标参数

与默认包装类似,NLog 提供了允许您指定目标参数的默认值的功能。例如,如果您不希望文件保持打开状态,则可以添加到每个目标,如以下示例所示:<default-target-parameters />keepFileOpen="false"

<nlog>
  <targets>
    <target name="f1" xsi:type="File" fileName="f1.txt" keepFileOpen="false"/>
    <target name="f2" xsi:type="File" fileName="f2.txt" keepFileOpen="false"/>
    <target name="f3" xsi:type="File" fileName="f3.txt" keepFileOpen="false"/>
   </targets>
</nlog>

或者,您可以指定一个应用于该部分中所有目标的单个目标。默认参数基于每个类型定义,并在 XML 文件中定义的实际属性之前应用:<default-target-parameters /><targets />

<nlog>
  <targets>
    <default-target-parameters xsi:type="File" keepFileOpen="false"/>
    <target name="f1" xsi:type="File" fileName="f1.txt"/>
    <target name="f2" xsi:type="File" fileName="f2.txt"/>
    <target name="f3" xsi:type="File" fileName="f3.txt"/>
  </targets>
</nlog>




自动重新配置

配置文件在程序启动时自动读取。在长时间运行的进程(如 Windows 服务或 ASP.NET 应用程序)中,有时需要临时提高日志级别而不停止应用程序。NLog 可以监视日志记录配置文件,并在每次修改时重新读取它们。要启用此机制,只需将参数添加到配置文件中即可。autoReload="true"

<nlog autoReload="true">
   ...
</nlog>

请注意,自动重新配置支持包含文件,因此每次更改其中一个包含的文件时,都会重新加载整个配置。

只是为了明确说明,自动重新加载不会停止/回收 IIS 应用程序池。

 

 

包含文件

NLog 提供了包含文件功能,以便可以将配置存储在多个文件中。

<include file="nlog-common.config" />

与 NLog 配置中的大多数属性一样,file 属性可以引用变量。以下示例包含一个与运行 nlog 的计算机同名的文件。

<include file="${machinename}.config"/>

将该属性设置为 以防止在无法加载包含文件时启动失败 -- 找不到文件、无效的 XML、....使用"日志记录疑难解答"部分记录错误。此属性是可选的,缺省值为 。ignoreErrorstruefalse

从 NLog 4.4.2 开始,允许使用通配符 ()。例如*<include file="nlog-*.config"/>

可以在此处找到一个更大的示例:XML 配置<包括 />示例

 

 

内容转义

在配置文件中,某些字符需要转义。由于 它是 XML 文件,所以 和 括号应使用 和 进行转义。这也适用于属性值,如条件。<>&lt;&gt;

在布局中,我们需要转义括号,冒号应该转义,因为:}:

  • :是值分隔符。
  • }是布局的结尾

嵌套布局呈现器不需要转义。此外,反斜杠也不需要转义。

例子:

  • ${appdomain:format={1\}{0\}}(转义})
  • ${rot13:inner=${scopenested:topFrames=3:separator=x}}(无需转义)
  • ${when:when=1 == 1:Inner=Test\: Hello}(转义:)  
posted @   混子程序员ZMY  阅读(1133)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 提示词工程——AI应用必不可少的技术
· 地球OL攻略 —— 某应届生求职总结
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界
点击右上角即可分享
微信分享提示