我有一个自定义日志文件,其中包含纯文本和xml标记。我如何在单独的字段中捕获这些。这是它的样子: 1/10/2017 4:16:35 AM: 抛出的错误是: 没有错误
发送的请求是: SCEO415154712
收到的回复是: SCEO4151547trueTBAfalse7169-1TBAfalse2389-1
1/10/2017 4:16:35 AM :
Error thrown is:
No Error
*************************************************************************
Request sent is:
<InventoryMgmtRequest xmlns="http://www.af.com/Ecommerce/Worldwide/AvailabilityService/Schemas/InventoryMgmtRequest"><ns0:MsgHeader MessageType="FIXORD" MsgDate="10.01.2017 04:16:32" SystemOfOrigin="ISCS_DE" CommunityID="SG888" xmlns:ns0="http://www.av.com/Ecommerce/Worldwide/AvailabilityService/Schemas/InventoryMgmtRequest"><ns0:OrderID>SCEO4151547</ns0:OrderID><ns0:ReservationID></ns0:ReservationID><ns0:CRD></ns0:CRD></ns0:MsgHeader><ns0:MsgBody xmlns:ns0="http://www.ab.com/Ecommerce/Worldwide/AvailabilityService/Schemas/InventoryMgmtRequest"><ns0:Product Sku="CH562EE" Qty="1" IsExpress="false" IsTangible="true" Region="EMEA" Country="DE"><ns0:ProdType></ns0:ProdType><ns0:LineItemNum>1</ns0:LineItemNum><ns0:JCID></ns0:JCID></ns0:Product><ns0:Product Sku="CH563EE" Qty="1" IsExpress="false" IsTangible="true" Region="EMEA" Country="DE"><ns0:ProdType></ns0:ProdType><ns0:LineItemNum>2</ns0:LineItemNum><ns0:JCID></ns0:JCID></ns0:Product></ns0:MsgBody></InventoryMgmtRequest>
*************************************************************************
Response received is:
<ns0:InventoryMgmtResponse xmlns:ns0="http://www.ad.com/Ecommerce/Worldwide/AvailabilityService/Schemas/InventoryMgmtResponse"><ns0:MsgHeader MsgDate="10.01.2017 04:16:32" MessageType="FIXORD"><ns0:OrderID>SCEO4151547</ns0:OrderID><ns0:ReservationID /><ns0:ReadyToRelease>true</ns0:ReadyToRelease></ns0:MsgHeader><ns0:MsgBody><ns0:Product SKU="CH562EE" LSPSKU="9432GFT" OutOfStock="false" FulfillmentSite="00ZF" SKUExist="true" Region="EMEA" Country="DE" IsTangible="true"><ns0:EDD>TBA</ns0:EDD><ns0:FutureUsed>false</ns0:FutureUsed><ns0:CurrentQty>7169</ns0:CurrentQty><ns0:FutureQty>-1</ns0:FutureQty></ns0:Product><ns0:Product SKU="CH563EE" LSPSKU="9432GFU" OutOfStock="false" FulfillmentSite="00ZF" SKUExist="true" Region="EMEA" Country="DE" IsTangible="true"><ns0:EDD>TBA</ns0:EDD><ns0:FutureUsed>false</ns0:FutureUsed><ns0:CurrentQty>2389</ns0:CurrentQty><ns0:FutureQty>-1</ns0:FutureQty></ns0:Product></ns0:MsgBody></ns0:InventoryMgmtResponse>
*************************************************************************
&#13;
另外,我不想在我的grok字段中捕获行分隔符(最后一行是****)。
答案 0 :(得分:0)
我担心这里没有简单的答案。 Logstash和其他日志处理工具逐行工作,每一行都是一个事件。如果您的事件跨越多行,您可以使用multiline编解码器,这是非常强大的,但根据我的经验,您最好尝试在源上将日志记录到单行,这使得它变得如此简单编写模式并使过程可靠地运行。
您在这里遇到的问题很多,但是,例如,如果您的某条消息(通过TCP发送)由于某种原因重新传输或者简单地(通过UDP发送)丢失,您的模式将作为消息的一部分而中断logstash期待不存在。
我认为你能做的最好的事情是尝试更改日志记录过程,将每个事件保存为一行文件。大多数日志工具应该允许使用正确的配置选项。理想情况下,让您的应用程序以json格式登录(假设您正在处理日志以将其保存在elasticsearch中),这将涉及logstash服务器上处理这些日志的最低开销(因为elasticsearch以json格式保存它们)。您需要做的就是将每个事件/日志行传递给json过滤器,字段由您的应用程序为其提供的名称生成。