{"id":14976,"date":"2025-07-08T16:34:31","date_gmt":"2025-07-08T10:34:31","guid":{"rendered":"https:\/\/dtasiagroup.com\/?p=14976"},"modified":"2025-07-08T16:34:31","modified_gmt":"2025-07-08T10:34:31","slug":"parsing-firewall-logs-with-filterx","status":"publish","type":"post","link":"https:\/\/dtasiagroup.com\/vi\/parsing-firewall-logs-with-filterx\/","title":{"rendered":"Parsing firewall logs with FilterX"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-14977 size-full\" src=\"https:\/\/dtasiagroup.com\/wp-content\/uploads\/2025\/07\/6825bef01882a2ed18b129e7_parse-firewal-logs-withaxosyslog-filterx.webp\" alt=\"\" width=\"1960\" height=\"1226\" \/><\/p>\n<p data-start=\"90\" data-end=\"312\">Your SIEM is only as good as the data it ingests. But when firewall logs from major vendors like FortiGate, Palo Alto, and SonicWall arrive incomplete, inconsistent, or malformed, most syslog pipelines struggle to keep up.<\/p>\n<p data-start=\"314\" data-end=\"675\"><strong data-start=\"314\" data-end=\"325\">FilterX<\/strong>, the open-source parsing engine behind <strong data-start=\"365\" data-end=\"378\">AxoSyslog<\/strong>, solves this problem at its core\u2014providing a flexible, scalable way to normalize, enrich, and classify logs before they reach your SIEM. Whether you&#8217;re managing your own pipeline or scaling with <strong data-start=\"574\" data-end=\"585\">Axoflow<\/strong>, FilterX ensures your security data is clean, consistent, and full of context\u2014every time.<\/p>\n<h3 data-start=\"682\" data-end=\"714\"><\/h3>\n<h3 data-start=\"682\" data-end=\"714\"><\/h3>\n<h3 data-start=\"682\" data-end=\"714\">The Common Logging Dilemma<\/h3>\n<p data-start=\"716\" data-end=\"781\">Traditional syslog infrastructures face tricky design trade-offs:<\/p>\n<h4 data-start=\"783\" data-end=\"799\">Option 1:<\/h4>\n<p data-start=\"800\" data-end=\"925\">Send all syslog data to the same port (usually port 514) and sort incoming messages by sender.<br data-start=\"894\" data-end=\"897\" \/>Sounds simple, but it\u2019s not:<\/p>\n<ul data-start=\"927\" data-end=\"1311\">\n<li data-start=\"927\" data-end=\"1045\">\n<p data-start=\"929\" data-end=\"1045\">Many endpoints relay their logs, which can easily obscure the original sender if relays aren\u2019t correctly configured.<\/p>\n<\/li>\n<li data-start=\"1046\" data-end=\"1311\">\n<p data-start=\"1048\" data-end=\"1311\">Worse, many commercial appliances\u2014including firewalls\u2014generate <strong data-start=\"1111\" data-end=\"1138\">invalid syslog messages<\/strong> that are poorly formatted or missing key details like the hostname or timestamp.<br data-start=\"1219\" data-end=\"1222\" \/>This makes sender attribution difficult and forces complex, error-prone parsing later on.<\/p>\n<\/li>\n<\/ul>\n<h4 data-start=\"1313\" data-end=\"1329\">Option 2:<\/h4>\n<p data-start=\"1330\" data-end=\"1440\">Segment syslog traffic by assigning similar devices to dedicated ports. This offers basic classification, but:<\/p>\n<ul data-start=\"1442\" data-end=\"1756\">\n<li data-start=\"1442\" data-end=\"1542\">\n<p data-start=\"1444\" data-end=\"1542\">Every device must be manually configured to send logs to the correct port\u2014an operational headache.<\/p>\n<\/li>\n<li data-start=\"1543\" data-end=\"1642\">\n<p data-start=\"1545\" data-end=\"1642\">You still need to parse messages to clean up inconsistent formats and ensure correct attribution.<\/p>\n<\/li>\n<li data-start=\"1643\" data-end=\"1756\">\n<p data-start=\"1645\" data-end=\"1756\">Misconfigured devices sending to the wrong port may have their logs silently dropped, with no alert or warning.<\/p>\n<\/li>\n<\/ul>\n<h3 data-start=\"1763\" data-end=\"1815\"><\/h3>\n<h3 data-start=\"1763\" data-end=\"1815\"><\/h3>\n<h3 data-start=\"1763\" data-end=\"1815\"><strong data-start=\"1767\" data-end=\"1815\">FilterX: Built for Modern Logging Challenges<\/strong><\/h3>\n<p data-start=\"1817\" data-end=\"2038\">FilterX addresses these problems head-on. It\u2019s a powerful replacement for traditional <strong data-start=\"1903\" data-end=\"1916\">syslog-ng<\/strong> filters, parsers, and rewrite rules, designed to filter, parse, manipulate, and restructure both simple and complex data.<\/p>\n<p data-start=\"2040\" data-end=\"2053\">Key features:<\/p>\n<ul data-start=\"2054\" data-end=\"2432\">\n<li data-start=\"2054\" data-end=\"2102\">\n<p data-start=\"2056\" data-end=\"2102\"><strong data-start=\"2056\" data-end=\"2078\">High-speed parsers<\/strong> for common log formats.<\/p>\n<\/li>\n<li data-start=\"2103\" data-end=\"2200\">\n<p data-start=\"2105\" data-end=\"2200\">Deep integration with routing\u2014route messages based on parsed content or classification results.<\/p>\n<\/li>\n<li data-start=\"2201\" data-end=\"2296\">\n<p data-start=\"2203\" data-end=\"2296\">Exception handling and backtracking in classification trees, with minimal performance impact.<\/p>\n<\/li>\n<li data-start=\"2297\" data-end=\"2432\">\n<p data-start=\"2299\" data-end=\"2432\">Native support for modern, nested formats like <strong data-start=\"2346\" data-end=\"2354\">JSON<\/strong> and <strong data-start=\"2359\" data-end=\"2376\">OpenTelemetry<\/strong>\u2014far beyond what legacy tools like syslog-ng can handle.<\/p>\n<\/li>\n<\/ul>\n<p data-start=\"2434\" data-end=\"2582\">If you\u2019ve used <strong data-start=\"2449\" data-end=\"2462\">syslog-ng<\/strong>\u2019s old <strong data-start=\"2469\" data-end=\"2482\">patterndb<\/strong> engine, think of FilterX as its high-performance, ultra-flexible successor\u2014minus the XML headaches.<\/p>\n<h2><\/h2>\n<h2><\/h2>\n<h2><strong>Examples<\/strong><\/h2>\n<p>Let&#8217;s see some FilterX parsing and classification examples. If you don&#8217;t know FilterX yet, I recommend quickly checking our<a href=\"https:\/\/axoflow.com\/blog\/filterx-introduction\">\u00a0FilterX introduction blog<\/a>\u00a0or the FilterX documentation.<\/p>\n<p>First, we&#8217;ll classify and parse messages for the three commercial firewalls that we&#8217;ve discussed in an<a href=\"https:\/\/axoflow.com\/blog\/siem-data-classification-automation-improve-data-quality-reduce-costs\">\u00a0earlier blog<\/a>: FortiGate, Palo Alto, and SonicWall. Here&#8217;s a sample message for each, along with some message characteristics specific to that firewall that we can use to classify the message.<\/p>\n<p>NOTE: A well-formed syslog message consists of a header and the message body, like this:<\/p>\n<pre class=\"w-code-block\" contenteditable=\"false\"><code class=\"language-htmlbars\"><span class=\"xml\">&lt;<\/span><span class=\"xml\">priority<\/span><span class=\"xml\">&gt;<\/span><span class=\"xml\">timestamp hostname application: message body with info\r\n<\/span><span class=\"xml\">&lt;-----------------header----------------&gt;&lt;----message body-----&gt;<\/span><\/code><button class=\"copy-button\">Copy<\/button><\/pre>\n<p>None of the following messages are<a href=\"https:\/\/axoflow.com\/blog\/fix-syslog-automatically-stop-invalid-data-from-siem\">\u00a0well-formed syslog messages<\/a>.<\/p>\n<h3><\/h3>\n<h3><\/h3>\n<h3><strong>FortiGate parser<\/strong><\/h3>\n<pre class=\"w-code-block\" contenteditable=\"false\"><code class=\"language-javascript\">&lt;165&gt; us-east-1-dc1-a-dmz-fw date=2025-03-26 time=18:41:07Z devname=us-east-1-dc1-a-dmz-fw devid=FGT60D4614044725 logid=0100040704 type=event subtype=system level=notice vd=root logdesc=\"System performance statistics\" action=\"perf-stats\" cpu=2 mem=35 totalsession=61 disk=2 bandwidth=158\/138 setuprate=2 disklograte=0 fazlograte=0 msg=\"Performance statistics: average CPU: 2, memory: 35, concurrent sessions: 61, setup-rate: 2\"<\/code><button class=\"copy-button\">Copy<\/button><\/pre>\n<p>This message begins with an incomplete syslog header (has only\u00a0<code>&lt;priority&gt; hostname<\/code>), followed by space-separated\u00a0<code>key=value<\/code>\u00a0pairs, which repeat the hostname in the\u00a0<code>devname<\/code>\u00a0field and has a\u00a0<code>devid<\/code>\u00a0field followed by a\u00a0<code>logid<\/code>\u00a0field. Let&#8217;s see what a FilterX block for this looks like:<\/p>\n<pre class=\"w-code-block\" contenteditable=\"false\"><code class=\"language-c\"><span class=\"hljs-function\">block <\/span><span class=\"hljs-function\">log<\/span> <span class=\"hljs-function\">parse_fortigate<\/span><span class=\"hljs-function\">()<\/span> {\r\n  filterx {\r\n\t# Check that the message contains the devid= and logid= strings\r\n\tincludes($MSG, \"devid=\") and includes($MSG, \"logid=\");\r\n\r\n\t# Parse the $MSG part of the message as key-value pairs into the key_values object\r\n\tdeclare key_values = parse_kv($MSG);\r\n\r\n\t# Verify that the devid field was present\r\n\tkey_values.devid;\r\n\r\n\t# Set the hostname syslog field to the value of the devname field\r\n\t$HOST = key_values.devname;\r\n\r\n\t# Successfully classified a fortigate message\r\n\t$VENDOR = \"fortinet\";\r\n\t$PRODUCT = \"fortigate\";\r\n\r\n\t# <span class=\"hljs-function\">Set variables <\/span><span class=\"hljs-function\">for<\/span><span class=\"hljs-function\"> Splunk sourcetype <\/span><span class=\"hljs-function\">and<\/span><span class=\"hljs-function\"> index based on the value of the type field\r\n<\/span>\t<span class=\"hljs-function\">switch<\/span> <span class=\"hljs-function\">(key_values.type)<\/span> {\r\n  \tcase \"event\":\r\n    \t  $SPLUNK_SOURCETYPE = \"fortigate_event\";\r\n    \t  $SPLUNK_INDEX = \"netops\";\r\n    \tbreak;\r\n  \tcase \"traffic\":\r\n    \t  $SPLUNK_SOURCETYPE = \"fortigate_traffic\";\r\n    \t  $SPLUNK_INDEX = \"netfw\";\r\n    \tbreak;\r\n  \tcase \"utm\":\r\n    \t  $SPLUNK_SOURCETYPE = \"fortigate_utm\";\r\n    \t  $SPLUNK_INDEX = \"netfw\";\r\n    \tbreak;\r\n  \tcase \"anomaly\":\r\n    \t  $SPLUNK_SOURCETYPE = \"fortigate_anomaly\";\r\n    \t  $SPLUNK_INDEX = \"netfw\";\r\n    \tbreak;\r\n  \tdefault:\r\n    \t  $SPLUNK_SOURCETYPE = \"fortigate_event\";\r\n    \t  $SPLUNK_INDEX = \"netops\";\r\n    \tbreak;\r\n\t};\r\n  };\r\n};<\/code><button class=\"copy-button\">Copy<\/button><\/pre>\n<p>Note: The example above sets the Splunk sourcetype and index based on the content from the message.<\/p>\n<h3><\/h3>\n<h3><\/h3>\n<h3><strong>Palo Alto firewall parser<\/strong><\/h3>\n<p>Here we show a sample for TRAFFIC logs of Palo Alto firewall logs.<\/p>\n<pre class=\"w-code-block\" contenteditable=\"false\"><code class=\"language-javascript\">&lt;165&gt;Mar 26 18:41:06 us-east-1-dc1-b-edge-fw 1,2025\/03\/26 18:41:06,007200001056,TRAFFIC,end,1,2025\/03\/26 18:41:06,192.168.41.30,192.168.41.255,10.193.16.193,192.168.41.255,allow-all,,,netbios-ns,vsys1,Trust,Untrust,ethernet1\/1,ethernet1\/2,To-Panorama,2025\/03\/26 18:41:06,8720,1,137,137,11637,137,0x400000,udp,allow,276,276,0,3,2025\/03\/26 18:41:06,2,any,0,2345136,0x0,192.168.0.0-192.168.255.255,192.168.0.0-192.168.255.255,0,3,0<\/code><button class=\"copy-button\">Copy<\/button><\/pre>\n<p>Palo Alto messages get most of the header right (<code>&lt;priority&gt;timestamp hostname<\/code>),\u00a0<code>&lt;165&gt;Mar 26 18:41:06 us-east-1-dc1-b-edge-fw<\/code>, omits the name of the application, then puts a long list of comma-separated values into the message body. The body begins with a version number (<code>1<\/code>), followed by a timestamp and a serial number.<\/p>\n<pre class=\"w-code-block\" contenteditable=\"false\"><code class=\"language-c\"><span class=\"hljs-function\">block <\/span><span class=\"hljs-function\">log<\/span> <span class=\"hljs-function\">parse_palo_alto<\/span><span class=\"hljs-function\">()<\/span> {\r\n  filterx {\r\n    # Check that the message includes the \"1,\" and \",TRAFFIC,\" <span class=\"hljs-function\">strings\r\n<\/span>    <span class=\"hljs-function\">includes<\/span><span class=\"hljs-function\">($MSG, <\/span><span class=\"hljs-function\">\"1,\"<\/span><span class=\"hljs-function\">)<\/span> <span class=\"hljs-function\">and<\/span> <span class=\"hljs-function\">includes<\/span><span class=\"hljs-function\">($MSG, <\/span><span class=\"hljs-function\">\",TRAFFIC,\"<\/span><span class=\"hljs-function\">)<\/span>;\r\n\r\n    # Names of the columns in TRAFFIC logs\r\n    declare palo_alto_traffic_columns = [\"future_use1\", \"received_time\", \"serial_number\", \"type\", \"log_subtype\", \"version\", \"generated_time\", \"src_ip\", \"dest_ip\", \"src_translated_ip\", \"dest_translated_ip\", \"rule\", \"src_user\", \"dest_user\", \"app\", \"vsys\", \"src_zone\", \"dest_zone\", \"src_interface\", \"dest_interface\", \"log_forwarding_profile\", \"future_use3\", \"session_id\", \"repeat_count\", \"src_port\", \"dest_port\", \"src_translated_port\", \"dest_translated_port\", \"session_flags\", \"protocol\", \"action\", \"bytes\", \"bytes_sent\", \"bytes_received\", \"packets\", \"start_time\", \"elapsed_time\", \"http_category\", \"future_use4\", \"sequence_number\", \"action_flags\", \"src_location\", \"dest_location\", \"future_use5\", \"packets_sent\", \"packets_received\", \"session_end_reason\", \"devicegroup_level1\", \"devicegroup_level2\", \"devicegroup_level3\", \"devicegroup_level4\", \"vsys_name\", \"dvc_name\", \"action_source\", \"src_uuid\", \"dst_uuid\", \"tunnelid_imsi\", \"monitortag_imei\", \"parent_session_id\", \"parent_start_time\", \"tunnel\", \"assoc_id\", \"chunks\", \"chunks_sent\", \"chunks_received\", \"rule_uuid\", \"http2_connection\", \"link_change_count\", \"policy_id\", \"link_switches\", \"sdwan_cluster\", \"sdwan_device_type\", \"sdwan_cluster_type\", \"sdwan_site\", \"dynusergroup_name\", \"xff_ip\", \"src_category\", \"src_profile\", \"src_model\", \"src_vendor\", \"src_osfamily\", \"src_osversion\", \"src_host\", \"src_mac\", \"dst_category\", \"dst_profile\", \"dst_model\", \"dst_vendor\", \"dst_osfamily\", \"dst_osversion\", \"dst_host\", \"dst_mac\", \"container_id\", \"pod_namespace\", \"pod_name\", \"src_edl\", \"dst_edl\", \"hostid\", \"client_serialnumber\", \"src_dag\", \"dst_dag\", \"session_owner\", \"high_res_timestamp\", \"nssai_sst\", \"nssai_sd\", \"subcategory_of_app\", \"category_of_app\", \"technology_of_app\", \"risk_of_app\", \"characteristic_of_app\", \"container_of_app\", \"tunneled_app\", \"is_saas_of_app\", \"sanctioned_state_of_app\", \"offloaded\", \"flow_type\", \"cluster_name\"];\r\n    \r\n    # parse the entire <span class=\"hljs-meta-keyword\">line<\/span>, columns are type specific\r\n    key_values = parse_csv($RAWMSG, columns=palo_alto_traffic_columns);\r\n\r\n    # Verify that the TYPE field contains TRAFFIC\r\n    key_values.type == \"TRAFFIC\";\r\n\r\n    # Successfully classified a palo alto message\r\n    $VENDOR = \"paloalto\";\r\n    $PRODUCT = \"firewall\";\r\n\r\n    # <span class=\"hljs-function\">Set variables <\/span><span class=\"hljs-function\">for<\/span><span class=\"hljs-function\"> Splunk sourcetype <\/span><span class=\"hljs-function\">and<\/span><span class=\"hljs-function\"> index based on the value of the type field\r\n<\/span>    <span class=\"hljs-function\">switch<\/span> <span class=\"hljs-function\">(key_values.type)<\/span> {\r\n      case \"TRAFFIC\":\r\n          $SPLUNK_SOURCETYPE = \"pan:traffic\";\r\n          $SPLUNK_INDEX = \"netfw\";\r\n        break;\r\n      # Add other sourcetypes\/index for other message types\r\n    };\r\n  };\r\n};<\/code><button class=\"copy-button\">Copy<\/button><\/pre>\n<p>Note that Palo Alto firewalls have several different types of log messages in addition to TRAFFIC logs (15+ altogether), and each have their own unique list of columns that are included in the message. Also, the list of columns often changes between upgrades, so you need to check and update your parsers as needed.<\/p>\n<h3><\/h3>\n<h3><\/h3>\n<h3><strong>SonicWall parser<\/strong><\/h3>\n<pre class=\"w-code-block\" contenteditable=\"false\"><code class=\"language-javascript\">&lt;165&gt; id=us-west-1-dc1-a-dmz-fw sn=C0EFE3336C80 time=\"2025-03-26 18:41:01\" fw=192.168.1.239 pri=6 c=1024 gcat=6 m=537 msg=\"Connection Closed\" srcMac=00:50:56:f5:50:27 src=10.237.228.74:54406:X20 srcZone=Trusted natSrc=192.168.1.239:38377 dstMac=00:1a:f0:8b:e0:18 dst=44.190.129.212:123:X2 dstZone=Untrusted natDst=44.190.129.212:123 proto=udp\/ntp sent=152 rcvd=152 spkt=2 rpkt=2 cdur=30250 rule=\"22 (LAN-&gt;WAN)\" n=490872197 fw_action=\"NA\" dpi=0<\/code><button class=\"copy-button\">Copy<\/button><\/pre>\n<p>Begins with a\u00a0<code>&lt;priority&gt;<\/code>\u00a0field, followed by 1 or 2 spaces, and a long list of space-separated key=value pairs. The first such field is the\u00a0<code>id<\/code>\u00a0field, which contains the hostname followed by a serial number field (<code>sn<\/code>). Let&#8217;s see a FilterX block for this:<\/p>\n<pre class=\"w-code-block\" contenteditable=\"false\"><code class=\"language-c\">@include \"scl.conf\"\r\n<span class=\"hljs-function\">block <\/span><span class=\"hljs-function\">log<\/span> <span class=\"hljs-function\">parse<\/span><span class=\"hljs-function\">()<\/span> {\r\n  # Conditionals to go through the custom parsers\r\n  if   { parse_fortigate(); }\r\n  elif { parse_palo_alto(); }\r\n  elif { parse_sonicwall(); };\r\n};\r\nsource s_network {\r\n  default-network-drivers(\r\n\tflags(store-raw-message) # Needed to parse messages that are very much non-syslog compliant, like the Sonicwall messages\r\n  );\r\n};\r\ndestination d_splunk_hec_event {\r\n  splunk-hec-event(\r\n\turl(\"https:\/\/localhost:8088\")\r\n\ttoken(\"70b6ae71-76b3-4c38-9597-0c5b37ad9630\")\r\n\tsourcetype($SPLUNK_SOURCETYPE)\r\n\tindex($SPLUNK_INDEX)\r\n\tdefault-index(\"netops\")\r\n  );\r\n};\r\nlog {\r\n  source(s_network);\r\n  parse();\r\n  destination(d_splunk_hec_event);\r\n};<\/code><button class=\"copy-button\">Copy<\/button><\/pre>\n<h2><\/h2>\n<h2>Combining the blocks<\/h2>\n<p>Let\u2019s create the other parts of the configuration that are needed to use the parsers we\u2019ve created:<\/p>\n<ul role=\"list\">\n<li>A block with\u00a0<code>if-elif<\/code>\u00a0conditionals to group the parsers.<br \/>\nUnlike traditional programming languages, FilterX was purposefully built for such use cases. As a result, these conditionals can be evaluated effectively, and having to backtrack when a parser doesn\u2019t match (drop any failed or partial results and try the next conditional on the original message) has only a minor performance impact.<\/li>\n<li>A generic network source to receive the messages.<\/li>\n<li>A Splunk destination that will use the sourcetype and index set in the parsers, and<\/li>\n<li>a log path to tie all these together.<\/li>\n<\/ul>\n<h2><\/h2>\n<h2><\/h2>\n<h2><strong>Are we done yet?<\/strong><\/h2>\n<p>I think the above parsing examples highlight a few important things:<\/p>\n<ul role=\"list\">\n<li>With the right tool (for example, AxoSyslog), message parsing and classification can be done effectively.<\/li>\n<li>However, even the best tool requires significant know-how about:\n<ul role=\"list\">\n<li>the tool itself,<\/li>\n<li>the specific log messages you need to process, and also a<\/li>\n<li>good overview of the parsers you&#8217;ve already created to avoid overlaps and misclassification of similar messages, and also to be able to maintain them (because the message formats might change after a product upgrade).<\/li>\n<\/ul>\n<\/li>\n<li>Creating and maintaining the parsers for many applications or devices is a complex and time-consuming effort, especially for high-volume message sources that need performance optimizations (like firewalls).<\/li>\n<\/ul>\n<p>If you don\u2019t have the resources to tackle the problem, an alternative is to outsource these efforts to a product dedicated to managing your security data pipeline that includes optimized message parsing for over a hundred ubiquitous products, like\u00a0Axoflow Platform. That way you solve your data parsing issues, and can also:<\/p>\n<ul role=\"list\">\n<li>Deliver\u00a0high-quality, optimized data\u00a0to your SIEM<\/li>\n<li>Gain insight into the\u00a0status of your data pipeline to avoid losing data<\/li>\n<li>Remove noise and redundant data\u00a0to cut your SIEM and storage costs<\/li>\n<\/ul>\n<h2><\/h2>\n<h2><\/h2>\n<h2><strong>Summary<\/strong><\/h2>\n<p>Parsing messages and other security data is still an ongoing issue for organizations. The open source\u00a0FilterX data processing engine of AxoSyslog\u00a0provides an effective way to parse and classify your data, and is a great choice if you want to build a classification database. However, creating and maintaining such a database requires significant time, effort, and know-how. If your organization prefers, you can outsource this to\u00a0Axoflow Platform, our security data curation pipeline.<\/p>\n<p>&nbsp;<\/p>\n<p><strong>About DT Asia<\/strong><\/p>\n<p>DT Asia began in 2007 with a clear mission to build the market entry for various pioneering IT security solutions from the US, Europe and Israel.<\/p>\n<p>Today, DT Asia is a regional, value-added distributor of cybersecurity solutions providing cutting-edge technologies to key government organisations and top private sector clients including global banks and Fortune 500 companies. We have offices and partners around the Asia Pacific to better understand the markets and deliver localised solutions.<\/p>\n<p><strong>\u00a0<\/strong><\/p>\n<p><strong>How we help<\/strong><\/p>\n<p>If you need to know more about parsing firewall logs with FilterX, you\u2019re in the right place, we\u2019re here to help! DTA is Axoflow\u2019s distributor, especially in Singapore and Asia, our technicians have deep experience on the product and relevant technologies you can always trust, we provide this product\u2019s turnkey solutions, including consultation, deployment, and maintenance service.<\/p>\n<p>Click here and here and here to know more:\u00a0<a href=\"https:\/\/dtasiagroup.com\/axoflow\/\">https:\/\/dtasiagroup.com\/axoflow\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Your SIEM is only as good as the data it ingests. But when firewall logs from major vendors like FortiGate, Palo Alto, and SonicWall arrive incomplete, inconsistent, or malformed, most syslog pipelines struggle to keep up.<\/p>","protected":false},"author":11,"featured_media":14977,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[56],"tags":[],"class_list":["post-14976","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-articles"],"_links":{"self":[{"href":"https:\/\/dtasiagroup.com\/vi\/wp-json\/wp\/v2\/posts\/14976","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dtasiagroup.com\/vi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dtasiagroup.com\/vi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dtasiagroup.com\/vi\/wp-json\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/dtasiagroup.com\/vi\/wp-json\/wp\/v2\/comments?post=14976"}],"version-history":[{"count":2,"href":"https:\/\/dtasiagroup.com\/vi\/wp-json\/wp\/v2\/posts\/14976\/revisions"}],"predecessor-version":[{"id":14980,"href":"https:\/\/dtasiagroup.com\/vi\/wp-json\/wp\/v2\/posts\/14976\/revisions\/14980"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dtasiagroup.com\/vi\/wp-json\/wp\/v2\/media\/14977"}],"wp:attachment":[{"href":"https:\/\/dtasiagroup.com\/vi\/wp-json\/wp\/v2\/media?parent=14976"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dtasiagroup.com\/vi\/wp-json\/wp\/v2\/categories?post=14976"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dtasiagroup.com\/vi\/wp-json\/wp\/v2\/tags?post=14976"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}