2013-09-22 42 views
5

tôi đã thiết Vải lên để đăng nhập tất cả SSH/đầu ra paramiko liên quan với một mức độ INFO hoặc cao hơn sử dụng:định dạng log Vải để hiển thị ngày tháng và thời gian

Điều này dẫn đến một bản ghi tìm kiếm như thế này:

[host1] Executing task 'task1' 
[host1] Run: ls 
... 

Có thể thay đổi trình định dạng cho trình ghi nhật ký ssh.transport để mỗi dòng cũng có ngày và giờ được in bên cạnh nó không?

Trả lời

4

alecxe said, định dạng được mã hóa cứng trong Vải 1.x (kể từ khi tôi đăng bài này, phiên bản duy nhất có sẵn.) Có a rejected pull request có thể khắc phục được điều này.

Vì vậy, thay vào đó chúng ta cần một công việc xung quanh. Đây là một giải pháp khá hacky mà tôi đã viết, nhưng nó dựa trên các phần không có giấy tờ của Fabric, có nghĩa là nó có thể phá vỡ trong các phiên bản sau này.

from fabric.io import OutputLooper 
from datetime import datetime 

def newFlush(self, text): 
    stamp = datetime.now().strftime("%a %b %d %H:%M:%S - ") 
    print(stamp + text) 

OutputLooper._flush = newFlush 

Từ thời điểm này trở đi, mọi đầu ra từ máy từ xa sẽ có dấu thời gian.

Ví dụ, không có mã này đầu ra từ sudo('echo "test"') sẽ là:

[InteractSL-DT1.usma.ibm.com] sudo: echo "test" 
[InteractSL-DT1.usma.ibm.com] out: test 
[InteractSL-DT1.usma.ibm.com] out: 

'test' 

Nhưng sau khi nói thêm rằng, bây giờ bạn sẽ có được điều này:

[InteractSL-DT1.usma.ibm.com] sudo: echo "test" 
Fri Jan 02 12:54:49 - [InteractSL-DT1.usma.ibm.com] out: 
Fri Jan 02 12:54:49 - test 

Fri Jan 02 12:54:49 - [InteractSL-DT1.usma.ibm.com] out: 
Fri Jan 02 12:54:49 - 

'test' 

Bạn có thể chơi xung quanh với cơ bản này ý tưởng để làm sạch nó. Đường dây sudo khi bắt đầu xuất phát từ fabric.operations._run_command, quanh dòng 900. Tôi không chắc chắn về bất kỳ cách đơn giản nào bạn có thể sửa đổi nó.

3

Hiện không thể. Định dạng được mã hóa cứng: xem source.

FYI, có proposal yêu cầu chính xác bạn là gì.


Bạn có thể thiết lập đăng nhập định dạng với một asctime bên trong, nhưng nó sẽ không ảnh hưởng đến sản lượng vải, những người duy nhất paramiko:

import logging 
FORMAT = "%(asctime)s %(name)s %(message)s" 
logging.basicConfig(format=FORMAT, level=logging.INFO) 

dụ đầu ra:

[host] Executing task 'restart' 
[host] sudo: ls 
2013-09-23 02:36:54,800 paramiko.transport Connected (version 2.0, client OpenSSH_5.3) 
2013-09-23 02:36:55,728 paramiko.transport Authentication (password) successful! 
2013-09-23 02:36:55,889 paramiko.transport Secsh channel 1 opened. 
... 

Hy vọng rằng sẽ giúp .

0

Tôi cũng không thể tìm cách thực hiện việc này ngoài việc thay thế _flush(). Tôi thường thấy đó là một thực hành nguy hiểm để thay thế một phương pháp riêng tư trong bất kỳ lớp nào, hãy để một mình một bên thứ ba. Đây là giải pháp trang trí phương thức Fabric _flush() và cũng sử dụng phương thức Python time.asctime gốc để định dạng dấu thời gian.

def time_decorator(msg): 
    """ 
    Decorates `msg` with current timestamp 
    Args: 
     msg(str): The log message from fabric 
    Returns: 
     str: Original message prepended with current date time 
    """ 
    if "\n" not in msg and msg.strip(): 
     return "[%s] %s" % (time.asctime(), msg) 

    return msg 


# Compose original method inside of decorator 
_original_flush = OutputLooper._flush 
OutputLooper._flush = lambda self, msg: { 
    _original_flush(self, time_decorator(msg)) 
} 


@task 
def uptime(): 
    run('uptime') 

Kiểm tra nó ra, đầu ra của bạn sẽ giống như một cái gì đó như:

> fab uptime -H 10.0.1.3,10.0.1.2 
[10.0.1.3] Executing task 'uptime' 
[10.0.1.3] run: uptime 
[Thu Dec 15 19:34:35 2016] [10.0.1.3] out: 19:34:35 up 69 days, 4:22, 1 user, load average: 0.05, 0.03, 0.05 
[Thu Dec 15 19:34:35 2016] [10.0.1.3] out: 

[10.0.1.2] Executing task 'uptime' 
[10.0.1.2] run: uptime 
[Thu Dec 15 19:34:35 2016] [10.0.1.2] out: 19:34:35 up 70 days, 1:12, 1 user, load average: 0.00, 0.01, 0.05 
[Thu Dec 15 19:34:35 2016] [10.0.1.2] out: 


Done. 
Disconnecting from [email protected] done. 
Disconnecting from [email protected] done. 
Các vấn đề liên quan