Điểm:0

Đọc nhật ký thời gian thực với bash

lá cờ be

Tôi có cái này trong nhật ký hệ thống:

Ngày 27 tháng 2 02:53:51 Latitude-E6430 rsyslogd: hành động lên 7
Ngày 27 tháng 2 02:53:51 Latitude-E6430 rsyslogd: hành động xuống B
Ngày 27 tháng 2 02:53:51 Latitude-E6430 rsyslogd: hành động lên U
....vân vân

Tôi muốn tạo một tập lệnh giám sát nhật ký toàn thời gian dưới dạng dịch vụ, nhưng tôi không biết cách thực hiện điều kiện.

1 - Rằng khi bạn đọc, từng dòng một, hãy lưu nó vào một biến.

2 - đọc biến nếu nó tìm thấy trong dòng, các từ [rsyslogd] và [7] nó hiển thị [echo "Found" ]

Nó sẽ là một vòng lặp để đọc từng dòng tệp, tìm kiếm mẫu từ đó.

Tập lệnh mẫu

path_full_log="/home/full.log"


hàm reader_time_real(){

    trong khi đọc full_log; làm
        chek7=$(cat $full_log | grep "rsyslogdd" | grep 7 )
            nếu [[ $? = 0 ]]; sau đó 
                tiếng vang "Đã tìm thấy 7";

            fi

        chekB=$(cat $full_log | grep "rsyslogdd" | grep B )
            nếu [[ $? = 0 ]]; sau đó 
                tiếng vang "Đã tìm thấy B";

            fi
    xong < $path_full_log
}
David avatar
lá cờ cn
Hiển thị tập lệnh bạn đã tạo để ai đó có thể thấy lỗi có thể là gì.
BurstBass BurstBass avatar
lá cờ be
làm xong... thêm xuống
Soren A avatar
lá cờ mx
Vui lòng thêm tập lệnh của bạn vào câu hỏi của bạn, không phải là câu trả lời ... nó có thể sẽ bị đóng.
WU-TANG avatar
lá cờ cn
Đây không phải là một chức năng của rsyslog một cách tự nhiên sao? Tôi chỉ định cấu hình một máy chủ syslog-ng, nhưng tôi nghĩ chúng giống nhau đến mức cả hai đều có thể thực hiện các bộ lọc ???
BurstBass BurstBass avatar
lá cờ be
chúng không giống nhau, tôi chỉ định trong cả hai rằng nó phải có từ "rsyslogdd" và 2 biến thể có thể có, 7 hoặc B
BurstBass BurstBass avatar
lá cờ be
Đã sửa lỗi, chỉ cần thay đổi `cat $full_log` cho `echo $full_log`
Lorenz Keel avatar
lá cờ gr
@BurstBass BurstBass nếu bạn đã sửa nó, hãy tự đặt câu trả lời bằng phiên bản cuối cùng của tập lệnh, sau đó chấp nhận câu trả lời của riêng bạn.
WU-TANG avatar
lá cờ cn
@BurstBassBurstBass Nếu câu trả lời của bạn là dành cho tôi (bạn không gắn thẻ bất kỳ ai), thì tôi nghĩ bạn đã hiểu sai những gì tôi đang nói.... Tôi đang nói rằng "Tôi nghĩ" rằng nhật ký hệ thống đã có khả năng tích hợp sẵn để làm những gì kịch bản của bạn đang làm. Tôi đã định cấu hình máy chủ syslog-ng trước đây và tôi đã thiết lập các bộ lọc để bắt các từ và gửi chúng tới một nhật ký riêng (thậm chí cả các lệnh kích hoạt). Tôi nghĩ rằng rsyslog có chức năng tương tự.
Điểm:1
lá cờ vn

Tôi đã tạo tập lệnh sau, tập lệnh này cập nhật mỗi giây và đánh dấu bất kỳ mục nhập nhật ký mới nào. Nó cũng xác định khu vực mà nhật ký sẽ được hiển thị (với nhật kýlogcol các biến), do đó, nó được tạo để sử dụng trong cửa sổ đầu cuối có kích thước cố định (Tôi đang sử dụng nó bên trong tmux).

Bạn có thể sửa đổi tập lệnh này để chỉ đánh dấu các dòng phù hợp với một tiêu chí cụ thể, như bạn đã chỉ ra.

#!/bin/bash

# Biến cấu hình ban đầu
nhật ký = 31
logcols=127

# Định nghĩa hàm cục bộ
innew() {
  xa lạ
  tiếng vang -e "\e[0;30;47m"
  hightail=$(tail -n "$logrows" /var/log/syslog | cut -b "1-$logcols")
  echo -ne "${hightail}\e[0m"
}

printdif() {
  (( newrows = logrows - logdiff ))
  xa lạ
  Normtail=$(tail -n "$logrows" /var/log/syslog | head -n "$newrows" | cut -b "1-$logcols")
  echo -n "$normtail"
  tiếng vang -e "\e[0;30;47m"
  hightail=$(tail -n "$logdiff" /var/log/syslog | cut -b "1-$logcols")
  echo -ne "${hightail}\e[0m"
}

inold() {
  xa lạ
  Normtail=$(tail -n "$logrows" /var/log/syslog | cut -b "1-$logcols")
  echo -n "$normtail"
}

# Lặp lại mỗi giây
trong khi đúng
làm
  ngủ 1 &

  # Đọc kích thước nhật ký
  logsize=$(wc -l /var/log/syslog | cut -d '' -f1)
  (( logdiff = logsize - presize ))

  # Nếu có nhiều hơn $logrows dòng mới
  nếu (( logdiff > "$logrows"))
  sau đó
    in mới
    vẽ lại=1
  # Nếu ít hơn $logrows dòng nhưng nhiều hơn 0 dòng là mới
  yêu tinh (( logdiff > 0 ))
  sau đó
    indif
    vẽ lại=1
  # Nếu không có dòng nào mới
  khác
    nếu [[ "$redraw" -eq 1 ]]
    sau đó
      bản in cũ
      vẽ lại=0
    fi
  fi

  kích thước trước = "$ logsize"
  chờ # ngủ
xong

Kịch bản được thực hiện với 3 tình huống trong đầu:

  1. Toàn bộ nội dung của nhật ký là mới - mọi thứ được đánh dấu (in mới).
  2. Một số dòng nhật ký là mới - những dòng này được đánh dấu (indif).
  3. Không có dòng nhật ký mới - không có gì được đánh dấu (bản in cũ).

Tuyên bố miễn trừ trách nhiệm: Mã có thể được tối ưu hóa, nhưng tôi thường quan tâm nhiều hơn đến việc mã của mình có thể đọc được hơn là cô đọng nhất có thể.

Điểm:1
lá cờ in

Kịch bản của bạn không phù hợp để làm những gì bạn muốn làm. Nó chỉ đọc tệp một lần, nhưng hoàn toàn. Nếu bạn lặp lại điều này, bạn sẽ không chỉ nhận được đầu ra mới và đó sẽ là cơn ác mộng về hiệu suất.

Ngoài ra, bạn có một cách sử dụng vô ích con mèo, bạn tiếng kêu một chuỗi cố định có mẫu biểu thức chính quy và lưu kết quả vào một biến mà bạn không sử dụng nữa. Ngoài ra, bạn không nên sử dụng các biến tên tệp không được trích dẫn.


Sử dụng đuôi -f | grep --line-buffered:

đuôi -fn0 "$path_full_log" \
| grep -F --line-buffered 'rsyslogdd' \
| grep -Eo --line-buffered '(7|B)' \
| trong khi đọc dòng; làm
      echo "Đã tìm thấy dòng $"
  xong

Hoặc sử dụng xargs:

đuôi -fn0 "$path_full_log" \
| grep -F --line-buffered 'rsyslogdd' \
| grep -Eo --line-buffered '(7|B)' \
| xargs -I{} echo "Đã tìm thấy {}"
  • đuôi -fn0 đọc các dòng mới của tệp khi chúng được thêm vào.
  • grep -F tìm kiếm một chuỗi cố định trong dòng đó.
  • --dòng-đệm kể tiếng kêu để đọc các dòng khi chúng đến thay vì đợi kết thúc luồng đầu vào theo mặc định.
  • grep -Eo tìm kiếm cho ERE mẫu (-E) (7|B) và chỉ xuất ra chuỗi phù hợp (-o).
  • trong khi đọc dòng hoặc xargs -I{} lấy đầu ra đó và chạy lệnh của bạn trên đầu ra (ở đây: tiếng vang).

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.