4

当我遇到一篇文章(http://www.daveoncsharp.com/2009/09/create-a-logger-using-the-trace-listener-in-时,我正在寻找一种解决方案来为我的最新项目提供日志记录) csharp/ ) 讨论了使用 System.Diagnostics 和 App.config 通过 Trace 方法进行日志记录。我能够成功地实现类和 App.config,但我真的希望能够动态分配日志文件的值/位置(在 initializeData 中),但我不知道该怎么做. 如果您有任何建议,请随时发表!

应用程序配置:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.diagnostics>
    <trace autoflush="true" indentsize="4">
      <listeners>
        <add name="myListener" 
             type="System.Diagnostics.TextWriterTraceListener" 
             initializeData="fileSizeThreshold=512, fileSizeUnit=kilobytes, 
             fileAgeThreshold=1, fileAgeUnit=months, fileNameTemplate='{0}\MyApp-{1:MMM-yy}.log'"/>
        <remove name="Default" />
      </listeners>
    </trace>
  </system.diagnostics>
</configuration>

记录器类:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;


namespace MyCurrentProject
{
    class Logger
    {
        public void Error(string module, string message)
        {
            WriteEntry(message, "ERROR:", module);
        }

        public void Error(Exception ex, string module)
        {
            WriteEntry(ex.Message, "ERROR:", module);
        }

        public void Warning(string module, string message)
        {
            WriteEntry(message, "WARNING:", module);
        }

        public void Info(string module, string message)
        {
            WriteEntry(message, "INFO:", module);
        }

        private void WriteEntry(string message, string type, string module)
        {
            Trace.WriteLine(
                    string.Format("{0} {1} [{2}] {3}",
                                  DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                                  type,
                                  module,
                                  message));
        }
    }
}

RE:抱歉不清楚...只是为了清楚起见,我需要动态设置保存日志文件输出的文件路径。我想要保存到 %AppData% 中某个位置的路径。我在配置中遇到的问题是,一旦我为“initializeData”设置了值,我就找不到更改或动态设置/重置该值的方法。说实话...在这一点上,我只想要一个可行的解决方案,并允许我管理日志文件的位置。

4

2 回答 2

6

这是一个使用 Systems.Diagnostics 的工作示例,它与非基类库相比有两个优点。它总是被允许的(在大型组织中),总是可用的,并且在开发人员熟悉基类库的范围内,下一批维护开发人员会听说过它。

using System.Diagnostics;

namespace DynamicTraceLog
{
    class Program
    {
        static void Main(string[] args)
        {
            //Use TraceSource, not Trace, they are easier to turn off
            TraceSource trace = new TraceSource("app");
            //SourceSwitches allow you to turn the tracing on and off.
            SourceSwitch level =new SourceSwitch("app");
            //I assume you want to be dynamic, so probalby some user input would be here:
            if(args.Length>0 && args[0]=="Off")
                level.Level= SourceLevels.Off;
            else
                level.Level = SourceLevels.Verbose;
            trace.Switch = level;
            //remove default listner to improve performance
            trace.Listeners.Clear();
            //Listeners implement IDisposable
            using (TextWriterTraceListener file = new TextWriterTraceListener("log.txt"))
            using (ConsoleTraceListener console = new ConsoleTraceListener())
            {
                //The file will likely be in /bin/Debug/log.txt
                trace.Listeners.Add(file);
                //So you can see the results in screen
                trace.Listeners.Add(console);
                //Now trace, the console trace appears immediately.
                trace.TraceInformation("Hello world");
                //File buffers, it flushes on Dispose or when you say so.
                file.Flush();
            }
            System.Console.ReadKey();
        }
    }
}

回复:如何 格式化输出 对于使用 Systems.Diagnostics 类实现模板化跟踪格式化/输出的跟踪侦听器尝试这两种方法中的任何一种:http: //essentialdiagnostics.codeplex.comhttp://ukadcdiagnostics.codeplex.com/Systems 。诊断不提供标准令牌的任何特定格式或输出。

于 2012-10-11T00:54:15.907 回答
1

我知道我可能会因此而被否决,但我要离开牧场一分钟,我会建议你使用与工具箱不同的工具。Log4Net是一个非常强大且简洁的日志框架。例如,下面是一个使用它的控制台应用程序,它功能齐全,如您所见。

using Com.Foo;

// Import log4net classes.
using log4net;
using log4net.Config;

public class MyApp 
{
    // Define a static logger variable so that it references the
    // Logger instance named "MyApp".
    private static readonly ILog log = LogManager.GetLogger(typeof(MyApp));

    static void Main(string[] args) 
    {
        // Set up a simple configuration that logs on the console.
        BasicConfigurator.Configure();

        log.Info("Entering application.");
        Bar bar = new Bar();
        bar.DoIt();
        log.Info("Exiting application.");
    }
}

但是假设我们想用一个配置文件来做到这一点,就像你暗示你想要使用的那样。嗯,这很简单!下面是我们App.config为了完成同样的事情而放置的配置:

<log4net>
    <!-- A1 is set to be a ConsoleAppender -->
    <appender name="A1" type="log4net.Appender.ConsoleAppender">

        <!-- A1 uses PatternLayout -->
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%-4timestamp [%thread] %-5level %logger %ndc - %message%newline" />
        </layout>
    </appender>

    <!-- Set root logger level to DEBUG and its only appender to A1 -->
    <root>
        <level value="DEBUG" />
        <appender-ref ref="A1" />
    </root>
</log4net>

然后可以像这样使用该配置:

using Com.Foo;

// Import log4net classes.
using log4net;
using log4net.Config;

public class MyApp 
{
    private static readonly ILog log = LogManager.GetLogger(typeof(MyApp));

    static void Main(string[] args) 
    {
        // BasicConfigurator replaced with XmlConfigurator.
        XmlConfigurator.Configure(new System.IO.FileInfo(args[0]));

        log.Info("Entering application.");
        Bar bar = new Bar();
        bar.DoIt();
        log.Info("Exiting application.");
    }
}

并且不要让模式的东西让你措手不及,它只是配置你在上面编码的内容,这样你就可以在消息中保持一些一致性。但它确实很容易,因为您所需要记录的只是需要插入到模式中的信息,然后将模式封装掉。


这是 Log4Net 中的速成课程,但我真正推荐它的原因是因为在上面的两个示例中,您看到它们登录到控制台,但是您有无数可能的记录器,只需查看以下列表:

log4net.Appender.AdoNetAppender:使用准备好的语句或存储过程将日志记录事件写入数据库。

log4net.Appender.AnsiColorTerminalAppender:将颜色突出显示的日志事件写入 ANSI 终端窗口。

log4net.Appender.AspNetTraceAppender:将日志记录事件写入 ASP 跟踪上下文。然后可以在 ASP 页的末尾或在 ASP 跟踪页上呈现这些。

log4net.Appender.ColoredConsoleAppender:将颜色突出显示的日志事件写入应用程序的 Windows 控制台。

log4net.Appender.ConsoleAppender:将日志记录事件写入应用程序的控制台。事件可能会进入标准我们的流或标准错误流。

log4net.Appender.DebugAppender:将日志事件写入 .NET 系统。

log4net.Appender.EventLogAppender:将日志记录事件写入 Windows 事件日志。

log4net.Appender.FileAppender:将日志记录事件写入文件系统中的文件。

log4net.Appender.LocalSyslogAppender:将日志记录事件写入本地 syslog 服务(仅限 UNIX)。

log4net.Appender.MemoryAppender:将日志记录事件存储在内存缓冲区中。

log4net.Appender.NetSendAppender:将日志事件写入 Windows Messenger 服务。这些消息显示在用户终端的对话框中。

log4net.Appender.OutputDebugStringAppender:将日志事件写入调试器。如果应用程序没有调试器,系统调试器会显示该字符串。如果应用程序没有调试器并且系统调试器未激活,则忽略该消息。

log4net.Appender.RemoteSyslogAppender:使用 UDP 网络将日志记录事件写入远程 syslog 服务。

log4net.Appender.RemotingAppender:使用 .NET 远程处理将日志记录事件写入远程接收器。

log4net.Appender.RollingFileAppender:将日志记录事件写入文件系统中的文件。RollingFileAppender 可以配置为根据日期或文件大小限制记录到多个文件。

log4net.Appender.SmtpAppender:将日志记录事件发送到电子邮件地址。

log4net.Appender.SmtpPickupDirAppender:将日志记录事件发送到电子邮件地址,但将电子邮件写入可配置目录,而不是直接通过 SMTP 发送。

log4net.Appender.TelnetAppender:客户端通过 Telnet 连接以接收日志记录事件。

log4net.Appender.TraceAppender:将日志记录事件写入 .NET 跟踪系统。

log4net.Appender.UdpAppender:使用 UdpClient 将日志事件作为无连接 UDP 数据报发送到远程主机或多播组。


所以,正如你所见,它是非常强大的OOB。我希望这篇文章对您有所帮助。

于 2012-10-10T01:43:38.317 回答