Cara yang lebih baik untuk mengganti cap waktu berdasarkan tanggal saat membaca log squid

0

Malam ini saya sedang mencoba melihat garis proksi saya, dan saya datang dengan ini, yang sepertinya semuanya KISS. Bagaimana Anda melakukannya dengan sederhana?

 awk '{ trunc=sprintf("%.0f", $1) ;$1="" ; system("echo -n `date +%R -d\"@" trunc "\" `") ; print $0 ;}' </var/log/squid3/access.log

Baris di sana dimulai dengan: 137816847.548 (maka ruang membatasi bidang berikutnya, angka benar-benar acak di sini)

mveroone
sumber
Bagaimana dengan contoh garis log lengkap dan apa yang Anda harapkan sebagai output? Sepertinya mengubah stempel waktu menjadi tanggal yang dapat dibaca manusia, dan menampilkan seluruh baris?
ernie
Lihat @ justbrowsing jawaban untuk contoh baris, mengira satu-satunya bagian penting adalah bidang pertama. Apa yang saya inginkan adalah untuk dapat mengganti bidang ini yang merupakan timestamp UTC (dengan milidetik) menjadi tanggal yang dapat dibaca manusia dengan format yang dapat dipilih.
mveroone

Jawaban:

1

Berikut ini adalah skrip python kecil yang harus cukup kuat dan mudah diperluas:

#!/usr/bin/env python

import sys, os
from datetime import datetime

try:
    if not os.path.isfile(sys.argv[1]):
        sys.stderr.write("[Error]: %s is not a file\n" % sys.argv[1])
        sys.exit(1)
except IndexError:
    sys.stderr.write("Usage: parse_squid_log.py access.log\n")
    sys.exit(1)

with open(sys.argv[1]) as log:
    for line in log:
        line = line.split(' ')
        line[0] = str(datetime.fromtimestamp(float(line[0])))
        print ' '.join(line).strip()

Simpan ke file seperti itu parse_squid_log dan pastikan itu dapat dieksekusi chmod +x parse_squid_log dan pada Anda path.

Pemakaian:

$ parse_squid_log
Usage: parse_squid_log.py access.log

$ parse_squid_log abc
[Error]: abc is not a file

$ parse_squid_log /var/log/squid3/access.log
2013-07-23 05:19:26.136000      929 185.168.101.131 TCP_MISS/200 28198 ...
2013-07-23 05:23:07.488000      0 10.42.0.14 TCP_IMS_HIT/304 278 GET ...
2014-05-08 13:49:47.488000      0 10.42.0.14 TCP_IMS_HIT/304 278 GET ...
iiSeymour
sumber
Saya bisa melakukan ini di Perl, tetapi saya mencoba menjadi sederhana. Bagaimanapun solusi Anda adalah apa yang harus dilakukan oleh siapa pun yang membutuhkan ini.
mveroone
1

Dengan asumsi file log adalah sesuatu seperti ini:

1374553166.136    929 185.168.101.131 TCP_MISS/200 28198 GET http://www.amazon.de/gp/offer-listing/B000NOIW62/ref=sr_1_1_olp? - DIRECT/178.236.7.219 text/html
1374553387.488      0 10.42.0.14 TCP_IMS_HIT/304 278 GET http://g-ecx.images-amazon.com/images/G/01/da/creatives/sn130.png - NONE/- image/png
1399553387.488      0 10.42.0.14 TCP_IMS_HIT/304 278 GET http://g-ecx.images-amazon.com/images/G/01/da/creatives/sn130.png - NONE/- image/png

awk '{ cmd = ("date +%R -d @"$1); cmd | getline timestamp; close(cmd); $1=""; print timestamp$0 }' /var/log/squid3/access.log

Perintah rusak:

  • date perintah yang ditetapkan untuk mengubah waktu zaman menjadi 24 jam jam dan menit
  • setel variabel cmd ke perintah tanggal yang diinginkan
  • jalankan cmd dan pipe ke dalam variabel timestamp
  • close output sistem
  • setel kolom 1 menjadi kosong (untuk mencegah duplikasi)
  • cetak waktu yang dikonversi dan sisa kolom

ATAU

Lebih baik lagi dengan hanya awk:

awk '{timestamp=strftime("%R",$1); $1=""; print timestamp$0}' /var/log/squid3/access.log

justbrowsing
sumber
Memang solusi Anda tampaknya lebih baik daripada solusi saya, terutama yang terakhir. Saya akan menjawab pertanyaan itu selama satu minggu untuk melihat apakah ada orang yang lebih seksi, bukan awk larutan. Jika tidak, aku akan mengambil milikmu. Tetap memberi +1
mveroone
1

Tambahkan logformat squid dengan parameter ke /etc/squid/squid.conf, lihat halaman manual .

Misalnya saya menggunakan:

logformat squid %tl IP:%>a %ru err_code

Penting adalah% tl, yang berarti, membuat stempel waktu di waktu lokal.

zigzag
sumber
Ini adalah cara lain untuk mencapai tujuan saya. Ini yang paling sederhana, tetapi hanya akan bekerja dengan log yang lebih baru. Orang harus mengkonversi log lama ke format tanggal baru dengan salah satu metode di atas.
mveroone