8

私は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
4

4 に答える 4

13

パスを切り捨てる独自の 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'
    )
于 2013-01-20T22:00:20.410 に答える
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
于 2013-01-20T21:50:36.023 に答える