<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>парсинг лога - Qlik Sense - Обучение, учебник, онлайн курс</title>
	<atom:link href="https://qliksense.ivan-shamaev.ru/tag/%D0%BF%D0%B0%D1%80%D1%81%D0%B8%D0%BD%D0%B3-%D0%BB%D0%BE%D0%B3%D0%B0/feed/" rel="self" type="application/rss+xml" />
	<link>https://qliksense.ivan-shamaev.ru/tag/парсинг-лога/</link>
	<description>Qlik Sense на русском языке. Пошаговые уроки для изучения Клик Сенс</description>
	<lastBuildDate>Fri, 08 Jan 2021 12:28:51 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.1</generator>

<image>
	<url>https://qliksense.ivan-shamaev.ru/wp-content/uploads/2018/07/QlikSense_ICON2-150x150.png</url>
	<title>парсинг лога - Qlik Sense - Обучение, учебник, онлайн курс</title>
	<link>https://qliksense.ivan-shamaev.ru/tag/парсинг-лога/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Пример парсинга логов без фиксированных разделителей</title>
		<link>https://qliksense.ivan-shamaev.ru/example-parsing-logs-txt-files/</link>
					<comments>https://qliksense.ivan-shamaev.ru/example-parsing-logs-txt-files/#respond</comments>
		
		<dc:creator><![CDATA[qliksense-expert]]></dc:creator>
		<pubDate>Fri, 08 Jan 2021 12:22:54 +0000</pubDate>
				<category><![CDATA[Qlik Sense Блог]]></category>
		<category><![CDATA[qlik sense script]]></category>
		<category><![CDATA[qlik sense script advanced level]]></category>
		<category><![CDATA[qlik sense парсинг]]></category>
		<category><![CDATA[парсинг лога]]></category>
		<category><![CDATA[парсинг строк]]></category>
		<guid isPermaLink="false">https://qliksense.ivan-shamaev.ru/?p=2480</guid>

					<description><![CDATA[<p>В этой статье я приведу пример скрипта, который я использовал для парсинга логов своих сайтов с хостинга. Вот пример нескольких строк из лога access.log: qliksense.ivan-shamaev.ru 95.55.137.247 - - [06/Jan/2021:00:01:11 +0300] "GET /feed/ HTTP/1.1" 304 - "-" "FeedDemon/4.5 (http://www.feeddemon.com/; Microsoft Windows)" 242702 149999:66666 qliksense.ivan-shamaev.ru 213.87.161.129 - - [06/Jan/2021:00:01:11 +0300] "GET /sas-cpm-activity-based-costing-and-activity-based-budgeting/<a class="moretag" href="https://qliksense.ivan-shamaev.ru/example-parsing-logs-txt-files/"> Читать дальше&#8230;</a></p>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/example-parsing-logs-txt-files/">Пример парсинга логов без фиксированных разделителей</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>В этой статье я приведу пример скрипта, который я использовал для парсинга логов своих сайтов с хостинга.</p>
<p>Вот пример нескольких строк из лога access.log:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">qliksense.ivan-shamaev.ru 95.55.137.247 - - [06/Jan/2021:00:01:11 +0300] "GET /feed/ HTTP/1.1" 304 - "-" "FeedDemon/4.5 (http://www.feeddemon.com/; Microsoft Windows)" 242702 149999:66666
qliksense.ivan-shamaev.ru 213.87.161.129 - - [06/Jan/2021:00:01:11 +0300] "GET /sas-cpm-activity-based-costing-and-activity-based-budgeting/ HTTP/1.1" 200 291311 "https://qliksense.ivan-shamaev.ru/" "Mozilla/5.0 (Linux; Android 9; Redmi Note 8 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.101 Mobile Safari/537.36" 530205 336666:109999
qliksense.ivan-shamaev.ru 109.254.191.1 - - [06/Jan/2021:00:02:01 +0300] "POST /wp-admin/admin-ajax.php HTTP/1.1" 200 2 "https://qliksense.ivan-shamaev.ru/doing-swot-analysis/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 OPR/73.0.3856.284" 274095 149999:83333</pre>
<p>Вот пример строк из error.log:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">[Wed Jan 06 17:56:45 2021] [error] [client 176.31.246.76:23467] AH01797: client denied by server configuration: /homeenv/useradmin/qliksense.ivan-shamaev.ru/wp-login.php, referer http://qliksense.ivan-shamaev.ru/</pre>
<p>Логи лежат в нескольних директориях. Поэтому я использую inline таблицу для настройки скрипта, откуда грузить логи. Итак вот код парсинга, в котором я вытаскиваю нужные мне параметры:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">// Директории
DirList:
Load * Inline [
    DirectoryName
    ivan-shamaev.ru
    qliksense.ivan-shamaev.ru
];

// access.log
For iRow = 0 to NoOfRows('DirList') - 1

    LET vDirectoryName = Peek('DirectoryName',$(iRow),'DirList');

    For Each vFile in FileList('lib://WebSitesLogs/$(vDirectoryName)/*.access.log*')
    
        Trace &gt;&gt;&gt; LOAD FILE: $(vFile);
        
        [TEMP access.log]:
        LOAD
        	Distinct
            "@1:n"		As [Initial Access Log Text]
        FROM [$(vFile)]
        (fix, codepage is 28591, no labels);
        
        Trace --------------------------;

    Next

Next iRow;

//==========================================

SET vSubStringSettingsBot = '''*bot*''';
SET vSubStringSettingsWordPress = '''*wordpress*''';
SET vSubStringSettingsPython = '''*python*''';
SET vSubStringSettingsSocialNetAndSearchers = '''*vk.com*'',''*facebook.com*'',''*mail.ru*''';
SET vSubStringSettingsNuclei = '''*nuclei*'',''nuclei*''';


Qualify *;

[AL]:
Load
    RowNo()											As RowID,
    *,
    SubField([ResponseText],' ',1)								As [Response Code],
    SubField([Type of Request Full Text],' ',1)							As [Type of Request],
    SubField([Type of Request Full Text],' ',2)							As [URL Request],
    Pick(
    	RangeSum(WildMatch(
                    lower([Request Details]),
                        '*bot*',
                        '*wordpress*',
                        '*python*',
                        '*vk.com*','*facebook.com*','*mail.ru*',
                        '*nuclei*'),
                1),
        'Indefined',
        'Bot',
        'WordPress',
        'Python',
        'Social Network &amp; Search Engines','Social Network &amp; Search Engines','Social Network &amp; Search Engines',
        'Nuclei'
        )									As [Mannual Category of Request]
;
Load
    [Initial Access Log Text],
    [Web Site Name],
    [IP],
    [TimeStamp],
    Date(Floor(Date#(Left([TimeStamp],11),'DD/MMM/YYYY')))			As Date,
    Time(Time#(Trim(Mid([TimeStamp],13,8)),'hh:mm:ss'))				As [Time],
    trim(replace(SubField([Second Part Of Text],'" ',1),'"',''))		As [Type of Request Full Text],
    trim(replace(SubField([Second Part Of Text],'" ',2),'"',''))		As [ResponseText],
    trim(replace(SubField([Second Part Of Text],'" ',3),'"',''))		As [Request Details],
    trim(replace(SubField([Second Part Of Text],'" ',4),'"',''))		As [Others 1]
;
Load
    [Initial Access Log Text],
    replace(SubField([Initial Access Log Text],' ',1),'www.','')		As [Web Site Name],
    SubField([Initial Access Log Text],' ',2) 					As [IP],
    TextBetween([Initial Access Log Text],'[',']')				As [TimeStamp],
    Trim(Mid([Initial Access Log Text],
    	index([Initial Access Log Text],']')+1))				As [Second Part Of Text]
Resident [TEMP access.log];

Unqualify *;

Drop Table [TEMP access.log];

// error.log
For iRow = 0 to NoOfRows('DirList') - 1

    LET vDirectoryName = Peek('DirectoryName',$(iRow),'DirList');

    For Each vFile in FileList('lib://WebSitesLogs/$(vDirectoryName)/*.error.log*')
    
        Trace &gt;&gt;&gt; LOAD FILE: $(vFile);
        
        [TEMP error.log]:
        LOAD
            FileName()		As [File Name],
            "@1:n"			As [Initial Error Log Text]
        FROM [$(vFile)]
        (fix, codepage is 28591, no labels);
        
        Trace --------------------------;

    Next

Next iRow;


Qualify *;

  [EL]:
  Load
      RowNo()													As RowID,
      *,
      SubField([IP Port],':',1)											As IP,
      SubField([IP Port],':',2)											As Port
  ;
  Load
      *,
      Date(Floor(Date#(Mid([TimeStamp Text],5,6)&amp;' '&amp;Right([TimeStamp Text],4),'MMM DD YYYY')))			As Date,
      Time(Time#(Mid([TimeStamp Text],12,8),'hh:mm:ss'))							As Time,
      SubField([Client and IP],' ',1)										As Client,
      SubField([Client and IP],' ',2)										As [IP Port],
      SubField([Other Text],':',1)										As [Type Error],
      SubField(SubField([Other Text],':',2),' (',1)								As [Type Details Error]
  ;
  Load
      left([File Name],index([File Name],'error.log')-2)							As [Web Site],
      [Initial Error Log Text],
      replace(replace(SubField([Initial Error Log Text],'] ',1),'[',''),']','')		As [TimeStamp Text],
      replace(replace(SubField([Initial Error Log Text],'] ',2),'[',''),']','')		As [Type of message],
      replace(replace(SubField([Initial Error Log Text],'] ',3),'[',''),']','')		As [Client and IP],
      replace(replace(SubField([Initial Error Log Text],'] ',4),'[',''),']','')		As [Other Text]
  Resident [TEMP error.log];

Unqualify *;

Drop Table [TEMP error.log];</pre>
<p>В приведенном выше коде есть пример сложного парсинга, определение даты из строки, разложения строки лога с помощью различных функций, таких как:</p>
<ul>
<li>SubField</li>
<li>TextBetween</li>
</ul>
<p>Сообщение <a href="https://qliksense.ivan-shamaev.ru/example-parsing-logs-txt-files/">Пример парсинга логов без фиксированных разделителей</a> появились сначала на <a href="https://qliksense.ivan-shamaev.ru">Qlik Sense - Обучение, учебник, онлайн курс</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://qliksense.ivan-shamaev.ru/example-parsing-logs-txt-files/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
