Memfilter entri log yang tidak lengkap

1

Saya mencoba memasukkan beberapa log pengumpulan sampah ke dalam Splunk. Namun, ketika java memulai pengumpulan sampah, ia mulai entri log, kemudian ketika selesai menempatkan di akhir entri. Splunk memperlakukan ini sebagai entri terpisah, jadi saya mencoba menggunakan cron untuk memberi makan log ke file terpisah, dan minta Splunk memonitor file itu.

Saya telah menemukan bahwa entri log yang tidak lengkap tidak memiliki karakter umpan baris, jadi saya telah mencoba menggunakan grep, sed, atau perl satu liner untuk menyaringnya.

Saya sudah mencoba ini

cat <log file> | egrep "\n"
cat <log file> | sed '/\n/p'
perl -pe '/(?:\n|\r)+$/gm' <log file>

Tapi, setiap kali saya mendapatkan kembali baris yang tidak lengkap (Anda dapat melihat prompt saya di akhir baris ketiga):

2013-10-11T13:21:43.952-0500: 56511.609: [GC 56511.609: [ParNew: 2457856K->271659K(2765056K), 0.5481470 secs] 5897437K->3711241K(11981056K), 0.5485080 secs] [Times: user=1.21 sys=0.00, real=0.55 secs]
2013-10-11T13:53:17.001-0500: 58404.658: [GC 58404.658: [ParNew: 2729515K->180830K(2765056K), 0.4755270 secs] 6169097K->3747097K(11981056K), 0.4758900 secs] [Times: user=1.29 sys=0.01, real=0.48 secs]
2013-10-11T14:02:56.084-0500: 58983.741: [Full GC (System) 58983.741: [CMS: 3566266K->3504629K(9216000K), 12.7932340 secs] 4444704K->3504629K(11981056K), [CMS Perm : 2082967K->2081438K(3393452K)], 12.7937180 secs][user@host ~]$

Metode apa yang harus saya gunakan untuk hanya mencocokkan garis yang diakhiri dengan karakter linefeed (\ n)? Atau adakah cara lain untuk melakukan ini?

tpederson
sumber

Jawaban:

0

Anda dapat mencapai apa yang Anda inginkan dengan:

perl -ne 'print if /\n/' <log file>

contoh:

[root@ach tmp]# xxd ble
0000000: 610a 620a 630a 64                        a.b.c.d
[root@ach tmp]# perl -ne 'print if /\n/' ble
a
b
c
[root@ach tmp]#

Kode perl Anda tidak berfungsi karena -p membuat perl mencetak setiap baris (diakhiri dengan \ n atau akhir karakter file). Anda melakukan beberapa pencocokan regex, tetapi tidak memengaruhi apa pun.

perl -pe '/(?:\n|\r)+$/gm' <log file>
otokan
sumber
Bekerja seperti pesona, terima kasih.
tpederson