Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#创建日志文件的最佳方法_C#_File_Logging - Fatal编程技术网

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

c#创建日志文件的最佳方法,c#,file,logging,C#,File,Logging,我正在编写一个工具,用于检查网络中工作站的运行状况,并根据发现的问题进行修复。我想在应用程序在每台机器上运行其任务/检查时创建一个日志文件。我现在只想让它在一台机器上工作,但最终它会一次性扫描100多台机器(线程化) 创建日志文件的最佳方法是什么? 我正在考虑使用列表在内存中建立日志文件,然后在完成后将其输出到文件中 我只是在想有更好的方法吗?您可能需要使用事件日志!下面是如何从C访问它# 但无论您将使用什么方法,我建议每次在日志中追加内容时都输出到文件,而不是在进程退出时,这样在崩溃或进程被

我正在编写一个工具,用于检查网络中工作站的运行状况,并根据发现的问题进行修复。我想在应用程序在每台机器上运行其任务/检查时创建一个日志文件。我现在只想让它在一台机器上工作,但最终它会一次性扫描100多台机器(线程化)

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

我正在考虑使用
列表
在内存中建立日志文件,然后在完成后将其输出到文件中


我只是在想有更好的方法吗?

您可能需要使用事件日志!下面是如何从C访问它#


但无论您将使用什么方法,我建议每次在日志中追加内容时都输出到文件,而不是在进程退出时,这样在崩溃或进程被终止时就不会丢失数据。

您可以使用库和数据库追加器来收集所有日志信息

您还可以查看内置的.NET跟踪功能。有一组跟踪侦听器允许您输出到日志文件,但您可以将其配置为登录到事件查看器或数据库(或同时登录到所有这些文件)

使用Nlog。它是免费的,允许写入文件、数据库、事件日志和其他20多个目标。 另一个日志框架是log4net(从javalog4j项目移植)。它也是免费的

最佳做法是使用通用日志记录-
因此,您可以稍后将NLog或log4net更改为其他日志框架。

我们对日志进行了大量研究,并确定NLog是最好的日志框架

也看到 我会推荐

您将需要多个日志文件。所以多个文件追加器。此外,您还可以动态创建文件附加器

示例代码:

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
资料来源/良好链接:

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

编辑2:

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
动态切换日志文件的一种方法: Log4Net配置文件支持环境变量:

Environment.SetEnvironmentVariable("log4netFileName", "MyApp.log");
在log4net配置中:

<param name="File" value="${log4netFileName}".log/>

我不会使用第三方库,我会登录到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");
    }
}
private static readonly object Locker=new object();
私有静态XmlDocument_doc=new XmlDocument();
静态void Main(字符串[]参数)
{
如果(File.Exists(“logs.txt”))
_doc.Load(“logs.txt”);
其他的
{
var root=_doc.CreateElement(“主机”);
_doc.AppendChild(根);
}
对于(int i=0;i<100;i++)
{
新线程(新线程开始(DoSomeWork)).Start();
}
}
静态孔隙DoSomeWork()
{
/*
*在这里,您将构建日志消息
*/
日志(“192.168.1.15”,“活着”);
}
静态无效日志(字符串主机名、字符串状态)
{
锁(储物柜)
{
var el=(XmlElement)_doc.DocumentElement.AppendChild(_doc.CreateElement(“主机”);
el.SetAttribute(“主机名”,主机名);
el.AppendChild(_doc.CreateElement(“State”)).InnerText=State;
_doc.Save(“logs.txt”);
}
}
您可以使用:

添加此配置文件


*************************************************************************************
*************************************************************************************

我使用的是线程安全静态类。其主要思想是对列表中的消息进行排队,然后在每个时间段或每个计数器限制内保存到日志文件

重要提示:退出程序时,应强制保存文件(
DirectLog.SaveToFile();
)。(如果列表上还有一些项目)

用法非常简单:
DirectLog.Log(“MyLogMessage”,5)

这是我的代码:

using System;
using System.IO;
using System.Collections.Generic;

namespace Mendi
{

    /// <summary>
    /// class used for logging misc information to log file
    /// written by Mendi Barel
    /// </summary>
    static class DirectLog
    {
        readonly static int SAVE_PERIOD = 10 * 1000;// period=10 seconds
        readonly static int SAVE_COUNTER = 1000;// save after 1000 messages
        readonly static int MIN_IMPORTANCE = 0;// log only messages with importance value >=MIN_IMPORTANCE

        readonly static string DIR_LOG_FILES = @"z:\MyFolder\";

        static string _filename = DIR_LOG_FILES + @"Log." + DateTime.Now.ToString("yyMMdd.HHmm") + @".txt";

        readonly static List<string> _list_log = new List<string>();
        readonly static object _locker = new object();
        static int _counter = 0;
        static DateTime _last_save = DateTime.Now;

        public static void NewFile()
        {//new file is created because filename changed
            SaveToFile();
            lock (_locker)
            {

                _filename = DIR_LOG_FILES + @"Log." + DateTime.Now.ToString("yyMMdd.HHmm") + @".txt";
                _counter = 0;
            }
        }
        public static void Log(string LogMessage, int Importance)
        {
            if (Importance < MIN_IMPORTANCE) return;
            lock (_locker)
            {
                _list_log.Add(String.Format("{0:HH:mm:ss.ffff},{1},{2}", DateTime.Now, LogMessage, Importance));
                _counter++;
            }
            TimeSpan timeDiff = DateTime.Now - _last_save;

            if (_counter > SAVE_COUNTER || timeDiff.TotalMilliseconds > SAVE_PERIOD)
                SaveToFile();
        }

        public static void SaveToFile()
        {
            lock (_locker)
                if (_list_log.Count == 0)
                {
                    _last_save = _last_save = DateTime.Now;
                    return;
                }
            lock (_locker)
            {
                using (StreamWriter logfile = File.AppendText(_filename))
                {

                    foreach (string s in _list_log) logfile.WriteLine(s);
                    logfile.Flush();
                    logfile.Close();
                }

                _list_log.Clear();
                _counter = 0;
                _last_save = DateTime.Now;
            }
        }


        public static void ReadLog(string logfile)
        {
            using (StreamReader r = File.OpenText(logfile))
            {
                string line;
                while ((line = r.ReadLine()) != null)
                {
                    Console.WriteLine(line);
                }
                r.Close();
            }
        }
    }
}
使用系统;
使用System.IO;
使用System.Collections.Generic;
名称空间门迪
{
/// 
///用于将杂项信息记录到日志文件的类
///作者:门迪·巴雷尔
/// 
静态类DirectLog
{
只读静态整型保存周期=10*1000;//周期=10秒
只读静态int SAVE_COUNTER=1000;//1000条消息后保存
只读静态int MIN\u重要性=0;//只记录重要性值>=MIN\u重要性的消息
只读静态字符串DIR_LOG_FILES=@“z:\MyFolder\”;
静态字符串\u filename=DIR\u LOG\u FILES++“LOG.”+DateTime.Now.ToString(“yyMMdd.HHmm”)++.txt”;
只读静态列表_List_log=new List();
只读静态对象_locker=新对象();
静态int_计数器=0;
静态日期时间_last_save=DateTime.Now;
公共静态void NewFile()
{//由于文件名已更改,因此创建了新文件
SaveToFile();
锁(储物柜)
{
_filename=DIR_LOG_FILES++“LOG.”+DateTime.Now.ToString(“yyMMdd.HHmm”)++.txt;
_计数器=0;
}
}
公共静态无效日志(字符串日志消息,int重要性)
{
if(重要性<最小重要性)返回;
锁(储物柜)
{
_list_log.Add(String.Format(“{0:HH:mm:ss.ffff},{1},{2}”,DateTime.Now,LogMessage,重要性));
_计数器++;
}
TimeSpan timeDiff=DateTime.Now-\u last\u save;
如果(_计数器>保存_计数器| | timeDiff.total毫秒>保存_周期)
SaveToFile();
}
公共静态void SaveToFile()
{
using System;
using System.IO;
using System.Collections.Generic;

namespace Mendi
{

    /// <summary>
    /// class used for logging misc information to log file
    /// written by Mendi Barel
    /// </summary>
    static class DirectLog
    {
        readonly static int SAVE_PERIOD = 10 * 1000;// period=10 seconds
        readonly static int SAVE_COUNTER = 1000;// save after 1000 messages
        readonly static int MIN_IMPORTANCE = 0;// log only messages with importance value >=MIN_IMPORTANCE

        readonly static string DIR_LOG_FILES = @"z:\MyFolder\";

        static string _filename = DIR_LOG_FILES + @"Log." + DateTime.Now.ToString("yyMMdd.HHmm") + @".txt";

        readonly static List<string> _list_log = new List<string>();
        readonly static object _locker = new object();
        static int _counter = 0;
        static DateTime _last_save = DateTime.Now;

        public static void NewFile()
        {//new file is created because filename changed
            SaveToFile();
            lock (_locker)
            {

                _filename = DIR_LOG_FILES + @"Log." + DateTime.Now.ToString("yyMMdd.HHmm") + @".txt";
                _counter = 0;
            }
        }
        public static void Log(string LogMessage, int Importance)
        {
            if (Importance < MIN_IMPORTANCE) return;
            lock (_locker)
            {
                _list_log.Add(String.Format("{0:HH:mm:ss.ffff},{1},{2}", DateTime.Now, LogMessage, Importance));
                _counter++;
            }
            TimeSpan timeDiff = DateTime.Now - _last_save;

            if (_counter > SAVE_COUNTER || timeDiff.TotalMilliseconds > SAVE_PERIOD)
                SaveToFile();
        }

        public static void SaveToFile()
        {
            lock (_locker)
                if (_list_log.Count == 0)
                {
                    _last_save = _last_save = DateTime.Now;
                    return;
                }
            lock (_locker)
            {
                using (StreamWriter logfile = File.AppendText(_filename))
                {

                    foreach (string s in _list_log) logfile.WriteLine(s);
                    logfile.Flush();
                    logfile.Close();
                }

                _list_log.Clear();
                _counter = 0;
                _last_save = DateTime.Now;
            }
        }


        public static void ReadLog(string logfile)
        {
            using (StreamReader r = File.OpenText(logfile))
            {
                string line;
                while ((line = r.ReadLine()) != null)
                {
                    Console.WriteLine(line);
                }
                r.Close();
            }
        }
    }
}
using System;
using System.IO;

namespace YOURNAMESPACEHERE
{
    enum LogEvent
    {
        Info = 0,
        Success = 1,
        Warning = 2,
        Error = 3
    }

    internal static class Log
    {
        private static readonly string LogSession = DateTime.Now.ToLocalTime().ToString("ddMMyyyy_HHmmss");
        private static readonly string LogPath = AppDomain.CurrentDomain.BaseDirectory + "logs";

        internal static void Write(LogEvent Level, string Message, bool ShowConsole = true, bool WritelogFile = true)
        {
            string Event = string.Empty;
            ConsoleColor ColorEvent = Console.ForegroundColor;

            switch (Level)
            {
                case LogEvent.Info:
                    Event = "INFO";
                    ColorEvent = ConsoleColor.White;
                    break;
                case LogEvent.Success:
                    Event = "SUCCESS";
                    ColorEvent = ConsoleColor.Green;
                    break;
                case LogEvent.Warning:
                    Event = "WARNING";
                    ColorEvent = ConsoleColor.Yellow;
                    break;
                case LogEvent.Error:
                    Event = "ERROR";
                    ColorEvent = ConsoleColor.Red;
                    break;
            }

            if (ShowConsole)
            {
                Console.ForegroundColor = ColorEvent;
                Console.WriteLine(" [{0}] => {1}", DateTime.Now.ToString("HH:mm:ss"), Message);
                Console.ResetColor();
            }

            if (WritelogFile)
            {
                if (!Directory.Exists(LogPath))
                    Directory.CreateDirectory(LogPath);

                File.AppendAllText(LogPath + @"\" + LogSession + ".log", string.Format("[{0}] => {1}: {2}\n", DateTime.Now.ToString("HH:mm:ss"), Event, Message));
            }
        }
    }
}
using System;
using System.IO;

namespace YOURNAMESPACEHERE
{
    enum LogEvent
    {
        Info = 0,
        Success = 1,
        Warning = 2,
        Error = 3
    }

internal static class Log
{
    private static readonly string LogSession = DateTime.Now.ToLocalTime().ToString("ddMMyyyy_HHmmss");
    private static readonly string LogPath = AppDomain.CurrentDomain.BaseDirectory + "logs";

    internal static void Write(LogEvent Level, string Message)
    {
        string Event = string.Empty;

        switch (Level)
        {
            case LogEvent.Info:
                Event = "INFO";
                break;
            case LogEvent.Success:
                Event = "SUCCESS";
                break;
            case LogEvent.Warning:
                Event = "WARNING";
                break;
            case LogEvent.Error:
                Event = "ERROR";
                break;
        }

        if (!Directory.Exists(LogPath))
            Directory.CreateDirectory(LogPath);

        File.AppendAllText(LogPath + @"\" + LogSession + ".log", string.Format("[{0}] => {1}: {2}\n", DateTime.Now.ToString("HH:mm:ss"), Event, Message));
    }
}
Log.Write(LogEvent.Info, "Test message"); // It will print an info in your console, also will save a copy of this print in a .log file.
Log.Write(LogEvent.Warning, "Test message", false); // It will save the print as warning only in your .log file.
Log.Write(LogEvent.Error, "Test message", true, false); // It will print an error only in your console.
Log.Write(LogEvent.Info, "Test message"); // It will print an info in your .log file.