Уникальное значение в StackTrace? - PullRequest
1 голос
/ 13 ноября 2009

Справочная информация: Я написал общую библиотеку журналов в .NET 3.5. По сути, разработчик должен вызывать метод Begin () в начале своего метода и метод End () в конце его. Эти методы не принимают параметр - библиотека использует трассировку стека, чтобы выяснить, откуда она взялась. Библиотека имеет коллекцию, которая отслеживает стек вызовов и записывает прошедшее время каждого метода.

Это работает очень хорошо, и я доволен этим.

Но теперь мы хотим добавить его на сервер. Когда в системе работает несколько пользователей, существует только один файл журнала, и трассировки стека объединяются. Невозможно сказать, какой поток что делает.

Мой вопрос такой:

Есть ли способ получить уникальное значение из класса StackTrace или отдельного StackFrame? Как насчет использования отражения? Я хотел бы иметь возможность создать отдельный файл для каждого пользователя. По крайней мере, я хотел бы иметь возможность пометить каждую строку уникальным значением, чтобы мы могли фильтровать файл по этому значению при просмотре трасс.

Мы используем WCF TcpBinding в качестве протокола связи на стороне сервера, если это поможет. Я ищу идентификатор потока, хэш-код, адрес, что-то, чтобы отличить, откуда пришел стек вызовов.

Есть идеи?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 13 ноября 2009

Вы можете использовать что-то, связанное с текущим потоком - возможно, идентификатор потока ?.

Потоки из пула потоков используются повторно, поэтому вы можете видеть повторение идентификатора в файле журнала, но за время жизни пары Begin / End он будет однозначно помечать одного пользователя.

1 голос
/ 13 ноября 2009

Если вы использовали какую-либо форму аспектно-ориентированного программирования (например, Postsharp), вы можете найти лучший декларативный способ получения необходимой информации. Thread.CurrentThread.ManagedThreadId даст вам ссылку на поток, выполняющий код в то время, но все, что ваши разработчики должны сделать, это применить атрибут к методу, а не вызывать Begin() и End() для каждого метода.

0 голосов
/ 13 ноября 2009

Чтобы получить учетную запись пользователя, под которой работает текущий поток, вы можете использовать WindowsIdentity.GetCurrent().

...