写入同一日志文件的同一进程的许多实例

时间:2015-02-09 21:07:08

标签: vb.net file append

我正在开启同一进程的多个实例,问题是它们都写入同一个日志文件。我知道这不是一个好习惯,并且想知道我该怎么做以避免可能出现的问题。这是我用来写入文件的过程:

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

我将不胜感激任何建议/改进。谢谢!

1 个答案:

答案 0 :(得分:0)

正如我在评论中所说,应该谨慎处理多个访问同一文件资源的情况,最好的解决方案是使用经过良好测试的日志库,如Log4NetNLog

在任何情况下,您都可以在几点内改进代码

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。这是必须的,以确保始终关闭文件以使其他进程起作用。