Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Unicode正在写入我的文件_Python_Logging_Unicode - Fatal编程技术网

Python Unicode正在写入我的文件

Python Unicode正在写入我的文件,python,logging,unicode,Python,Logging,Unicode,我有一个程序,可以写入输出和写入文件。使用如下函数对输出着色: 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:

我有一个程序,可以写入输出和写入文件。使用如下函数对输出着色:

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)
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
如何使用它是使用记录器:

# 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\u color
函数信息,输出如下所示:

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)
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字符串与颜色调用一起删除(
[m

为了澄清
,因此
从上述输出中删除了问题,以下是问题的图像:


正如您所看到的,ANSI转义序列前面有一些奇怪的方块。最简单的解决方案是修改
set\u color
函数,使其返回未修改的字符串,而不添加颜色序列。根据注释,这似乎不是一个选项

文件写入磁盘后,只需一个Linux命令即可删除这些转义序列:

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

最简单的解决方案是修改
set\u color
函数,使其返回未修改的字符串,而不添加颜色序列。根据注释,这似乎不是一个选项

文件写入磁盘后,只需一个Linux命令即可删除这些转义序列:

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


您不能将unicode写入文件。您只能写入字节。您在谈论什么unicode字符串?您的示例中的所有内容似乎都是ASCII。这些方块不是unicode,它们是ASCII ESC字符
\033
。通常的方法是测试输出设备是否是终端,如果不是,则不发出ANSI转义代码,这就是像
ls
grep
这样的程序所做的(除非您使用
--color=always
选项克服这种行为)。这样做要比从下游过滤转义码容易得多。@13aal:格式化程序是按处理程序设置的。您不能将unicode写入文件。您只能写入字节。您在说什么unicode字符串?示例中的所有内容都是ASCII。这些方块不是unicode,而是ASCII ESC字符
\033
。通常的方法是测试输出设备是否是终端,如果不是,则不会发出ANSI转义码,这就是像
ls
grep
这样的程序所做的(除非您使用
--color=always
选项克服了这种行为)。这样做要比在下游过滤转义码容易得多。@13aal:格式化程序是按处理程序设置的。这似乎是最好的方法,您可以写入临时文件,以某种方式将转义序列过滤掉,然后将其写入log@MarkRansom这不起作用,因为直到程序运行时才创建文件ds@wahwahwah那么你是如何检查输出的呢?@MarkRansom在程序结束后查看文件。你认为如果我打开文件,替换掉转义序列,清除文件,然后重新编写它会起作用吗?@wahwah那么它确实起作用,因为你一直在等待程序结束。你对输出做什么剥离转义序列后由您决定,我给出的命令只是将其运行到控制台。您可以重定向到另一个文件或任何您想要的文件,Linux为您提供了很多选项。这似乎是最好的方法,您可以写入临时文件,以某种方式刷新转义序列,然后将其写入log@MarkRansom这并不重要工作,因为在程序运行之前不会创建文件ends@wahwahwah那么你是如何检查输出的呢?@MarkRansom在程序结束后查看文件。你认为如果我打开文件,替换掉转义序列,清除文件,然后重新编写它会起作用吗?@wahwah那么它会起作用,因为你在等待直到程序结束。剥离转义序列后的输出由您决定,我给出的命令只是将其运行到控制台。您可以重定向到另一个文件或任何您想要的文件,Linux为您提供了很多选项。