我正在使用python日志记录,我有一个如下所示的格式化程序:
formatter = logging.Formatter(
'%(asctime)s - %(pathname)86s - %(lineno)4s - %(message)s', '%d %H:%M'
)
正如您所看到的,我喜欢我的日志文件中的信息在列中整齐排列。我为路径名保留86个空格的原因是因为我程序中使用的某些文件的完整路径很长。但是,我真正需要的只是实际的文件名,而不是完整的路径。如何让日志记录模块只给我文件名?更好的是,因为我有一些长文件名,我想要文件名的前3个字符,后跟'〜',然后是最后16个字符。所以
/Users/Jon/important_dir/dev/my_project/latest/testing-tools/test_read_only_scenarios_happily.py
应该成为
tes~arios_happily.py
答案 0 :(得分:9)
您必须实现自己的Formatter子类,为您截断路径;格式化字符串不能这样做:
import logging
import os
class PathTruncatingFormatter(logging.Formatter):
def format(self, record):
if isinstance(record.args, dict) and 'pathname' in record.args:
# truncate the pathname
filename = os.path.basename(record.args['pathname'])
if len(filename) > 20:
filename = '{}~{}'.format(filename[:3], filename[-16:])
record.args['pathname'] = filename
return super(PathTruncatingFormatter, self).format(record)
使用此类而不是普通的logging.Formatter
实例:
formatter = logging.PathTruncatingFormatter(
'%(asctime)s - %(pathname)86s - %(lineno)4s - %(message)s', '%d %H:%M'
)
答案 1 :(得分:1)
像这样:
import os
def shorten_filename(filename):
f = os.path.split(filename)[1]
return "%s~%s" % (f[:3], f[-16:]) if len(f) > 19 else f
答案 2 :(得分:0)
以下是@Martijn编写的Python 3版本。正如@Nick指出的那样,传递的 record 参数是Python 3中的LogRecord对象。
import logging
import os
class PathTruncatingFormatter(logging.Formatter):
def format(self, record):
if 'pathname' in record.__dict__.keys():
# truncate the pathname
filename = os.path.basename(record.pathname)
if len(filename) > 20:
filename = '{}~{}'.format(filename[:3], filename[-16:])
record.pathname = filename
return super(PathTruncatingFormatter, self).format(record)
答案 3 :(得分:0)
您可以简单地使用filename而不是pathname。有关更多详细信息,请参见https://docs.python.org/3.1/library/logging.html#formatter-objects