我刚刚重写了一个Windows服务进程,它将重要的信息调试输出到/ programdata / myservice /文件夹中的日志文件。
然而,在午夜的晚上,我有一份工作应该采用当前日期的日志文件并删除它的内容,然后创建一个存档的日志文件,其名称中的日期为3天,例如LogfileArchived15092014.log。
然后,某些代码会运行以删除早于此日期的日志文件,因此我只有今天的当前日志文件和2个已存档的日志文件,用于调试旧问题等。
现在我已经从正在运行的旧服务中复制了执行此操作的代码,并将日志文件存档并删除旧文件。但是由于某些原因,当这个新作业运行时,我会收到I / O错误,例如(来自事件查看器)
运行系统作业时出错:I / O错误归档日志文件:C:\ ProgramData \ Brainiac \ LogfileArchived;该进程无法访问文件'C:\ ProgramData \ Brainiac \ Logfile.log',因为它正由另一个进程使用。
现在第一个路径没有扩展名的原因,例如C:\ ProgramData \ Brainiac \ LogfileArchived是因为它显然是在它到达创建文件日期的部分之前引发错误,以便附加到文件名例如
// set a lock up to prevent other processes locking
this.Locked = true;
// wrap in try as it keeps failing!!!!
try
{
// take contents of current log file - the daily one I have been logging to all day
// I guess this is where the error is being raised due to the absence
// of a .log extension in the error message when mentioning the filename
string content = this.ReadFileString(this.logFilePath);
// for some reason todays log file was empty
// why would this be unless loggging was disabled?
if (!String.IsNullOrEmpty(content))
{
// create a new log file with date stamp of yesterday added to the filename and guff removed to make it valid
string file_date = DateTime.Now.Date.AddDays(-1).ToString().Replace("/", "").Replace("-", "");
// remove time part - should be done at midnight but if not ensure colons and spaces are removed
file_date = file_date.Replace("00:00:00", "").Replace(":", "").Replace(" ", "");
// append .log to it
this.logfilearchivepath += file_date + ".log";
//Append all the contents of my daily log file to this new file
File.AppendAllText(this.logfilearchivepath, content, Encoding.UTF8);
所以我怀疑它是在这条线上轰炸
string content = this.ReadFileString(this.logFilePath);
由于错误消息中没有扩展名。那么也许我需要一种不同的方式来访问内容?
现在我不知道锁定了什么其他进程(我能以某种方式找到它吗?)但是我尝试了以下内容。
添加一个标志,其中应该阻止任何日志记录到日志文件。你可以在顶部看到我去
//设置锁定以防止其他进程锁定 this.Locked = true;
在我执行日志记录的方法中,我检查了它是否退出ASAP,例如
// log to our application data folder - unless locked for some reason
public void LogMsg(string msg, string debugLevel = "HIGH")
{
// we are prevented from logging at this point in time
if (this.Locked) return;
我还在3个try / catch语句中包含了对ArchiveLogFile()方法的调用,每个语句都有一个Thread.Sleep介于更长和更长的间隙之间,以防某些东西仍在记录。
< / LI>我也尝试过使用数据库锁。
所以我有一个名为LOCKS的表和插入/删除锁记录的方法以及检查一个不存在的方法。
因此,如果多个进程尝试从不同的应用程序同时运行相同的代码,那么它应该不能作为锁定记录存在于数据库中,该数据库在作业开始运行之前插入并在作业之后被删除已完成(运行锁定)
同样,一旦完成,就会插入一个LOGFILE_ARCHIVED锁记录,以便相同的OR或不同的作业知道该日志文件已存档,并且不会再尝试将其存档。
我在锁文件中使用计算机名称,因为该进程可以在任何时间在多台服务器/计算机上运行。
那么我可以做些什么来解决这个问题呢?
我是否应该使用不同的方法来获取不会被锁定文件的内容阻止的日志文件内容(我不知道锁定的是什么,但是this.Locked = True应该阻止任何记录到的内容存档作业期间的文件)但显然文件上的“锁定”高于我的代码。
这是在Win 7计算机上用C#.NET 4.5编写的Windows服务。
感谢您的帮助。
答案 0 :(得分:0)
我得到了它的工作。我只是遇到了这个问题。锁定在Helper类中并且DLL的其他并发实例被称为忽略它(多线程问题)所以我只是将我的DB Lock检查放入Helper类的Init中,所以它是< / p>
this.Locked = this.GetCurrentLockedStatus();
然后任何进程都会获得相同的值。这意味着在文件传输过程中没有记录,因为我在尝试执行此操作之前添加了LOCK记录并退出任何LogMsg方法
this.Locked = true;
现在它就像一个魅力。不知道为什么旧的服务工作。我可以在事件日志中看到很多I / O错误,但最终它只是出于某种原因设法完成它。这种使用DB来维护锁的方法似乎更好更快。
感谢您的帮助。