我正在开启同一进程的多个实例,问题是它们都写入同一个日志文件。我知道这不是一个好习惯,并且想知道我该怎么做以避免可能出现的问题。这是我用来写入文件的过程:
Sub WriteToErrorLog(ByVal Msg As String)
Dim path As String
path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)
Dim strFile As String = System.IO.Path.Combine(path, "Log_" & DateTime.Today.ToString("dd-MMM-yyyy") & ".txt")
Dim sw As StreamWriter
Dim fs As FileStream = Nothing
Try
If (Not File.Exists(strFile)) Then
fs = File.Create(strFile)
fs.Close()
End If
sw = File.AppendText(strFile)
sw.WriteLine(Msg & vbcrlf)
Catch ex As Exception
MsgBox("Error Creating Log File")
MsgBox(ex.Message & " - " & ex.StackTrace)
Finally
sw.Close()
End Try
End Sub
我将不胜感激任何建议/改进。谢谢!
答案 0 :(得分:0)
正如我在评论中所说,应该谨慎处理多个访问同一文件资源的情况,最好的解决方案是使用经过良好测试的日志库,如Log4Net或NLog 。
在任何情况下,您都可以在几点内改进代码
Sub WriteToErrorLog(ByVal Msg As String)
Dim path As String
path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)
Dim strFile As String = System.IO.Path.Combine(path, "Log_" & DateTime.Today.ToString("dd-MMM-yyyy") & ".txt")
Dim retry as Integer = 3 ' this could be changed if you experience a lot of collisions.'
Dim sw As StreamWriter = Nothing
While retry > 0
Try
Using sw = File.AppendText(strFile)
sw.WriteLine(Msg & vbcrlf)
End Using
Exit While
Catch ex as Exception
retry -= 1
End Try
End While
' If retry has reached zero then we have exausted our tentatives and give up....'
if retry = 0 Then
MessageBox.Show("Error writing to Log File")
End if
End Sub
我删除了检查文件是否存在的所有部分,然后创建它。这不是必需的,因为正如文档所解释的那样,File.Append与调用StreamWriter(文件,true)相同,这意味着如果文件不存在则会创建它。
接下来,为了尝试处理与其他进程同时写入同一文件的可能冲突,我添加了一个重试循环,可以在另一个进程完成后立即访问日志文件。 (这实际上是一个穷人的解决方案,但最好是使用经过良好测试的库)
将文件的打开和写入包含在using语句中是很重要的,该语句在异常情况下也会关闭并处理Stream。这是必须的,以确保始终关闭文件以使其他进程起作用。