4

ここから /var/log/gateway から Django のログ ファイルを読み取る方法に関する SO の受け入れられた回答に従い、ここのように端末にファイルを出力することができました。

2013-05-09T11:15:02.539091+08:00 localhost gateway[5205]: System starting up...
2013-05-09T12:57:44.160246+08:00 localhost gateway[5205]: System start complete.
2013-05-09T15:13:47.428553+08:00 localhost gateway[4777]: * Unable to connect to device /home/smartsensor1. Device may be offline. *

次のステップは、ログ ファイルを出力して html で表示したいということで、元のコードを少し変更して、このようにしました。

def Logs(request):
    with open('../../../../../var/log/gateway') as f:
        while True:
            line = f.readline()
            if line:
                print line
                return HttpResponse(line)

したがって、クライアント側では、別の SO が受け入れた回答hereに基づいて、Ajax をこのように配置しました。

$.ajax({
    type: "GET", 
    url : "{% url WebServiceApp.logging.Logs %}",
    success: function (data) {
            $("#output").append(data);
            setTimeout("doUpdate()", 2000);
    }
});
}

setTimeout("doUpdate()", 2000);

これにより、Ajax からの出力データは、ログ ファイルの最初の行を表示し続けました。この場合、どこがこんな感じ

2013-05-09T11:15:02.539091+08:00 localhost gateway[5205]: System starting up...
2013-05-09T11:15:02.539091+08:00 localhost gateway[5205]: System starting up...
2013-05-09T11:15:02.539091+08:00 localhost gateway[5205]: System starting up...

これが発生するのは、ajax がサーバーにアクセスするたびに、サーバーが必要なことを実行し、ログ ファイルの最初の行である出力を送り返し、HttpResponse を介して出力し、サイクルを完了したためです。すでに完了しているため、別の行を実行します。別のクエリが実行されると、同じことを何度も繰り返します。

したがって、可能な解決策は、クライアントがサーバーに1回問い合わせ、サーバーがログファイルを1行ずつ出力し続け、それをクライアントに送信することです。これが可能かどうかさえわからないので、ここで、ログファイルを行ごとに出力できる結果を達成する方法について専門家に尋ねています/

4

2 に答える 2

0

さて、次のようなアイデアを使用できます。

パラメータを使用GETすると、次のようにビューのメソッドを制御できます。

def Logs(request):
    whole_file = True
    if request.GET.get('whole_file') == 0:
        whole_file = False
    return_string = ''
    with open('../../../../../var/log/gateway') as f:
        while True:
            line = f.readline()
            if line:
                return_string += line + '<br>' # <br> is for breakline html, do it your way
                if not whole_file: break # break if you only need first line
    return HttpResponse(line)

このように、get パラメーター内に変数を含めて、ログ ファイル全体を返すか (初回)、または最初の行のみを返すか (次回) をビューに指示します。

次に、ajax に、GETパラメーターを URL に挿入する方法を含める必要があります。タグを使用し{{url}}ていますが、どうすればよいかわかりませんが、ドキュメントで何かを見つけることができると確信しています。それができない場合は、静的文字列などの他のアプローチを試してください(あまりきれいではありません)または独自のカスタム タグを作成します。

これは、考えられる JavaScript の例です。

$.ajax({
    type: "GET", 
    url : "/ajax_log/?whole_file=0", //this will request the whole file
    success: function (data) {
            $("#output").append(data);
            setTimeout("doUpdate()", 2000);
    }
});
}

setTimeout("doNextUpdate()", 2000);

function doNextUpdate(){

    $.ajax({
        type: "GET", 
        url : "/ajax_log/?whole_file=1", //this will request the just the first line            success: function (data) {
                $("#output").append(data);
                setTimeout("doUpdate()", 2000);
        }
    });
    }
}

それがあなたが望むものを達成するための私の考えです。お役に立てば幸いです。

于 2013-05-10T02:09:08.607 に答える