2015-10-15 2 views
0

Я считаю, что у меня есть немного уникального варианта использования. В большинстве других случаев было бы вполне удовлетворительным просто регистрировать все потоки в один файл. Это не сработает для меня, очень важно, чтобы я получал журналы из отдельного потока в определенный файл, который содержит только журналы из этого потока.Как создать регистрацию/регистраторы на основе потоков?

Я также применяю параллельную модель к большой и в настоящее время итеративной кодовой базе, которая имеет регистрацию, реализованную повсюду в разных модулях, и я стараюсь изменить как можно меньше кода.

Я могу назвать несколько решений, которые просто кажется немного Hacky, которые включают обнаружение, если текущий код exectuing в потоке, так что мне интересно, если есть хороший вещий способ сделать это

+1

возможность форматировать регистратор, чтобы добавить идентификатор потока Вы? Если вы это сделаете, вы можете отфильтровать это в самих журналах, используя grep, если вы хотите свести к минимуму изменения кода в главном приложении. – idjaw

+0

, но позволяет сказать, что поток вызывает 5 различных функций из 5 различных модулей, и я хочу, чтобы эти функции попали в журнал потоков, как эти функции будут записываться в тот же журнал с помощью специального форматирования/обработчика? –

+1

Посмотрите на ответ, который был только что опубликован. Это ваш идеальный подход с минимальным изменением кода. – idjaw

ответ

2

Если вы re уже используя модуль logging, его очень легко. Вы должны иметь что-то вроде этого:

log = logging.getLogger(__name__) 
log.setLevel(logging.DEBUG) 
file_handler = logging.FileHandler('mylog.log') 
file_handler.setFormatter(logging.Formatter('%(message)s')) 
log.addHandler(file_handler) 

log.debug('this is awesome!') 

хорошо идти к вашему logging.Formatter и добавить %(thread)d и %(threadName)s и вуаля! У вас есть журнал, зависящий от потока!

так снова, она будет выглядеть следующим образом:

logging.Formatter('%(thread)d - %(threadName)s - %(levelname)s - %(message)s') 

тогда .. grep это. Вуаля! Не нужно ничего менять.

Здесь все из них, если вы заинтересованы: https://docs.python.org/2/library/logging.html#logrecord-attributes

+0

Спасибо! это новость для меня, хотя она все еще не полностью решает мою проблему. (по-прежнему очень полезная помощь) Логически мы можем притворяться, что каждая нить печатает отдельный журнал, строит линию, так что невозможно было бы читать любые статьи вместе. Чтобы получить их в отдельных файлах, мне пришлось бы анализировать на основе имени потока, что не является 100% идеальным для моих обстоятельств, частично потому, что я фактически использую рабочие потоки, поэтому 1 поток может обрабатывать 3 статьи ' , Кроме того, я могу изменить некоторые из наших системных журналов, только если я их взломал. –

+0

Я мог бы также изменить имя потока на каждый элемент рабочего элемента, но это хакерский и не позволит мне контролировать уровень –

+1

. Вы можете добавить, что добавьте новый 'logging.FileHandler' для каждого потока и измените имя как это, но это потребует от вас немного изменить ситуацию. И добавьте немного больше кода, но в конце у вас будет X-файл с выходом каждого потока в нем. –

Смежные вопросы