Webサービス:tomcatアクセスログ分析ストレージ


最近、データ分析チームはtomcatのアクセスログを取得してデータ分析を行う必要があり、ブロガーも醤油隊員の一人だ.プロジェクトが完了した後、小博主はプロセス全体を以下のステップに最適化した(データ需要分析なし、データフィルタ分類整理、可視化インタフェース表示、UIプロセス).
注意:本文は主に全体の過程の構想を分析して、プロジェクトの白に1つのプロジェクトが大体どのようなステップを必要とするかを知らせます
1:単純なデータフィルタ
2:データ洗浄
3:データベースストレージ
4:全自動化プロセスの実現
一:データフィルタ
一般的なtomcatサービスはLinuxサーバの下に置かれているので、本稿ではLinuxサーバで簡単に説明します.
***@***:/home/suitang/tomcat/logs# pwd
/home/suitang/tomcat/logs
***@***:/home/suitang/tomcat/logs# ls
...
catalina.2019-06-08.log      localhost.2019-06-17.log
catalina.2019-06-09.log      localhost.2019-06-18.log
catalina.2019-06-10.log      localhost.2019-06-19.log
...
localhost.2019-06-07.log     localhost_access_log.2019-06-18.txt
localhost.2019-06-08.log     localhost_access_log.2019-06-19.txt
localhost.2019-06-09.log     manager.2019-06-06.log
localhost.2019-06-10.log     wechatlog.txt

tomcatのログファイルでは、6月14日のアクセスを例に挙げます.
essuportとCCCCltdを含むデータのフィルタリング
cat localhost_access_log.2019-06-14.txt |grep essupport |grep CCCCltd

フィルタされたファイルは
...    ...
192.168.1.253 - - [14/Jun/2019:16:58:11 +0800] "POST /essupport/CCCCltdAction?method=query_bool2 HTTP/1.0" 200 9315
192.168.1.253 - - [14/Jun/2019:16:59:53 +0800] "POST /essupport/CCCCltdAction?method=query_bool6 HTTP/1.0" 200 11191
192.168.1.253 - - [14/Jun/2019:16:59:55 +0800] "POST /essupport/CCCCltdAction?method=query_bool2 HTTP/1.0" 200 12002
192.168.1.253 - - [14/Jun/2019:16:59:55 +0800] "POST /essupport/CCCCltdAction?method=query_bool2 HTTP/1.0" 200 9316
192.168.1.253 - - [14/Jun/2019:17:15:45 +0800] "POST /essupport/CCCCltdAction?method=query_bool2 HTTP/1.0" 200 10458
...    ...

今回の分析チームで主に必要なのは【】のファイル(すなわち時間)、リクエスト方式(すなわちPOST/GET)
小ブロガーのヒント:実際にはそう簡単ではなく、プロセスを簡略化するために読者に理解しやすくするために簡略化されています.
フィルタされたファイルをtomcat_に保存log.txtファイル内
cat localhost_access_log.2019-06-16.txt |grep essupport |grep CCCCltd > tomcat_log.txt

これで.ファイルフィルタが完了しました.
二:データ洗浄
上記のフィルタファイル(tomcat_log.txt)をローカルデスクトップにドロップダウンします(pythonを使用して簡単に洗浄する必要があるため、ブロガーはPyCharmプログラミングideaを使用します)
時間ファイルとリクエスト方法が必要です
では、
file_log = open('C:/Users/Administrator/Desktop/tomcat_log.txt')
logdate1 = []        #      
request1 = []       #        


for i in file_log:
    #  m               
    m=0
    for n in i.split():
        #          
        m=m+1
        #4-5  :  、  
        if m == 4 :
            str_date = n
        #      logdate   
        if m == 4:
            logdate1.append(str_date)
         #6-8  :    (post,get)、  、  
        if m == 6 :
            str_re = n
        if m == 7 :
            str_re = str_re +' '+ n
        if m == 8 :
            str_re = str_re +" "+ n
        #        request1   (     “”  ,       SQL    ,           ,    pymysql     ,      ,              )
        if m == 8:
            request1.append(str_re)

上記のコードを使用して、2つのリストを取得します.
①: logdate 1リスト要素
['[14/Jun/2019:09:18:10', '[14/Jun/2019:09:18:12', '[14/Jun/2019:09:18:13', '[14/Jun/2019:11:15:26',...  ...]

使用するsplit()関数のため、到着時間:[14/Jun/2019 9:09:18:10標準時間フォーマットファイルに合わないように見えます.
②:request1
['"POST /essupport/CCCCltdAction?method=query_bool6 HTTP/1.0"', '"POST /essupport/CCCCltdAction?method=query_bool2 HTTP/1.0"',...  ...]

requestフィールドも奇抜です:“POST......HTTP/1.0”の形式で、後文はまだデータベースに保存する必要があるため、二重引用符はSQL注入の問題を引き起こす可能性があって記憶に失敗して、私達はまた得たデータに対して更に洗浄する必要があります
  • 深さ洗浄
  • logdate 1データをタイムスタンプに変更してデータ分析チームの後続分析を容易にする
    request 1のリストデータの二重引用符を削除し、格納によるエラーを防止
    logdate1:
    import time
    #             
    logdate =[]
    for i in logdate1:
        b = time.mktime(time.strptime(i, "[%d/%b/%Y:%H:%M:%S"))
        logdate.append(b)

    request1:
    #  request  request1     SQL    
    request = []
    for i in request1:
        #  replace  “”
        request.append(i.replace('"',''))

    三:データベースストレージ
    データベースの作成(プロシージャ省略)
    pymysqlテンプレートのインポート
    import pymysql
    for i in range(logdate.__len__()):
        #        
        db = pymysql.connect("localhost", "root", "123asd123asd",
                             "filter")  # (    、  、  、    )
        #    cursor()            cursor
        cursor = db.cursor()
        # sql  
        #logdate[i],request[i],uid[i],id[i]
        sql = 'INSERT INTO tomcat_log (logdate,request) VALUES ("%s","%s")'%(int(logdate[i]), request[i])
        try:
            #    execute()       SQL   
            cursor.execute(sql)
            #         
            db.commit()
        except:
            #          
            db.rollback()
            #        
            db.close()

    tomcatを閉じるlog.txtファイル
    #           
    file_log.close()

    最後に、上記pythonコードを次のように整理します.
    import pymysql
    import time
    
    file_log = open('C:/Users/Administrator/Desktop/tomcat_log.txt')
    logdate1 = []        #      
    request1 = []       #        
    
    
    for i in file_log:
        #  m               
        m=0
        for n in i.split():
            #          
            m=m+1
            #4-5  :  、  
            if m == 4 :
                str_date = n
            #      logdate   
            if m == 4:
                logdate1.append(str_date)
             #6-8  :    (post,get)、  、  
            if m == 6 :
                str_re = n
            if m == 7 :
                str_re = str_re +' '+ n
            if m == 8 :
                str_re = str_re +" "+ n
            #        request1   (     “”  ,       SQL    ,           ,    pymysql     ,      ,              )
            if m == 8:
                request1.append(str_re)
    
    #  request  request1     SQL    
    request = []
    for i in request1:
        #  replace  “”
        request.append(i.replace('"',''))
    
    #             
    logdate =[]
    for i in logdate1:
        b = time.mktime(time.strptime(i, "[%d/%b/%Y:%H:%M:%S"))
        logdate.append(b)
    
    for i in range(logdate.__len__()):
        #        
        db = pymysql.connect("localhost", "root", "123asd123asd",
                             "num")  # (    、  、  、    )
        #    cursor()            cursor
        cursor = db.cursor()
        # sql  
        #logdate[i],request[i],uid[i],id[i]
        sql = 'INSERT INTO tomcat_log (logdate,request) VALUES ("%s","%s")'%(int(logdate[i]), request[i])
        try:
            #    execute()       SQL   
            cursor.execute(sql)
            #         
            db.commit()
        except:
            #          
            db.rollback()
            #        
            db.close()
    #           
    file_log.close()
    
    

    四:全自動化プロセスの実現
    以上の3つのステップは、私たちの簡単なデータのフィルタリングとストレージを完了しましたが、毎回上記の作業を繰り返したり、人為的に上記のプロセスを実行したりするのは、かなり塩漬けの魚の行為なので、私たちは上記のプロセスをすべてコンピュータに渡さなければなりません.
    1:ローカルPyCharmファイルをサーバーにアップロードする
    2:データフィルタ処理をスクリプトとしてまとめる(shellスクリプト名tomcat_log.sh、場所:/home/hadoop/filter):
    #!/bin/bash
    #        
    rm -f /home/hadoop/filter/localhost_access_log*
    #  tomcat   log filter   
    cp `find /home/suitang/tomcat/logs/ -mtime -1 | grep localhost_access_log ` /home/hadoop/filter/
    #          
    cd /home/hadoop/filter/
    #       tomcat_log.txt   
    cat localhost_access_log* | grep essupport | grep CCCCltd > tomcat_log.txt
    

    tomcatを手に入れたlog.txtファイルの後、pythonでデータを洗浄するコーナーに入りました
    アップロードしたpythonファイルを適切な場所に配置します(openファイルのパスを変更することに注意してください.linuxの下にはC:/***/**パスはありません)
    3:python_tomcat(PyCharmが作成したpythonプロジェクト)は/home/hadoop/filterの下に置かれています
    ***@***:/home/hadoop/filter# pwd
    /home/hadoop/filter
    ***@***:/home/hadoop/filter# ls
    localhost_access_log.2019-06-17.txt  python_tomcat  tomcat_log.txt
    localhost_access_log.2019-06-18.txt  tomcat_log.sh

    これで、/home/hadoop/filterファイルにpython_が含まれます.tomcat.py/tomcat_log.txt/tomcat_log.shファイル
    注意:1-pythonファイルの下のパスを変更する2-後続のファイル権限によるエラーを防止するために、filterファイル全体の権限を777権限に設定できます.
    権限の変更
    ***@***:/home/hadoop/filter# cd ..
    ***@***:/home/hadoop# chmod -R 777 filter/
    

    pythonでのファイルパスの変更
    root@stubuntu:/home/hadoop# cd filter/python_tomcat/
    root@stubuntu:/home/hadoop/filter/python_tomcat# vim tomcat_log.py
    
    #!/usr/bin/python3
    import pymysql
    import time
    
    file_log = open('/home/hadoop/filter/tomcat_log.txt')
    logdate1 = []        #      
    request1 = []       #        
    ...  ...

    今:全体の過程は実は2つのステップです
    一:/home/hadoop/filter下のtomcat_を実行するlog.sh
    二:/home/hadoop/filter/python_の実行tomcatの下のtomcat_log.py
    上記2つのファイルをcrontab計画タスクに追加すると、全自動化プロセスが完了します.
    終わりだ!