paramiko는tail을 사용하여 서버의 로그 출력을 실시간으로 가져옵니다.

4039 단어 paramikotail로그

기본 사고방식


현재 이러한 수요는 자동화를 실현해야 한다. 서버 cpu, gpu 온도와 센서 정보를 실시간으로 얻고 고저온 환경에서 설비 운행 상태에 대한 영향을 테스트해야 한다.기본적인 사고방식은paramikossh를 이용하여 서버에 연결합니다. 하나의 루트는tail-f 명령으로 로그 출력을 실시간으로 가져오고, 다른 루트는'cat/sys/class/thermal/thermal_zone0/temp 명령 시 cpu, gpu 온도를 가져옵니다.

코드


 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 = '
'.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-flog입니다.txt | grep -aE “a|b”
결과적으로 문제가 발생했습니다. 코드가 몇 분 동안 실행된 후에 데이터를 얻을 수 없습니다.
처음에는 파라미코 문제라고 생각했는데 일정 시간 후에 클라이언트를 자동으로 닫았지만 디버깅을 해보니 막혔어요_channel.recv, 서비스 측의 데이터를 받지 못해서
바이두를 통해 linux의 버퍼 메커니즘의 영향으로 tail-f 결합 파이프 | 시 출력 지연
버퍼링은 IO 효율을 효과적으로 향상시키는 방법으로 빈번한 읽기와 쓰기 요청을 어느 정도 축적한 후에 IO 장치와 한꺼번에 상호작용을 한다.
IO 버퍼는 버퍼, 행 버퍼, 전체 버퍼가 없는 세 가지가 있습니다.
  • 버퍼가 없으면 버퍼 메커니즘을 사용하지 않는다.바이트를 위한 장치?(stderr)
  • 줄 바꿈 문자가 나타날 때까지 버퍼링, 버퍼링.일반적으로 터미널 장치에 사용됩니다
  • 버퍼가 꽉 찰 때까지 버퍼링, 버퍼링.일반적으로 블록 장치에 사용됩니다
  • 터미널 창에서 tail 명령을 실행하는 것은 터미널 장치를 위한 것입니다. 줄 버퍼를 사용하기 때문에 로그에 한 줄을 쓸 때마다 바로 출력됩니다.
    파이프를 사용할 때, 모든 버퍼를 사용합니다. 그러면 로그에 기록된 바이트 수가 버퍼를 채워야 출력됩니다.
    해결 방법:
    tail의 표준 출력을 표준 오류로 바꾸고 표준 오류도 파이프에 줍니다.
    stderr는 버퍼가 없기 때문이다.
    예를 들어tail-f>&2 | grep
    아니면 그냥 파이프를 없애거나.
    2. 질문 2
    문제 1의 결론에 따라 나는 명령의 파이프를 제거하고tail-flog를 직접 사용했다.txt 명령, 필터를 check_type 함수에서 진행되었습니다. 몇 분 동안 실행한 후에 데이터를 얻을 수 없는 상황이 해결되지 않았습니다.그래서 계속 위치를 정한다.마지막 좌절 끝에 사용한 tail-f 명령에 문제가 있는 거예요.
    tail -f
    Cfollow=descriptor와 같고 파일 설명자에 따라 추적합니다. 파일이 개명되거나 삭제되면 추적이 정지됩니다.
    tail -F
    Cfollow=name --retry와 같습니다. 파일 이름에 따라 추적하고 다시 시도하십시오. 즉, 이 파일이 삭제되거나 이름이 바뀐 후에 같은 파일 이름을 다시 만들면 계속 추적합니다.
    log.txt 파일은 프로그램 실행 과정에서 파일 설명자를 수정하여tail-f가 계속 추적하지 않습니다.tail-F로 수정 후 문제 해결
    파라미코가 테일을 사용하여 서버의 로그 출력을 실시간으로 얻는 것에 관한 이 글은 여기까지 소개되었습니다. 더 많은 파라미코가 테일로 서버의 로그 출력 내용을 실시간으로 얻는 것에 관해서는 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보시기 바랍니다. 앞으로 많은 응원 부탁드립니다!

    좋은 웹페이지 즐겨찾기