首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TextWriterTraceListener类

TextWriterTraceListener类
EN

Code Review用户
提问于 2011-05-08 02:10:52
回答 2查看 1.4K关注 0票数 4

我需要扩展默认的TextWriterTraceListener类,以包含时间戳,在相同的行和文件旋转中的每个消息。我似乎找不到用TraceListener配置做这件事的方法。

请您检查一下,让我知道在多线程应用程序中使用的任何缺陷吗?

代码语言:javascript
运行
复制
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"));
        }
    }
}
EN

回答 2

Code Review用户

发布于 2011-05-09 21:53:07

可能出现的问题

1遵循风格指南。camel的局部变量名是常见的惯例。

var theFile = new FileInfo(...)而不是var TheFile = new FileInfo(...)

将文件的格式设置为相同的格式(即,所有方法都用空行分隔,或者没有)。

2保持行短,并使用更多的变量来获得更好的可读性和更容易调试:

代码语言:javascript
运行
复制
var newPath = Path.Combine(file.DirectoryName, file.Name, file.LastWriteTime.ToString(), file.Extension)
file.MoveTo(newPath);

而不是

代码语言:javascript
运行
复制
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,您会做什么?这同样适用于TheFileInfoConsoleApplication1

4删除冗余限定符以消除杂乱。

代码语言:javascript
运行
复制
public MyTextWriterTraceListener(Stream stream) : base(stream) { }

而不是

代码语言:javascript
运行
复制
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声明采用同样的程序:

代码语言:javascript
运行
复制
if (TheFileInfo.LastWriteTime.Date >= DateTime.Today) return;

而不是

代码语言:javascript
运行
复制
if (TheFileInfo.LastWriteTime.Date < DateTime.Today) { ... }

一般建议

1正如k3b所提到的,我也建议使用log4net。它具有您所需要的更大的灵活性,您可以通过配置文件配置它,这意味着您可以更改日志输出而无需重新编译。

票数 5
EN

Code Review用户

发布于 2011-05-08 10:15:15

在我看来,代码是可以的。

可能有一些小问题

  • 只在MyTextWriterTraceListener的构造函数中调用旋转日志文件。因此,如果您正在跟踪长期运行的应用程序(即服务),则根本不旋转日志文件。
  • 只有书面形式才调用带有dateTime的dateTime。如果用几条写语句构造行,前缀可能会出现错误。
  • RotateLogFiles的格式移除文件扩展string.Format(@"{0}\{1}_{2}{}",最后一个参数{}应该是{3}。我更喜欢使用Path.Combine方法来验证文件名的有效性,而不是string.Format。

我个人更喜欢使用log4net进行日志记录,这已经支持您的自制功能(日期时间前缀、文件名-旋转)。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/2305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档