c#创建日志文件的最佳方法

Der*_*rek 32 c# logging file

我正在编写一个工具,它将检查整个网络中工作站的运行状况,并根据发现的问题进行修复.我想创建一个日志文件,因为应用程序正在运行每台计算机上的任务/检查.我现在只想让它在一台机器上运行,但是它会一次扫描100多台机器(螺纹外出).

创建日志文件的最佳方法是什么?

我正在考虑使用a List<string>在内存中构建日志文件,然后在完成后将其输出到文件中.

我只是觉得可能有更好的方法吗?

Ase*_*tam 12

我推荐log4net.

您需要多个日志文件.所以多个文件追加器.另外,您可以动态创建文件追加器.

示例代码:

using log4net;
using log4net.Appender;
using log4net.Layout;
using log4net.Repository.Hierarchy;

// Set the level for a named logger
public static void SetLevel(string loggerName, string levelName)
{
    ILog log = LogManager.GetLogger(loggerName);
    Logger l = (Logger)log.Logger;

    l.Level = l.Hierarchy.LevelMap[levelName];
    }

// Add an appender to a logger
public static void AddAppender(string loggerName, IAppender appender)
{
    ILog log = LogManager.GetLogger(loggerName);
    Logger l = (Logger)log.Logger;

    l.AddAppender(appender);
}

// Create a new file appender
public static IAppender CreateFileAppender(string name, string fileName)
{
    FileAppender appender = new
        FileAppender();
    appender.Name = name;
    appender.File = fileName;
    appender.AppendToFile = true;

    PatternLayout layout = new PatternLayout();
    layout.ConversionPattern = "%d [%t] %-5p %c [%x] - %m%n";
    layout.ActivateOptions();

    appender.Layout = layout;
    appender.ActivateOptions();

    return appender;
}

// In order to set the level for a logger and add an appender reference you
// can then use the following calls:
SetLevel("Log4net.MainForm", "ALL");
AddAppender("Log4net.MainForm", CreateFileAppender("appenderName", "fileName.log"));

// repeat as desired
Run Code Online (Sandbox Code Playgroud)

来源/好链接:

Log4Net:以编程方式指定多个记录器(具有多个文件追加器)

以编程方式添加appender

如何从头开始以编程方式配置log4net(无配置)

此外,log4net还允许写入事件日志.一切都是基于配置的,配置也可以在运行时从xml动态加载.

编辑2:

一种即时切换日志文件的方法:Log4Net配置文件支持环境变量:

Environment.SetEnvironmentVariable("log4netFileName", "MyApp.log");
Run Code Online (Sandbox Code Playgroud)

并在log4net配置中:

<param name="File" value="${log4netFileName}".log/>
Run Code Online (Sandbox Code Playgroud)


cro*_*arp 7

我不会使用第三方库,我会登录到xml文件.

这是一个从不同线程记录到xml文件的代码示例:

private static readonly object Locker = new object();
private static XmlDocument _doc = new XmlDocument();

static void Main(string[] args)
{
    if (File.Exists("logs.txt"))
        _doc.Load("logs.txt");
    else
    {
        var root = _doc.CreateElement("hosts");
        _doc.AppendChild(root);
    }

    for (int i = 0; i < 100; i++)
    {
        new Thread(new ThreadStart(DoSomeWork)).Start();
    }
}

static void DoSomeWork()
{
    /*
     * Here you will build log messages
     */
    Log("192.168.1.15", "alive");
}

static void Log(string hostname, string state)
{
    lock (Locker)
    {
        var el = (XmlElement)_doc.DocumentElement.AppendChild(_doc.CreateElement("host"));
        el.SetAttribute("Hostname", hostname);
        el.AppendChild(_doc.CreateElement("State")).InnerText = state;
        _doc.Save("logs.txt");
    }
}
Run Code Online (Sandbox Code Playgroud)

  • Gareth,如果应用程序崩溃,进程被终止,或计算机重新启动并且每次调用都没有保存日志,那么我们真的遇到了麻烦.关于内存我认为为每个Log(字符串,字符串)调用加载xml文档会花费更多内存(想想大约100个线程). (4认同)
  • 这根本不是一个好主意.如果应用程序在中间崩溃,那么最终将没有锁定文件或带有截断数据的锁定文件. (3认同)
  • -1 - 我不是.Net专家,但看起来你将整个日志文件保存到磁盘,每次调用`Log(string,string)`,不仅是你在内存中维护日志文件的副本在`_doc`中肯定不是一个好主意. (2认同)
  • 无论仅使用 File.AppendAllLines 会发生什么,将其转储为简单的分隔格式并继续。通过输出纯文本,无需在内存中保留任何内容,也无需重新读取文件,只需在文件末尾附加一些行并继续。 (2认同)

Jul*_*ien 5

您可能想要使用事件日志!以下是如何从C#http://support.microsoft.com/kb/307024/en访问它

但无论你将使用哪种方法,我建议每次将某些内容附加到日志而不是进程退出时输出到文件,这样你就不会在崩溃或进程中丢失数据被杀了.


Ale*_*kha 5

使用Nlog http://nlog-project.org/.它是免费的,允许写入文件,数据库,事件日志和其他20多个目标.另一个日志框架是log4net - http://logging.apache.org/log4net/(从java Log4j项目移植).它也是免费的.

最佳实践是使用通用日志记录 - http://commons.apache.org/logging/ 因此您可以稍后将NLog或log4net更改为其他日志记录框架.


Mat*_*son 5

我们对日志记录进行了大量研究,并认为NLog是最好用的.

http://nlog-project.org/

另请参阅log4net与Nloghttp://www.dotnetlogging.com/comparison/