【问题标题】:Using Splunk - extract fields from xml data in a log file using xpath使用 Splunk - 使用 xpath 从日志文件中的 xml 数据中提取字段
【发布时间】:2020-05-21 15:54:38
【问题描述】:

我正在使用 Splunk 从包含在日志文件中的 xml 数据中提取一些字段。因此,为了将搜索限制为主要是 xml 文件,我开始搜索: sourcetype="这里的类型名称" "RULE"

这会返回:

0123459 TripMessage.createMessage MsgSource <?xml version="1.0" encoding="UTF-8"?>
<tmsTrip xmlns="http://ground.fedex.com/schemas/linehaul/trip" xmlns:ns2="http://ground.fedex.com/schemas/linehaul/TMSCommon">

...

文件很大。这是其中的一部分。

<?xml version="1.0" encoding="UTF-8"?>
<tmsTrip xmlns="http://ground.fedex.com/schemas/linehaul/trip" xmlns:ns2="http://ground.fedex.com/schemas/linehaul/TMSCommon">
   <recordType>PURCHASEDLINEHAUL</recordType>
   <eventType>APPROVE</eventType>
   <tripId>116029927</tripId>
   <legId>104257037</legId>
   <tripNumber>104257037</tripNumber>
   <tripLegNumber>1</tripLegNumber>
   <updatedDateGMT>2020-02-20T21:53:39.000Z</updatedDateGMT>
.... more lines here that are not important
     <purchasedCost>
      <purchasedCostTripSegment>
         <purchCostReference>1587040</purchCostReference>
         <carrier>FXTR</carrier>
         <vendorType>DRAY</vendorType>
         <billingMethod>RULE</billingMethod>
         <carrierTrailerType>PZ1</carrierTrailerType>
         <origin>
            <ns2:numberCode>923</ns2:numberCode>
            <ns2:locAbbr>RLTO</ns2:locAbbr>
            <ns2:address1>330 RESOURCE DRIVE</ns2:address1>
            <ns2:address2>LH PHONE 877-851-3543</ns2:address2>
            <ns2:daylightSavingsFlag>true</ns2:daylightSavingsFlag>
         </origin>

此查询选择日志文件中的 xml 部分文本,并且提取了一些字段,我可以将其添加到表中。 (不包括来源和来源类型..)

| xmlkv | table purchCostReference, eventType, carrier, billingMethod

但需要更多字段作为 xml 数据中的子元素。其中之一是 numberCode。我正在尝试使用 xpath 来提取这些附加字段。

| xmlkv | xpath
"//tmsTrip/purchasedCost/purchasedCostTripSegment/origin/ns2:numberCode" outfield=Origin | table purchCostReference, eventType, carrier, billingMethod, Origin

但是当我将字段添加到表中时,没有返回原始数据。没有错误。原点列是空的。

更新 我认为问题在于我需要添加 field 参数。 xml 文件位于日志文本文件中。我限制搜索以获取 xml 文件,但不仅限于 xml。所以我认为 xpath 正在努力处理不是 xml 的其他文本。

更新 我尝试使用日志记录语句中的 xml 文件向导创建提取的字段。 xml 很大,我只能选择其中的 30%。如果有人擅长正则表达式,也许他们可以给我一些关于如何完成正则表达式命令以获取所有 xml 的指示。 (我尝试更新 props.conf 文件,但无权添加 TRUNCATE = 0)。 这是xml文件示例:

<?xml version="1.0" encoding="UTF-8"?>
<tmsTrip xmlns="http://ground.fedex.com/schemas/linehaul/trip" xmlns:ns2="http://ground.fedex.com/schemas/linehaul/TMSCommon">
   <recordType>PURCHASEDLINEHAUL</recordType>
   <eventType>APPROVE</eventType>
   <tripId>143642990</tripId>
   <legId>129014817</legId>
   <tripNumber>129014817</tripNumber>
   <tripLegNumber>1</tripLegNumber>
   <updatedDateGMT>2020-05-22T00:53:21.000Z</updatedDateGMT>
   <origin>
      <ns2:numberCode>928</ns2:numberCode>
      <ns2:locAbbr>ANAH</ns2:locAbbr>
      <ns2:address1>590 E ORANGE THORPE AVENUE</ns2:address1>
      <ns2:city>ANAHEIM</ns2:city>
      <ns2:stateProvince>CA</ns2:stateProvince>
      <ns2:postalCode>92801</ns2:postalCode>
      <ns2:locType>FDEG</ns2:locType>
      <ns2:numberType>1</ns2:numberType>
      <ns2:timeZoneAbbr>PST</ns2:timeZoneAbbr>
      <ns2:daylightSavingsFlag>true</ns2:daylightSavingsFlag>
   </origin>
   <destination>
      <ns2:numberCode>89</ns2:numberCode>
      <ns2:locAbbr>WOOD</ns2:locAbbr>
      <ns2:address1>6000 RIVERSIDE DR</ns2:address1>
      <ns2:address2>LH PHONE 732-512-5579</ns2:address2>
      <ns2:city>KEASBEY</ns2:city>
      <ns2:stateProvince>NJ</ns2:stateProvince>
      <ns2:postalCode>08832</ns2:postalCode>
      <ns2:locType>FDEG</ns2:locType>
      <ns2:numberType>2</ns2:numberType>
      <ns2:timeZoneAbbr>EST</ns2:timeZoneAbbr>
      <ns2:daylightSavingsFlag>true</ns2:daylightSavingsFlag>
   </destination>
   <schedDispatchDateGMT>2020-05-22T13:00:00.000Z</schedDispatchDateGMT>
   <estimatedArrivalDateGMT>2020-05-26T06:00:00.000Z</estimatedArrivalDateGMT>
   <drop/>
   <hook/>
   <actualRoute>
      <routeNumber>308229</routeNumber>
      <routeOrderNumber>0</routeOrderNumber>
      <totalMiles>2787</totalMiles>
      <runTime>54.6</runTime>
   </actualRoute>
   <standardRoute>
      <routeNumber>308229</routeNumber>
      <routeOrderNumber>0</routeOrderNumber>
      <totalMiles>2787</totalMiles>
      <runTime>54.6</runTime>
   </standardRoute>
   <paidRoute>
      <routeNumber>308229</routeNumber>
      <routeOrderNumber>0</routeOrderNumber>
      <totalMiles>2787</totalMiles>
      <runTime>54.6</runTime>
   </paidRoute>
   <settlement>
      <dispatchSettlementEligibility>false</dispatchSettlementEligibility>
   </settlement>
   <livePkgCount>0.0</livePkgCount>
   <tripTollAmount>0.0</tripTollAmount>
   <trailers>
      <ns2:trailer>
         <ns2:trailerNbr>531823</ns2:trailerNbr>
         <ns2:trailerPrefix>FDXU</ns2:trailerPrefix>
         <ns2:configOrderNbr>1</ns2:configOrderNbr>
         <ns2:sealNbr>60606220</ns2:sealNbr>
         <ns2:packageWeight>9931.59</ns2:packageWeight>
         <ns2:unladenWeight>13870.0</ns2:unladenWeight>
         <ns2:totalWeight>23801.59</ns2:totalWeight>
         <ns2:packageNumber>703</ns2:packageNumber>
         <ns2:percentCube>1</ns2:percentCube>
         <ns2:hazmatFlag>false</ns2:hazmatFlag>
         <ns2:originPlanned>
            <ns2:numberCode>928</ns2:numberCode>
            <ns2:locAbbr>ANAH</ns2:locAbbr>
            <ns2:address1>590 E ORANGE THORPE AVENUE</ns2:address1>
            <ns2:city>ANAHEIM</ns2:city>
            <ns2:stateProvince>CA</ns2:stateProvince>
            <ns2:postalCode>92801</ns2:postalCode>
            <ns2:locType>FDEG</ns2:locType>
            <ns2:numberType>1</ns2:numberType>
            <ns2:timeZoneAbbr>PST</ns2:timeZoneAbbr>
            <ns2:daylightSavingsFlag>true</ns2:daylightSavingsFlag>
         </ns2:originPlanned>
         <ns2:nextSortLocation>
            <ns2:numberCode>89</ns2:numberCode>
            <ns2:locAbbr>WOOD</ns2:locAbbr>
            <ns2:address1>6000 RIVERSIDE DR</ns2:address1>
            <ns2:address2>LH PHONE 732-512-5579</ns2:address2>
            <ns2:city>KEASBEY</ns2:city>
            <ns2:stateProvince>NJ</ns2:stateProvince>
            <ns2:postalCode>08832</ns2:postalCode>
            <ns2:locType>FDEG</ns2:locType>
            <ns2:numberType>2</ns2:numberType>
            <ns2:timeZoneAbbr>EST</ns2:timeZoneAbbr>
            <ns2:daylightSavingsFlag>true</ns2:daylightSavingsFlag>
         </ns2:nextSortLocation>
         <ns2:destinationPlanned>
            <ns2:numberCode>89</ns2:numberCode>
            <ns2:locAbbr>WOOD</ns2:locAbbr>
            <ns2:address1>6000 RIVERSIDE DR</ns2:address1>
            <ns2:address2>LH PHONE 732-512-5579</ns2:address2>
            <ns2:city>KEASBEY</ns2:city>
            <ns2:stateProvince>NJ</ns2:stateProvince>
            <ns2:postalCode>08832</ns2:postalCode>
            <ns2:locType>FDEG</ns2:locType>
            <ns2:numberType>2</ns2:numberType>
            <ns2:timeZoneAbbr>EST</ns2:timeZoneAbbr>
            <ns2:daylightSavingsFlag>true</ns2:daylightSavingsFlag>
         </ns2:destinationPlanned>
         <ns2:loads>
            <ns2:load>
               <ns2:loadId>103718801</ns2:loadId>
               <ns2:loadNumber>1</ns2:loadNumber>
               <ns2:origin>
                  <ns2:numberCode>928</ns2:numberCode>
                  <ns2:locAbbr>ANAH</ns2:locAbbr>
                  <ns2:numberType>1</ns2:numberType>
               </ns2:origin>
               <ns2:destination>
                  <ns2:numberCode>89</ns2:numberCode>
                  <ns2:locAbbr>WOOD</ns2:locAbbr>
                  <ns2:address2>LH PHONE 732-512-5579</ns2:address2>
                  <ns2:numberType>2</ns2:numberType>
               </ns2:destination>
               <ns2:openDateGMT>2020-05-21T19:53:46.000Z</ns2:openDateGMT>
               <ns2:dueOverrideFlag>false</ns2:dueOverrideFlag>
               <ns2:hazmatFlag>false</ns2:hazmatFlag>
            </ns2:load>
         </ns2:loads>
      </ns2:trailer>
   </trailers>
   <dollys/>
   <purchasedCost>
      <purchasedCostTripSegment>
         <purchCostReference>2625998</purchCostReference>
         <carrier>BNSF</carrier>
         <vendorType>RAIL</vendorType>
         <carrierTrailerType>53PC</carrierTrailerType>
         <origin>
            <ns2:numberCode>4022</ns2:numberCode>
            <ns2:locAbbr>BNSF</ns2:locAbbr>
            <ns2:address1>3770 EAST WASHINGTON AVENUE</ns2:address1>
            <ns2:city>LOS ANGELES</ns2:city>
            <ns2:stateProvince>CA</ns2:stateProvince>
            <ns2:postalCode>90040</ns2:postalCode>
            <ns2:locType>FDEG</ns2:locType>
            <ns2:numberType>8</ns2:numberType>
            <ns2:timeZoneAbbr>PST</ns2:timeZoneAbbr>
            <ns2:daylightSavingsFlag>true</ns2:daylightSavingsFlag>
         </origin>
         <destination>
            <ns2:numberCode>4040</ns2:numberCode>
            <ns2:locAbbr>CROX</ns2:locAbbr>
            <ns2:address1>NORFOLK SOUTHERN RAILROAD</ns2:address1>
            <ns2:address2>125 COUNTY ROAD</ns2:address2>
            <ns2:city>CROXTON</ns2:city>
            <ns2:stateProvince>NJ</ns2:stateProvince>
            <ns2:postalCode>07307</ns2:postalCode>
            <ns2:locType>FDEG</ns2:locType>
            <ns2:numberType>8</ns2:numberType>
            <ns2:timeZoneAbbr>EST</ns2:timeZoneAbbr>
            <ns2:daylightSavingsFlag>true</ns2:daylightSavingsFlag>
         </destination>
         <stopOff>
            <ns2:stopOffLocation>
               <ns2:numberCode>9996</ns2:numberCode>
               <ns2:stateProvince>DU</ns2:stateProvince>
               <ns2:postalCode>00000</ns2:postalCode>
               <ns2:locType>FDEG</ns2:locType>
               <ns2:numberType>1</ns2:numberType>
            </ns2:stopOffLocation>
         </stopOff>
         <schedDispatchDate>2020-05-22T05:00:00.000Z</schedDispatchDate>
         <estimatedArrivalDate>2020-05-26T00:59:00.000Z</estimatedArrivalDate>
         <billingMethod>RULE</billingMethod>
         <STCCCode>4711110</STCCCode>
         <planNumber>065</planNumber>
         <powerType>1X</powerType>
         <powerOnlyFlag>false</powerOnlyFlag>
      </purchasedCostTripSegment>
      <purchasedCostTripSegment>
         <purchCostReference>2625998</purchCostReference>
         <carrier>NS</carrier>
         <vendorType>RAIL</vendorType>
         <carrierTrailerType>53PC</carrierTrailerType>
         <origin>
            <ns2:numberCode>4061</ns2:numberCode>
            <ns2:locAbbr>NSAU</ns2:locAbbr>
            <ns2:address1>6300 SOUTH INDIANA AVENUE</ns2:address1>
            <ns2:city>CHICAGO</ns2:city>
            <ns2:stateProvince>IL</ns2:stateProvince>
            <ns2:postalCode>60637</ns2:postalCode>
            <ns2:locType>FDEG</ns2:locType>
            <ns2:numberType>8</ns2:numberType>
            <ns2:timeZoneAbbr>CST</ns2:timeZoneAbbr>
            <ns2:daylightSavingsFlag>true</ns2:daylightSavingsFlag>
         </origin>
         <destination>
            <ns2:numberCode>4040</ns2:numberCode>
            <ns2:locAbbr>CROX</ns2:locAbbr>
            <ns2:address1>NORFOLK SOUTHERN RAILROAD</ns2:address1>
            <ns2:address2>125 COUNTY ROAD</ns2:address2>
            <ns2:city>CROXTON</ns2:city>
            <ns2:stateProvince>NJ</ns2:stateProvince>
            <ns2:postalCode>07307</ns2:postalCode>
            <ns2:locType>FDEG</ns2:locType>
            <ns2:numberType>8</ns2:numberType>
            <ns2:timeZoneAbbr>EST</ns2:timeZoneAbbr>
            <ns2:daylightSavingsFlag>true</ns2:daylightSavingsFlag>
         </destination>
         <stopOff>
            <ns2:stopOffLocation>
               <ns2:numberCode>4040</ns2:numberCode>
               <ns2:locAbbr>CROX</ns2:locAbbr>
               <ns2:address1>NORFOLK SOUTHERN RAILROAD</ns2:address1>
               <ns2:address2>125 COUNTY ROAD</ns2:address2>
               <ns2:city>CROXTON</ns2:city>
               <ns2:stateProvince>NJ</ns2:stateProvince>
               <ns2:postalCode>07307</ns2:postalCode>
               <ns2:locType>FDEG</ns2:locType>
               <ns2:numberType>8</ns2:numberType>
               <ns2:timeZoneAbbr>EST</ns2:timeZoneAbbr>
               <ns2:daylightSavingsFlag>true</ns2:daylightSavingsFlag>
            </ns2:stopOffLocation>
         </stopOff>
         <schedDispatchDate>2020-05-22T05:00:00.000Z</schedDispatchDate>
         <estimatedArrivalDate>2020-05-26T01:00:00.000Z</estimatedArrivalDate>
         <billingMethod>LOCAL</billingMethod>
         <STCCCode>4711110</STCCCode>
         <planNumber>045</planNumber>
         <powerType>1X</powerType>
         <powerOnlyFlag>false</powerOnlyFlag>
      </purchasedCostTripSegment>
   </purchasedCost>
   <drivers/>
</tmsTrip>

这是我可以选择多少提取字段: http://ground.fedex.com/schemas/linehaul/trip\" xmlns:ns2=\"http://ground.fedex.com/schemas/linehaul/TMSCommon\"> 购买的线路运输 批准 143642990 129014817 129014817 1 2020-05-22T00:53:21.000Z 928 ANAH 590 E橙索普大道 阿纳海姆 加州 92801 FDEG 1 太平洋标准时间 真的

这是 Splunk 创建的用于选择上述 xml 的正则表达式

^[^\$\n]*\$\d+\.\w+\s+\w+\s+(?P<xmlMessage><\?\w+\s+\w+="\d+\.\d+"\s+\w+="\w+\-\d+"\?>\s+<\w+\s+\w+="\w+://\w+\.\w+\.\w+/\w+/\w+/\w+"\s+\w+:\w+="\w+://\w+\.\w+\.\w+/\w+/\w+/\w+">\s+<\w+>\w+</\w+>\s+<\w+>\w+</\w+>\s+<\w+>\d+</\w+>\s+<\w+>\d+</\w+>\s+<\w+>\d+</\w+>\s+<\w+>\d+</\w+>\s+<\w+>\d+\-\d+\-\d+\w+:\d+:\d+\.\d+\w+</\w+>\s+<\w+>\s+<\w+:\w+>\d+</\w+:\w+>\s+<\w+:\w+>\w+</\w+:\w+>\s+<\w+:\w+>\d+\s+\w+\s+\w+\s+\w+\s+\w+</\w+:\w+>\s+<\w+:\w+>\w+</\w+:\w+>\s+<\w+:\w+>\w+</\w+:\w+>\s+<\w+:\w+>\d+</\w+:\w+>\s+<\w+:\w+>\w+</\w+:\w+>\s+<\w+:\w+>\d+</\w+:\w+>\s+<\w+:\w+>\w+</\w+:\w+>\s+<\w+:\w+>\w+</\w+:\w+>)

那么我可以更改上面的正则表达式以包含整个 xml 吗?

更新 我尝试从 xmlMessage 提取字段中提取一个字段。 xmlMessage 字段在上面。我使用 xpath 命令提取 recordType。将结果放在表格中。这是命令

| xmlkv | xpath field=xmlMessage
"//tmsTrip/recordType" outfield=Origin | table Origin

它没有返回任何结果。此 xpath 命令不适用于最简单的查询。 我做错了什么?

【问题讨论】:

  • 我不熟悉 Splunk,但命名空间元素 (ns2:numberCode) 可能是它的绊脚石。你可以试试这个丑陋的解决方法://tmsTrip/purchasedCost/purchasedCostTripSegment/origin/*[local-name() = 'numberCode']
  • 那仍然没有返回任何结果。我尝试选择像“//tmsTrip/r​​ecordType”这样的父元素之一,它也没有返回任何东西。我不知道 Splunk 是否也必须配置为使用 xpath 命令。
  • 从技术上讲,即使这些元素也在命名空间中(xmlns="http://ground.fedex.com/schemas/linehaul/trip" 就是这样做的),因此 xpath 表达式仍有可能正确评估,只是没有选择您想要的。无论如何,我的知识只延伸到 XPath,所以我只提供可怕的:/*[local-name() = 'tmsTrip']/*[local-name() = 'recordType']。如果这仍然没有返回任何东西,那么我已经超出了我的深度,必须退出。
  • 感谢您的尝试...这是文本文件中的 xml 文件。所以我认为这是 Splunk 特有的

标签: xpath splunk


【解决方案1】:

没有看到其余的事件数据,我无法说明为什么xpath 命令不起作用。

但是,作为一种解决方法,请尝试以下命令,而不是 xmlkvxpath 命令

| rex field=_raw "numberCode>(?<Origin>\d+)</"

这应该适用于混合文本和 xml 事件

【讨论】:

  • 那行不通。我尝试创建一个提取的字段作为 xml 消息。日志语句中的这个 xml 文件很大,我无法选择整个 xml 文件。我尝试将 TRUNCATE = 0 添加到我的本地 props.conf 文件中,但无权更改它。我应该能够创建一个正则表达式语句来精确 xml,但我正在努力解决它。我在上面的原始帖子中添加了内容,以显示 Splunk 为提取部分 xml 文件而创建的内容。如果你擅长正则表达式,你能给我一些指示如何完成正则表达式命令来获取所有的xml吗?
【解决方案2】:
| xmlkv | spath path="tmsTrip.purchasedCost.purchasedCostTripSegment.origin.ns2:numberCode" output=Origin

试试spath

【讨论】:

    【解决方案3】:

    我能够使用 rex 从 xml 中提取数据,并使用 ma​​x_matchmvindex 识别 numberCode 的每个实例 以下是遇到此问题的任何人的示例:

     rex max_match=0 "\<ns2\:numberCode\>(?P<location>[^\<]+)"| eval Segment1_Origin =  mvindex(location, 7)
    

    xml 元素是 ns2:numberCode。它被重命名为位置。 max_match=0 表示无限数量的实例。 mvindex 从零开始。因此位置的第 8 个实例设置为变量 Segment1_origin

    【讨论】:

      猜你喜欢
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多