我正在编写一个工具,用于检查网络中所有工作站的健康状况,并根据发现的问题进行修复。我想在应用程序运行时,在每台机器上执行任务/检查时创建日志文件。目前我只想在单台机器上让它工作,但随着时间的推移,它将一次扫描100多台机器(线程化)。
创建日志文件的最佳方式是什么?
我考虑使用 List<string>
在内存中构建日志文件,然后在完成后将其输出到文件中。
我在思考是否有更好的方法来处理这个问题?
我正在编写一个工具,用于检查网络中所有工作站的健康状况,并根据发现的问题进行修复。我想在应用程序运行时,在每台机器上执行任务/检查时创建日志文件。目前我只想在单台机器上让它工作,但随着时间的推移,它将一次扫描100多台机器(线程化)。
创建日志文件的最佳方式是什么?
我考虑使用 List<string>
在内存中构建日志文件,然后在完成后将其输出到文件中。
我在思考是否有更好的方法来处理这个问题?
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: 使用编程方式指定多个记录器(具有多个文件附加器)
此外,log4net还允许写入事件日志。一切都是基于配置的,并且配置也可以在运行时动态地从xml加载。
编辑2:
切换日志文件的一种方法: Log4Net配置文件支持环境变量:
Environment.SetEnvironmentVariable("log4netFileName", "MyApp.log");
<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");
}
}
File.AppendAllLines
将其转储为简单的分隔格式并继续使用。通过输出平面文本,无需保留任何内容在内存中或重新读取文件,只需将一些行附加到文件末尾并继续前进。 - Sephusing System;
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)
{
XmlConfigurator.Configure(new System.IO.FileInfo(@"..\..\resources\log4net.config"));
log.Info("Entering application.");
Console.WriteLine("starting.........");
log.Info("Entering application.");
log.Error("Exiting application.");
Console.WriteLine("starting.........");
}
}
请添加此配置文件
*************************************************************************************
<!--Configuration for file appender-->
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="logfile.txt" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d [%t] %-5p [%logger] - %m%n" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="FileAppender" />
</root>
</log4net>
</configuration>
*************************************************************************************
<!--Configuration for console appender-->
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,
log4net" />
</configSections>
<log4net>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p [%logger] - %m%n" />
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="ConsoleAppender" />
</root>
</log4net>
</configuration>