質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.34%

サーバー移行したバッチ処理がうまく動かない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 343

score 9

前提・実現したいこと

centos 6で動いていた配信メルマガの短縮urlのリダイレクト処理、およびクリック・開封率を解析するバッチ処理を行う機能を
サーバー移行にして動作検証をしております。
下記の流れで、処理を行うのですが、①②ともに動いていない状況です。同ディレクトリ内にあるリダイレクト処理 (PHP)は動いております。
PrivateTmpはfalse、SElinuxはDisabledです。また、httpd、crondの再起動も行っています。
パーミッションはもともとの本番サーバーと同様にしてあるので、問題ないかと思います。
/home/xxx/web/log/error.logには特にエラーは出ていないです。

他に考えられる原因はありますでしょうか。

①/home/xxx/web/log/access.log-日付 ファイルにログを記載
②/tmp/click_log_日付.csv ファイルにログをCSV化
③csvからデータをmysqlのDBに保存

該当のソースコード

#crontab
#クリックカウント解析(5時)
32 01 * * * /bin/bash /home/xxx/web/analysis/scripts/parse_click_log.sh staging >> /home/xxx/web/log/click/batch.log 2>&1
#parse_click_log.sh
#DB_CONN="$DB_BIN -S $DB_SOCK -u$DB_USER -p$DB_PASSWORD"
DB_CONN="$DB_BIN -h$DB_HOST -P$DB_PORT -u$DB_USER -p$DB_PASSWORD"
AGODAY="$(date +"%Y%m%d" --date="1 days ago")"
FILEDAY="$(date +"%Y%m%d")"
TODAY="$(date +"%Y-%m-%d")"
APACHE_LOG=${APACHE_LOG_PATH}/access.log-${FILEDAY}
TMP_LOG_FILE=/tmp/click_log_${FILEDAY}.csv

rm -f $TMP_LOG_FILE
touch $TMP_LOG_FILE

### read apache log
echo "`date` read apache log"
while read line; do
    delivery_mail_id=`echo $line | grep 'GET /c/' | awk -F'"' '{print $4}' | tr '/' ' ' | awk '{print $3"\t"$4"\t"}'`
    if [ -n "$delivery_mail_id" ] && [ "z$delivery_mail_id" != 0 ]; then
        log_at=`echo $line | awk -F'"' '{print $2"\t"}'`
        ua=`echo $line | awk -F'"' '{print $6"\t"}'`
        echo "${log_at}${ua}${delivery_mail_id}" >> $TMP_LOG_FILE
    fi
done < $APACHE_LOG

### load apache log into click_log tbl
sql_cmd="LOAD DATA LOCAL INFILE '${TMP_LOG_FILE}' INTO TABLE click_log FIELDS TERMINATED BY '\t'  (@col1,@col2,@col3,@col4) set clicked_at=@col1,ua=@col2,delivery_mail_id=@col4,short_url=@col3,is_active=1,created_at=NOW();"
#$DB_CONN -D $DB_NAME_LOG -e "${sql_cmd}"
echo "`date` load apache log into click_log tbl"
for((i=1;i<=5;i+=1)); do
    $DB_CONN -D $DB_NAME_LOG -e "${sql_cmd}"
    if [ "z$?" == "z0" ]; then
        break
    fi
    echo "`date` fail $i, sleep 10s and update again"
    sleep 10
done

### update mail_id, email, url, mail_type
sql_cmd="UPDATE ${DB_NAME_LOG}.click_log, ${DB_NAME_MAIL}.delivery_mail, ${DB_NAME_MAIL}.mail_url, ${DB_NAME_MAIL}.url_master SET click_log.email = delivery_mail.email, click_log.mail_id = delivery_mail.mail_id ,click_log.mail_type=mail_url.mail_type,click_log.url=url_master.url WHERE click_log.delivery_mail_id = delivery_mail.delivery_mail_id AND mail_url.short_url=click_log.short_url AND url_master.url_id = mail_url.url_id AND click_log.created_at >= '${TODAY} 00:00:00';"
#$DB_CONN -e "${sql_cmd}"
echo "`date` update mail_id, email, url, mail_type"
for((i=1;i<=5;i+=1)); do
    $DB_CONN -e "${sql_cmd}"
    if [ "z$?" == "z0" ]; then
        break
    fi
    echo "`date` fail $i, sleep 10s and update again"
    sleep 10
done

#rm -f $TMP_LOG_FILE

echo "`date` <<<<< END"
### END
#httpd.conf
<VirtualHost *:80>
    ServerAdmin xxx@xxx
    DocumentRoot /home/xxx/web/analysis/src
    ServerName image.xxx.jp
    ErrorLog /home/xxx/web/log/error.log
    LogFormat "%h %l %u \"%{%Y-%m-%d %H:%M:%S}t\" \"%r\" %>s %b \"%{User-Agent}i\" \"%{Referer}i\"" parselog
    CustomLog /home/xxx/web/log/access.log parselog
    <Directory "/home/xxx/web/analysis/src">
        Options FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

試したこと

・llでcsvファイルを確認したところ、更新はされているようでした。
・access.log-xxxにデータを入れましたが、csvは更新されませんでした。
・②のうち、ファイルの作成は動いています。
・前のサーバーからcsvファイルを移行したところ、mysqlへの書き込み(③の動作)は確認しました。

補足情報(FW/ツールのバージョンなど)

cent os 8.2
apache 2.4.3

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Y.H.

    2020/12/08 18:14

    インプットとなるaccess.log-xxxが異なる2回の実行で、結果が同じになってるだけでは?

    キャンセル

  • youplus40

    2020/12/08 18:21

    私の書き方が悪く申し訳ありませんが、タイムスタンプは更新されておりました。
    access.log-xxxを変更してもcsvファイルに書き込みがない状態ですね。

    キャンセル

  • Y.H.

    2020/12/08 21:03

    以下のように wc コマンドで入力ファイルの行数を出力して実行し、
    access.log-xxxにデータを入れたと思ってるファイルを読み込んでいるか確認してみては?

    touch $TMP_LOG_FILE
    echo ${APACHE_LOG}
    wc -l ${APACHE_LOG}

    キャンセル

回答 1

check解決した方法

0

DNSの設定でサーバーに変更していなかったため、目的のアクセスログ(/c/を含むログ)がなく、csvに変換されておりませんでした。DNSの設定を変更したところ、問題なく動作しました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る