简体   繁体   中英

Many instances of the same process writing to the same log file

I am kicking off a number of instances of the same process and the issue is that they all write to the same log file. I know it is not a good practice and was wondering what can I do to avoid possible issues. Here is the procedure I use to write to file:

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

I would appreciate any suggestions/improvements. thanks!

As I have said in my comment, the scenario of multiple access to the same file resource should be handled carefully and probably the best solution is to use a well tested log library like Log4Net or NLog .

In any case you could improve your code in a couple of point

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

I have removed all the part that check if file exists and then create it. This is not necessary because as the documentation explains, File.Append is the same that calling StreamWriter(file, true) and this means that if the file doesn't exist it will be created.

Next, to try to handle possible collision with other process writing to the same file concurrently, I have added a retry loop that could get access to the log file just after another process finishes. (this is really a poor-man solution but then it is better to use a well tested library)

It is important to enclose the opening and writing of the file inside a using statement that closes and disposes the Stream also in case of exceptions. This is mandatory to be sure to leave the file always closed for the other processes to work.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM