2017-09-29 2 views
0

J'ai un programme qui écrit en sortie et écrit dans un fichier. La sortie est colorée en utilisant une fonction qui ressemble à ceci:Unicode est en cours d'écriture dans mes fichiers

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) 

Comment vous utilisez est d'utiliser un enregistreur:

# 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) 

Lorsque vous appelez l'enregistreur, pour définir la couleur:

logger.info(set_color(
    "test" 
)) 

Permet de sortir du texte vert ou de la couleur de votre choix. Le problème est quand il écrit dans le fichier journal, il rédigera également les informations de fonction set_color et la sortie ressemble à ceci:

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 

Est-il possible que je peux écrire dans le fichier journal et de se débarrasser des chaînes unicode avec les appels de couleur ([<NUM>m)?

Pour clarifier SO retiré la question de la sortie ci-dessus, voici une image du problème:

data

Comme vous pouvez le voir, il y a des places étranges devant des séquences d'échappement ANSI

+1

Vous ne pouvez pas écrire unicode aux fichiers. Vous ne pouvez écrire que des octets. – wim

+1

De quelles chaînes Unicode parlez-vous? Tout dans votre exemple semble être ASCII. –

+0

Qu'est-ce que cela a à voir avec Unicode? Vous écrivez les mêmes octets dans les deux cas; la différence est que le terminal les interprète comme signifiant «changer la couleur» au lieu d'afficher les octets sous une forme visible. – chepner

Répondre

2

La solution la plus simple consiste à modifier la fonction set_color afin qu'elle renvoie la chaîne non modifiée, sans ajout de séquences de couleurs. Basé sur les commentaires, il semble que ce n'est pas une option.

Une fois que le fichier est écrit sur le disque, il est une seule commande Linux pour supprimer ces séquences d'échappement:

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

Cela semble la meilleure approche, vous pouvez écrire dans un fichier temporaire et en quelque sorte grep les séquences d'échappement, puis l'écrire dans le journal – 13aal

+0

@MarkRansom cela ne fonctionne pas parce que le fichier n'est pas créé jusqu'à la fin du programme – wahwahwah

+0

@ wahwahwah comment inspectez-vous cette sortie alors? –