您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關服務器的日志輸出怎么利用paramiko進行實時獲取,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
def get_report_info_perid(self, cmd, diff_time, thre_time): # 發送要執行的命令 pre_time_stamp = [0] * 4 self._channel.send(cmd + '\r') # 回顯很長的命令可能執行較久,通過循環分批次取回回顯 time_stamp_arr = [] index = [0] * 4 current_line = b'' line_counter = 0 line_feed_byte = '\n'.encode(self.encoding) while True: buffer = self._channel.recv(1) if len(buffer) == 0: logger.info('end______________') break current_line += buffer if buffer == line_feed_byte: line = current_line.decode(self.encoding) logger.debug('shell顯示:%s'%line) if not line.startswith(self.rq): line_counter += 1 current_line = b'' continue col = self.check_type(line) time_stamp = int(time.mktime(time.strptime(' '.join([line[:8], line[9:17]]), "%Y%m%d %H:%M:%S"))) time_stamp_dec = line[18: 21] # 精確到毫秒 time_stamp = time_stamp * 1000 + int(time_stamp_dec) logger.info('%s:%s' % (senior_name[col], time_stamp)) self.write_xl(index[col] + 1, col, time_stamp) index[col] += 1 if pre_time_stamp[col] == 0: pre_time_stamp[col] = time_stamp else: if abs((time_stamp - pre_time_stamp[col]) - diff_time[col]) > thre_time[col]: logger.error( '兩幀數據間隔為{}ms,時間戳分別為:({},{}),行號:{}'.format(time_stamp - pre_time_stamp[col], time_stamp, pre_time_stamp[col], index[col])) pre_time_stamp[col] = time_stamp line_counter += 1 current_line = b'' def get_temp_info(self, col, max_number): index = 0 cpu_arr, gpu_arr = [], [] while True: cpu_temp, gpu_temp = self.get_cpu_gpu_temp() logger.info('cpu_temp:%s, gpu_temp:%s' % (cpu_temp, gpu_temp)) cpu_arr.append(cpu_temp) gpu_arr.append(gpu_temp) self.write_xl(index + 1, col, cpu_temp) self.write_xl(index + 1, col + 1, cpu_temp) time.sleep(60) index += 1 if max_number == index: break return cpu_arr, gpu_arr
1.問題1
一開始的cmd命令為 tail -f log.txt | grep -aE “a|b”
結果出現一個問題,在代碼運行幾分鐘之后,就獲取不到數據了
一開始以為是paramiko的問題,會在一定時間之后自動關閉client,但是經過調試之后發現是阻塞在_channel.recv,一直收不到服務端的數據導致。
經過百度之后發現由于linux的緩沖機制影響導致tail -f 結合管道|的時候會輸出延遲
緩沖是一種有效提高IO效率的方法,把頻繁的讀寫請求積累到一定程度后再一次性的與IO設備交互操作。
IO緩沖有3種,無緩沖,行緩沖,和全緩沖。
在終端窗口中執行tail命令,是面向終端設備的,會使用行緩沖,所以日志中每寫入一行,立刻就會輸出。
當使用管道時,會變為使用全緩沖,這樣一來,就要等到日志中寫入的字節數填滿buffer后才會輸出。
解決方法:
把tail的標準輸出重定向到標準錯誤上,并把標準錯誤也給管道。
因為stderr是無緩沖的。
例如 tail -f >&2 | grep
或者直接去掉管道
2.問題2
按照問題一的結論,我去掉了命令中的管道,直接使用 tail -f log.txt命令,將過濾放到check_type函數中進行,發現運行幾分鐘之后獲取不到數據的情況并沒有解決。于是繼續定位。最后經過一番挫折之后發現是使用的tail -f命令有問題
tail -f
等同于–follow=descriptor,根據文件描述符進行追蹤,當文件改名或被刪除,追蹤停止
tail -F
等同于–follow=name --retry,根據文件名進行追蹤,并保持重試,即該文件被刪除或改名后,如果再次創建相同的文件名,會繼續追蹤
log.txt文件在程序運行過程中被修改了文件描述符從而導致tail -f不繼續跟蹤。修改為tail -F后問題解決
上述就是小編為大家分享的服務器的日志輸出怎么利用paramiko進行實時獲取了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。