GeekZilla
TraceListener creates huge log files
If you've used the .Net trace listeners, you'll know that they just keep appending to the file specified in the App.Config file, this can lead to some massive log files! Here's a simple TraceListener that logs to a new file for every day.
using System; using System.Text; using System.IO; using System.Diagnostics; namespace myNamespace { public class DailyTraceListener : TraceListener { private string _LogFileLocation = ""; private DateTime _CurrentDate; StreamWriter _TraceWriter; public DailyTraceListener(string FileName) { _LogFileLocation = FileName; _TraceWriter = new StreamWriter(GenerateFileName(), true); } public override void Write(string message) { CheckRollover(); _TraceWriter.Write(message); } public override void Write(string message, string category) { CheckRollover(); _TraceWriter.Write(category + " " + message); } public override void WriteLine(string message) { CheckRollover(); StringBuilder sb = new StringBuilder(); sb.Append(DateTime.Now); sb.Append("##"); sb.Append(Process.GetCurrentProcess().Id); sb.Append("##"); sb.Append(AppDomain.GetCurrentThreadId()); sb.Append("##"); sb.Append(message); _TraceWriter.WriteLine(sb.ToString()); } public override void WriteLine(string message, string category) { CheckRollover(); StringBuilder sb = new StringBuilder(); sb.Append(DateTime.Now); sb.Append("##"); sb.Append(Process.GetCurrentProcess().Id); sb.Append("##"); sb.Append(AppDomain.GetCurrentThreadId()); sb.Append("##"); sb.Append(category); sb.Append("##"); sb.Append(message); _TraceWriter.WriteLine(sb.ToString()); } private string GenerateFileName() { _CurrentDate = DateTime.Today; return Path.Combine(Path.GetDirectoryName(_LogFileLocation), Path.GetFileNameWithoutExtension(_LogFileLocation) + "_" + _CurrentDate.ToString("yyyyMMdd") + Path.GetExtension(_LogFileLocation)); } private void CheckRollover() { if (_CurrentDate.CompareTo(DateTime.Today) != 0) { _TraceWriter.Close(); _TraceWriter = new StreamWriter(GenerateFileName(),true); } } public override void Flush() { lock(this) { if (_TraceWriter != null) { _TraceWriter.Flush(); } } } protected override void Dispose(bool disposing) { if (disposing) { _TraceWriter.Close(); } } } }
You can configure this by amending the App.Config file:
<system.diagnostics> <trace autoflush="true" indentsize="4"> <listeners> <add name="myListener" type="myNamespace.DailyTraceListener" initializeData="e:\logfiles\mylogfile.log" /> </listeners> </trace> </system.diagnostics>
So on the day of this submission this would create a file in e:\logfiles called mylogfile_20060726.log.
Author Lee Keable
Comments
splitDiff
said:
' Here is a VB.Net version of your Daily Trace Listener.
' Thanks -- splitDiff
Imports System
Imports System.Text
Imports System.Threading
Imports System.IO
Imports System.Diagnostics
Public Class DailyTraceListener
Inherits TraceListener
Dim _LogFileLocation As String = ""
Dim _CurrentDate As DateTime
Dim _TraceWriter As StreamWriter
Public Sub DailyTraceListener(ByVal FileName As String)
_LogFileLocation = FileName
_TraceWriter = New StreamWriter(GenerateFileName(), True)
End Sub
Public Overrides Sub Write(ByVal message As String)
CheckRollover()
_TraceWriter.Write(message)
End Sub
Public Overrides Sub Write(ByVal message As String, ByVal category As String)
CheckRollover()
_TraceWriter.Write(category + " " + message)
End Sub
Public Overrides Sub WriteLine(ByVal message As String)
CheckRollover()
Dim sb As StringBuilder = New StringBuilder()
sb.Append(DateTime.Now)
sb.Append("##")
sb.Append(Process.GetCurrentProcess().Id)
sb.Append("##")
sb.Append(Thread.CurrentThread.ManagedThreadId().ToString())
sb.Append("##")
sb.Append(message)
_TraceWriter.WriteLine(sb.ToString())
End Sub
Public Overrides Sub WriteLine(ByVal message As String, ByVal category As String)
CheckRollover()
Dim sb As StringBuilder = New StringBuilder()
sb.Append(DateTime.Now)
sb.Append("##")
sb.Append(Process.GetCurrentProcess().Id)
sb.Append("##")
sb.Append(AppDomain.GetCurrentThreadId())
sb.Append("##")
sb.Append(category)
sb.Append("##")
sb.Append(message)
_TraceWriter.WriteLine(sb.ToString())
End Sub
Private Function GenerateFileName() As String
Dim _CurrentDate As Date = DateTime.Today
Return Path.Combine(Path.GetDirectoryName(_LogFileLocation), Path.GetFileNameWithoutExtension(_LogFileLocation) + "_" + _CurrentDate.ToString("yyyyMMdd") + Path.GetExtension(_LogFileLocation))
End Function
Private Sub CheckRollover()
If (_CurrentDate.CompareTo(DateTime.Today) <> 0) Then
_TraceWriter.Close()
_TraceWriter = New StreamWriter(GenerateFileName(), True)
End If
End Sub
Public Overrides Sub Flush()
SyncLock (Me)
If Not (_TraceWriter Is Nothing) Then
_TraceWriter.Flush()
End If
End SyncLock
End Sub
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
If (disposing) Then
_TraceWriter.Close()
End If
End Sub
End Class
Dev1
said:
I get the following error:
"Couldn't find type for class namespace.DailyTraceListener."
