Как получить уникальный идентификатор в ситуациях с многопоточностью, многопроцессорностью, веб-садами и веб-фермами? - PullRequest
0 голосов
/ 02 декабря 2011

Я пытаюсь обойти проблему, связанную с тем, что log4net не безопасен для многих процессов.Потому что иногда файл журнала блокируется, и другой поток того же приложения не может писать в него.Я пытаюсь создать файл журнала с уникальным идентификатором потока в нем.В настоящее время я использую Thread.CurrentThread.GetHashCode (), Process.GetCurrentProcess () и System.Environment.MachineName как часть имени файла.Это достаточно или избыточно или есть лучший способ получить уникальный идентификатор, который является многопоточным / процесс / веб-ферма / веб-сад безопасным в качестве имени файла журнала?Или есть лучший способ написать файл журнала?Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 02 декабря 2011

Если я правильно понимаю, вы хотите создать один файл журнала на поток для каждого процесса на машину. Итак, учитывая описание того, что вы делаете, имена ваших файлов журналов могут выглядеть примерно так:

machine1_processid1_thread1.log
machine1_processid1_thread2.log
machine1_processid2_thread1.log
machine2_processid1_thread1.log
etc...

Вас волнует, какие фактические значения есть для любого из компонентов имени файла журнала? Другими словами, действительно ли важно, чтобы имя файла журнала состояло из идентифицируемых компонентов (имя машины, идентификатор потока, идентификатор процесса и т. Д.)? Или достаточно, чтобы имена файлов журнала просто были уникальными?

Один из подходов состоит в том, чтобы просто использовать Guid. Итак, где вы создаете имя файла журнала, вы можете сделать что-то вроде этого:

string logFileName = Guid.NewGuid().ToString() + ".log"

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

Может быть, полезно знать машину и процесс, который генерирует журналы? Таким образом, если вы знали или подозревали, что какая-то проблема возникает на определенном компьютере или конкретном процессе, вы можете найти только те файлы, которые были сгенерированы на этом компьютере / процессе. В этом случае вы все равно можете использовать Guid для именования файла, но вы можете дополнить его именем машины и / или процессом:

string logFileName = string.Format("{0}_{1}_{2}.log", 
                                   Environment.MachineName,
                                   Process.GetCurrentProcess().ProcessName,
                                   Guid.NewGuid());

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

Таким образом, я бы порекомендовал попробовать использовать Guid, поскольку заявленная цель его состоит в том, чтобы предоставить глобальный уникальный идентификатор, а не пытаться придумать свой собственный алгоритм. Основным недостатком, как я уже отмечал выше, является то, что может быть раздражающим копаться в папке, полной файлов журналов на основе guid, пытаясь найти «правильный». Может помочь добавление имени файла более удобными для пользователя данными, такими как имя компьютера, имя процесса и т. Д.

Наконец, я упомяну, что если вы используете Guid, есть несколько вариантов форматирования guid.

http://msdn.microsoft.com/en-us/library/97af8hh4.aspx

1 голос
/ 02 декабря 2011

Как общая теория: идентификатор вашего компьютера (имя хоста или, что еще лучше, MAC-адрес первого сетевого интерфейса) плюс идентификатор процесса / идентификатор потока должны быть универсально уникальными, так что да, я думаю, у вас есть правильное решение.

MAC-адреса хороши, если вы можете их получить, поскольку они «гарантированно» универсально уникальны (хотя виртуализация может нарушить это);Имена хостов «должны быть» уникальными, но гарантии на это немного меньше (например: кто-то поднимает ряд клонированных машин и случайно устанавливает их имена хостов на все совпадения).Однако я предполагаю (поскольку вы помечены как asp.net), что вы работаете в каком-то домене Windows, который имеет уникальные имена хостов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...