我需要扩展默认的TextWriterTraceListener
类,以包含时间戳,在相同的行和文件旋转中的每个消息。我似乎找不到用TraceListener
配置做这件事的方法。
请您检查一下,让我知道在多线程应用程序中使用的任何缺陷吗?
using System;
using System.Collections.Generic;
using System.IO;
using System.Diagnostics;
using System.Text;
namespace ConsoleApplication1
{
public class MyTextWriterTraceListener : TextWriterTraceListener
{
public MyTextWriterTraceListener(System.IO.Stream stream) : base(stream) { }
public MyTextWriterTraceListener(System.IO.Stream stream, string name) : base(stream, name) { }
public MyTextWriterTraceListener(string FileName, string name) : base(FileName, name) { RotateLogFiles(FileName); }
public MyTextWriterTraceListener(string FileName) : base(FileName) { RotateLogFiles(FileName); }
public MyTextWriterTraceListener(System.IO.TextWriter writer, string name) : base(writer, name) { }
public MyTextWriterTraceListener(System.IO.TextWriter writer) : base(writer) { }
public override void Write(string Msg)
{
base.Write(Msg);
base.Flush();
}
public override void WriteLine(string Msg)
{
base.WriteLine(LinePrefix() + Msg);
base.Flush();
}
private void RotateLogFiles(string FileName)
{
FileInfo TheFileInfo = new FileInfo(FileName);
if (TheFileInfo.Exists == false)
return;
if (TheFileInfo.LastWriteTime.Date < DateTime.Today)
{
TheFileInfo.MoveTo(string.Format(@"{0}\{1}_{2}{}", TheFileInfo.DirectoryName, TheFileInfo.Name, TheFileInfo.LastWriteTime.ToString(), TheFileInfo.Extension));
}
}
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
private string LinePrefix()
{
DateTime Now = DateTime.Now;
return string.Format("{0} : ", Now.ToString("dd-MMM-yyyy HH:mm:ss"));
}
}
}
发布于 2011-05-09 21:53:07
1遵循风格指南。camel的局部变量名是常见的惯例。
var theFile = new FileInfo(...)
而不是var TheFile = new FileInfo(...)
。
将文件的格式设置为相同的格式(即,所有方法都用空行分隔,或者没有)。
2保持行短,并使用更多的变量来获得更好的可读性和更容易调试:
var newPath = Path.Combine(file.DirectoryName, file.Name, file.LastWriteTime.ToString(), file.Extension)
file.MoveTo(newPath);
而不是
TheFileInfo.MoveTo(string.Format(@"{0}\{1}_{2}{}", TheFileInfo.DirectoryName, TheFileInfo.Name, TheFileInfo.LastWriteTime.ToString(), TheFileInfo.Extension));
3使用有意义的名称。
RollingTextWriterTraceListener
而不是MyTextWriterTraceListener
[MethodImpl(MethodImplOptions.NoInlining)]
而不是[System[...]NoInlining)]
如果您需要另一个实现-- MyOtherTextWriterTraceListener
,您会做什么?这同样适用于TheFileInfo
,ConsoleApplication1
。
4删除冗余限定符以消除杂乱。
public MyTextWriterTraceListener(Stream stream) : base(stream) { }
而不是
public MyTextWriterTraceListener(System.IO.Stream stream) : base(stream) { }
var file = new FileInfo(...)
而不是FileInfo file = new FileInfo(...)
你确定你需要[MethodImpl(MethodImplOptions.NoInlining)]
属性吗?
1个if (TheFileInfo.Exists == false) return;
因为返回语句减少了嵌套(参见箭头头反模式)和== false
,因为它比!TheFileInfo.Exists
更明显。一个孤独的!
可以很快被监管。我也建议对以下if声明采用同样的程序:
if (TheFileInfo.LastWriteTime.Date >= DateTime.Today) return;
而不是
if (TheFileInfo.LastWriteTime.Date < DateTime.Today) { ... }
1正如k3b所提到的,我也建议使用log4net。它具有您所需要的更大的灵活性,您可以通过配置文件配置它,这意味着您可以更改日志输出而无需重新编译。
发布于 2011-05-08 10:15:15
在我看来,代码是可以的。
可能有一些小问题
string.Format(@"{0}\{1}_{2}{}"
,最后一个参数{}应该是{3}。我更喜欢使用Path.Combine方法来验证文件名的有效性,而不是string.Format。我个人更喜欢使用log4net进行日志记录,这已经支持您的自制功能(日期时间前缀、文件名-旋转)。
https://codereview.stackexchange.com/questions/2305
复制相似问题