Asp.net 如何在多线程、多进程、web花园和web农场的情况下获得唯一的id?

Asp.net 如何在多线程、多进程、web花园和web农场的情况下获得唯一的id?,asp.net,log4net,multiprocessing,unique-id,Asp.net,Log4net,Multiprocessing,Unique Id,我试图绕过log4net不是多进程安全的问题。因为有时日志文件被锁定,同一应用程序的另一个线程无法写入它。我试图做的是创建一个日志文件,该文件上的线程具有唯一的id。目前,我正在使用Thread.CurrentThread.GetHashCode()、Process.GetCurrentProcess()和System.Environment.MachineName作为文件名的一部分。这是否足够或冗余,或者是否有更好的方法来获取唯一的id,该id作为日志文件名是多线程/进程/web场/web花园

我试图绕过log4net不是多进程安全的问题。因为有时日志文件被锁定,同一应用程序的另一个线程无法写入它。我试图做的是创建一个日志文件,该文件上的线程具有唯一的id。目前,我正在使用Thread.CurrentThread.GetHashCode()、Process.GetCurrentProcess()和System.Environment.MachineName作为文件名的一部分。这是否足够或冗余,或者是否有更好的方法来获取唯一的id,该id作为日志文件名是多线程/进程/web场/web花园安全的?或者,有没有更好的方法来编写日志文件?提前感谢。

作为一般理论:您的机器ID(主机名,或者更好的是,第一个网络接口的MAC地址)加上进程ID/线程ID应该是唯一的,所以是的,我认为您有一个有效的解决方案


MAC地址非常好,如果你能获得的话,因为它们“保证”是普遍唯一的(尽管虚拟化可能会打破这一点);主机名“应该”是唯一的,但不能保证这一点(例如:有人站在一系列克隆机器上,意外地将它们的主机名设置为所有匹配的主机名)。但是,我假设(因为您被标记为asp.net),您运行在某种Windows域中,该域保证了主机名的唯一性。

如果我理解正确,您希望为每台机器的每个线程、每个进程创建一个日志文件。因此,根据您正在执行的操作的描述,您的日志文件名可能如下所示:

machine1_processid1_thread1.log
machine1_processid1_thread2.log
machine1_processid2_thread1.log
machine2_processid1_thread1.log
etc...
string logFileName = Guid.NewGuid().ToString() + ".log"
您是否关心日志文件名的任何组件的实际值是多少?换句话说,日志文件名由可识别的组件(机器名、线程id、进程id等)组成真的很重要吗?或者日志文件名仅仅是唯一的就足够了吗

一种方法是简单地使用Guid。因此,在创建日志文件名的地方,可以执行以下操作:

machine1_processid1_thread1.log
machine1_processid1_thread2.log
machine1_processid2_thread1.log
machine2_processid1_thread1.log
etc...
string logFileName = Guid.NewGuid().ToString() + ".log"
这可能会实现拥有唯一命名日志文件的目标。我认为可能最终会出现guid的冲突,但我对这方面的了解还不够确定。但是,这种方法实际上并不十分方便用户。谁真的想查看一个充满基于guid的文件名的文件夹,并尝试确定他们真正想查看的是哪一个

了解生成日志的机器和过程可能有用吗?这样,如果您知道或怀疑某个问题来自某个特定的机器或特定的进程,那么您可以找到从该机器/进程生成的文件。在这种情况下,您仍然可以使用Guid来命名文件,但可以使用计算机名和/或进程来扩充:

string logFileName = string.Format("{0}_{1}_{2}.log", 
                                   Environment.MachineName,
                                   Process.GetCurrentProcess().ProcessName,
                                   Guid.NewGuid());
这应该会提供一个更加用户友好的日志文件名,并且在所有条件中仍然是唯一的

总之,我建议尝试使用Guid,因为它的声明目的是提供一个全局唯一标识符,而不是尝试提出自己的算法。正如我上面提到的,主要的缺点是,在一个满是基于guid的日志文件的文件夹中查找“正确的”日志文件可能会很烦人。使用更用户友好的数据(如机器名、进程名等)扩充文件名可能会有所帮助

最后,我将提到,如果您确实使用Guid,则有几个选项可用于格式化Guid


谢谢你。我并不真正关心日志的名称,因为有一个日志清理功能可以将这些日志文件自动附加到常规日志文件中。问题是我从哪里得到这个GUID。我对一个网站的理解(我可能是错的)有时是,尽管看起来我仍然在做同样的事情。后端可能已更改为另一个后端。而且,如果前一个仍处于锁定状态,那么新的一个将无法写入日志。老实说,我主要从事桌面开发,因此我对一些复杂的web开发不太精通。我认为,如果您已经按照描述生成了文件名,那么您可以更改生成名称的方式,以包含Guid.NewGuid的使用。如果您是通过代码配置log4net的,听起来像是这样,因为我认为log4net配置不允许您创建所描述的文件名(例如,使用线程的哈希代码),那么我猜您可以在。。。。。。配置log4net。我对web开发不够熟悉,无法提供更多关于何时/如何使用多个进程/线程以及如何在该环境中最好地使用log4net的信息。我怀疑如果你在这里深入研究,你会发现一些关于在asp.net中使用log4net的好信息,这可能会对你有所帮助。