2009-11-12 3 views
1

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

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

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

Мой вопрос заключается в следующем:

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

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

Любые идеи?

Спасибо.

ответ

2

Вы можете использовать что-то связанное с текущей нитью - возможно, thread id ?.

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

+0

Yep - 'Thread.CurrentThread.ManagedThreadId' должен сделать это красиво. –

+0

Это сработало для меня. Кроме того, я нашел свойство MethodBase.MethodHandle, которое я использую в сочетании с ManagedThreadId. Благодаря! – msawtatn

0

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

+0

Вы также можете использовать 'Thread.CurrentPrincipal.Identity'. – adrianbanks

1

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