2017-09-29 12 views
0

私は、ファイルに出力して書き込むプログラムを持っています。ロガーを使用しているどのようにこれを使用ユニコードが私のファイルに書き込まれています

def set_color(org_string, level=None): 
    """ 
    set the console log color, this will kinda mess with the file log but whatever 
    """ 
    color_levels = { 
     10: "\033[36m{}\033[0m",  # DEBUG 
     20: "\033[32m{}\033[0m",  # INFO *default 
     30: "\033[33m{}\033[0m",  # WARNING 
     40: "\033[31m{}\033[0m",  # ERROR 
     50: "\033[7;31;31m{}\033[0m" # FATAL/CRITICAL/EXCEPTION 
    } 
    if level is None: 
     return color_levels[20].format(org_string) 
    else: 
     return color_levels[int(level)].format(org_string) 

あなたは色を設定するには、ロガーを呼び出す
# console logger and file logger settings 
logger = logging.getLogger("zeus-log") 
logger.setLevel(logging.DEBUG) 
file_handler = logging.FileHandler(
    filename=create_log_name(), mode="a+" 
) 
file_handler.setLevel(logging.DEBUG) 
console_handler = logging.StreamHandler() 
console_handler.setLevel(logging.DEBUG) 
file_format = logging.Formatter(
    '%(asctime)s;%(name)s;%(levelname)s;%(message)s' 
) 
console_format = logging.Formatter(
    "[%(asctime)s %(levelname)s] %(message)s", "%H:%M:%S" 
) 
file_handler.setFormatter(file_format) 
console_handler.setFormatter(console_format) 
logger.addHandler(console_handler) 
logger.addHandler(file_handler) 

logger.info(set_color(
    "test" 
)) 
出力は次のようになります機能を使用して着色されています

緑色のテキスト、または任意の色を出力します。問題は、それがログファイルに書き込むとき、それはまたset_color機能情報を書きますで、出力は次のようになります。

2017-09-29 14:25:50,277;zeus-log;DEBUG;[36mchecking if the application has been run before...[0m 
2017-09-29 14:25:50,278;zeus-log;DEBUG;[36mverifying operating system...[0m 
2017-09-29 14:25:50,278;zeus-log;DEBUG;[36malready ran, skipping...[0m 
2017-09-29 14:25:50,279;zeus-log;DEBUG;[36mrunning with options '{'runInVerbose': True, 'useRandomAgent': True, 'dorkToUse': 'inurl:php?id=10'}'...[0m 
2017-09-29 14:25:50,280;zeus-log;INFO;[32mlog file being saved to '/home/baal/bin/python/zeus-scanner/log/zeus-log-47.log'...[0m 
2017-09-29 14:25:50,280;zeus-log;DEBUG;[36mgrabbing random user-agent from '/home/baal/bin/python/zeus-scanner/etc/agents.txt'...[0m 
2017-09-29 14:25:50,281;zeus-log;DEBUG;[36musing default search engine (Google)...[0m 
2017-09-29 14:25:50,282;zeus-log;INFO;[32musing default search engine...[0m 
2017-09-29 14:25:50,282;zeus-log;INFO;[32mstarting dork scan with query 'inurl:php?id=10'...[0m 
2017-09-29 14:25:50,282;zeus-log;DEBUG;[36mchecking for user-agent and proxy configuration...[0m 
2017-09-29 14:25:50,285;zeus-log;INFO;[32mattempting to gather query URL...[0m 

私は、ログファイルに書き込むことができますし、Unicode文字列を取り除く方法がありますカラーコール( [<NUM>m)と一緒に? SOはここで、上記の出力から問題を取り除い明確にする

は、問題の画像は、次のとおりです。

data

あなたは奇妙な四角は、ANSIエスケープシーケンスの前にある見ることができるように

+1

あなたはファイルにUnicodeを書き込むことはできません。バイトは書き込むことができます。 – wim

+1

あなたはどんなUnicode文字列について話していますか?あなたの例のすべてがASCIIのように見えます。 –

+0

これはUnicodeとは何が関係していますか?どちらの場合も同じバイトを書きます。違いは、端末が、表示可能な形式でバイトを表示するのではなく、「色を変える」ことを意味すると解釈することです。 – chepner

答えて

2

最も簡単な解決策は、set_color関数を変更して、文字列を変更しないで返します。色のシーケンスは追加しません。コメントに基づいて、これはオプションではないようです。

ファイルがディスクに書き込まれると、それはこれらのエスケープシーケンスを除去するために、単一のLinuxコマンドです:

sed -r 's/.\[[0-9]+m//' logfile 
+0

これは最善のアプローチのようですが、一時ファイルに書き込んでエスケープシーケンスを何とかgrepしてログに書き込むことができます – 13aal

+0

@MarkRansomプログラムが終了するまでファイルが作成されないので、これは動作しません。 – wahwahwah

+0

@ wahwahwahその出力をどうやって調べていますか? –

関連する問題